FE

移动端适配

流式布局、响应式、viewport、rem

Posted by nolan on February 26, 2020

为什么要做移动端适配?

在企业生产中,设计师往往会以 640px 的标准尺寸输出视觉稿,但是实际设备宽度不一定是 640px,所以如果只按照视觉稿标注的 px 去实现,就会出现不同宽度设备下的大小样式问题。

适配方案

流式布局

流式布局通常会通过百分比来定义宽度,通过固定 px 值设置高度,大屏幕下有些元素宽度被拉的很长,但高度不变,所以会出现拉伸的情况。

固定宽度

有些项目为了减少前端和设计师的工作量,统一按照 320px 宽度去设计与实现,空出的地方直接留白。

响应式

pc 端网页和移动端代码一套,在代码里判断是移动端还是网页,代码耦合严重和维护比较复杂。

一般都是中小型的门户或者博客类站点这样做,大型网站不建议这样。

设置 viewport 进行缩放

以 320 宽度为基准,进行缩放,最大缩放为 320*1.3 = 416,基本缩放到 416 都就可以兼容 iphone6 plus 的屏幕了,这个方法简单粗暴,又高效。

但会导致有些页面元素会糊的情况。

<meta name="viewport" content="width=device-width, initial-scale=0.86, maximum-scale=3.0, minimum-scale=0.86">

rem

rem(font size of the root element)是指相对于根元素的字体大小的单位。

html{
    font-size:20px;
}
.btn {
    width: 6rem;
    height: 3rem;
    line-height: 3rem;
    font-size: 1.2rem;
    display: inline-block;
    background: #06c;
    color: #fff;
    border-radius: .5rem;
    text-decoration: none;
    text-align: center;
}

一般的做法是:

拿到标准尺寸 640px 的视觉稿,设置 640px 的根元素 font-size 为 20 px,计算此时其他元素的大小(以 rem 为单位)。

通过 js 获取设备宽度后,以 640px 为基准,动态设置 html 根元素的字体大小。

<script type="text/javascript">
  window.addEventListener(('orientationchange' in window ? 'orientationchange' : 'resize'), (function() {
    function c() {
      var d = document.documentElement;
      var cw = d.clientWidth || 750;
      d.style.fontSize = (20 * (cw / 375)) > 40 ? 40 + 'px' : (20 * (cw / 375)) + 'px';
    }
    c();
    return c;
  })(), false);
  </script>

当然,也可以通过媒体查询去设置 font-size,但是只能覆盖主流设备:

html {
    font-size : 20px;
}
@media only screen and (min-width: 401px){
    html {
        font-size: 25px !important;
    }
}
@media only screen and (min-width: 428px){
    html {
        font-size: 26.75px !important;
    }
}
@media only screen and (min-width: 481px){
    html {
        font-size: 30px !important;
    }
}
@media only screen and (min-width: 569px){
    html {
        font-size: 35px !important;
    }
}
@media only screen and (min-width: 641px){
    html {
        font-size: 40px !important;
    }
}