# 移动端适配方案

移动端适配方案有两种，一种主流的rem大法，兼容性好，一种CSS3新的单位vw，兼容性没有rem好，先来介绍一下rem大法

## rem移动端适配

参考腾讯前端 AlloyTeam 团队的[移动前端适配利器rem](http://www.alloyteam.com/2016/03/mobile-web-adaptation-tool-rem/)

rem意思就是根据网页的根元素来设置字体大小，和em（font size of the element）的区别是，em是根据其父元素的字体大小来设置，而rem是根据网页的跟元素（html）来设置字体大小的.

设置html根元素的font-size。一般浏览器默认的字体大小是16px，rem表示就是1rem，如果想设置为12px，那就是0.75rem 现在默认的基本单位是16px，这是一个不太好计算的值，所以一般我们使用100px作为单位，那么rem的换算就是，100px/16px = 6.25,

### viewpoint设置

#### 网易的做法

`initial-scale=1.0,maximum-scale=1.0`，屏幕不缩放，改变font-size的值。

```markup
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
```

因为设计稿都是按照iphone678来设计的，宽度都是750px，所以通常按照750px的宽度动态计算一下font-size。如果就是针对iphone的，可以将font-size设置为625%。

```javascript
function initScreen() {
    if (!/iphone|ios|android|mobile/i.test(navigator.userAgent.toLowerCase())) {
        $('body').css('width', '750px');
    }
    $('html').css('font-size', ($('body').width() / 750 * 625 + '%'));
}
```

#### 手淘的做法

改变屏幕缩放尺寸，为设备像素比dpr的倒数。dpr=2，`initial-scale=0.5`，通过meta标签 读取设备宽度。

```javascript
var scale= 1/ window.devicePixelRatio;
document.querySelector('meta[name='viewport']').setAttribute('content','width=device-width,initial-scale='+scale+'maximum='+scale)
document.documentElement.style.fontSize= document.documentElement.clientWidth / 10 +'px'
```

### media查询设置初值

```css
/* mobile media-query */
html {
    font-size: 312.5%;
}

@media screen and (min-width: 360px) and (max-width: 374px) and (orientation: portrait) {
    html {
        font-size: 351.5%;
    }
}

@media screen and (min-width: 384px) and (max-width: 399px) and (orientation: portrait) {
    html {
        font-size: 375%;
    }
}

@media screen and (min-width: 400px) and (max-width: 413px) and (orientation: portrait) {
    html {
        font-size: 390.625%;
    }
}

@media screen and (min-width: 414px) and (max-width: 431px) and (orientation: portrait) {
    html {
        font-size: 404.3%;
    }
}

@media screen and (min-width: 432px) and (max-width: 479px) and (orientation: portrait) {
    html {
        font-size: 421.875%;
    }
}

@media screen and (min-width: 480px)and (max-width: 639px) and (orientation: portrait) {
    html {
        font-size: 468.75%;
    }
}

@media screen and (min-width: 640px) and (orientation: portrait) {
    html {
        font-size: 625%;
    }
}
```

## vw适配

vw表示窗口大小，单位为百分比，1vw表示窗口大小的1%。根据设计稿，让那个设计稿的宽度为100%，书写的时候就按照 px/设计稿宽度 \* 100vw

**方案一：** 最简单的方案就是所有的布局元素及属性都用VW来做单位，对应关系是： 设计稿 750px------>100vw 那我们书写时计算：(x/750)\*100vw sass:

```css
$vw_base: 750;
@function vw($px) {
    @return ($px / 750) * 100vw
}
```

**方案二**

```css
$vw_fontsize: 750; // iPhone 6尺寸的根元素大小基准值 
@function rem($px) { 
    @return ($px / $vw_fontsize ) * 1rem; 
  }
```

## 1px的问题

**原因**:css中的1px在移动端上因为设备像素比的原因，并不是1px，会显得比较粗。

**解决**: 1. 使用border-image。实现准备好1px的border图片， 2. transform: scale(.5)

## 总结

vw方案目前支持不是很普遍，以后可能会支持比较多，而且使用sass等css预处理器，相对来说比较兼容性不是很好，推荐使用设置font-size，rem作为单位。
