关于移动端适配的实现

477 阅读3分钟

关于移动端适配的实现

平时在PC端,我们一般做的可能就是固定一个中间宽度,然后用媒介查询去做响应式之类的操作。但是,在移动端设备上,由于市面上机型的屏幕宽度非常多,我这里就总结一下适配的方案。

移动端适配,就是在不同宽度设备的屏幕上,显示正常,而不会漏出空白或溢出等,看看效果:

nicee.gif

可以看到上图,图片和标题都是随着屏幕的大小改变的,适配的方式主要有两种。

Rem布局

rem布局主要是利用1rem等于根节点大小来实现的,通过屏幕宽度来动态改变根字体大小,从而实现不同屏幕的适配:

假设我们根据设计宽度为375px来,可以得出1rem对应的根字体大小应为:

html { font-size: 1px; }
body { font-size: 16px; }   // 因为html字体会影响其他的,所以body重置为默认大小

这样,1vw就对应1px大小了,但是rem的大小并不会随着屏幕变化,所以我们就得要根据屏幕宽度来改变了,有两种方式:第一种通过js来动态改变;这里,我介绍另一种,通过vw来改变:

html { font-size: calc(100vw / 375); }
body { margin: 0; font-size: 16px; }

当然,比例可以设置不同的,按照自己的习惯可以设置为其他的大小。

其原理就是:需要根字体大小 / 设计稿的宽度 = 需要vw大小 / 100vw。

vw布局

vw是根据视口来计算宽度的,一个vw就表示视口的1/100,如果是100vw则表示为整个视口宽度,利用vw属性和scss预编译,就可以很简单实现移动端适配布局:

@width: 375;    // 设计稿的宽度
@function vw($px) {
    return ($px / $width) * 100vw;
}

这样就通过scss实现了一个可以适配的函数,通过调用这个函数,我们就可以根据不同的屏幕宽度来获得不同的单位:

img {
    width: vw(375); // 在375px的屏幕下,就表示宽度为375
}

其原理就是:设计稿目标的宽度 / 设计稿的宽度 = 需要vw大小 / 100vw。

postcss-plugin-px2rem

通过上面的vw布局和rem布局,我们能实现移动端的适配,但是功能还不够强大,通过postcss的插件,我们可以配置更多选项的适配。

安装

  • npm:npm i --save postcss-plugin-px2rem
  • yarn:yarn add postcss-plugin-px2rem

使用

基于Vue可以在vue.config.js或者新建postcss.config.js文件配置px2rem插件:

module.exports = {
  plugins: [require('postcss-plugin-px2rem')({
    rootValue: 100,
    exclude: /(node_module)/,
    mediaQuery: false
  })]
}

这里的rootValue表示1px等于1/100rem大小,当然也可以使用对象,例如:{ px: 50, rpx: 100 }

exclude表示排除的文件(这些文件不会把px单位编译为rem);

mediaQuery表示排除媒介查询的样式(这些文件不会把px单位编译为rem)。

配置完成之后,我们还是得设置HTML的根字体大小,这里因为rootValue100,假设设计稿是750px大小的话,设置如下:

html { font-size: calc(100 * 100vw / 750); }
body { font-size: 16px; }

除了可以转换px外,我们还可以使用之前说的给rootValue配置为对象的方式,来设置成小程序那种rpx的布局方式:

module.exports = {
  plugins: [require('postcss-plugin-px2rem')({
    rootValue: {
        px: 50,
        rpx: 100
    },
    exclude: /(node_module)/,
    mediaQuery: false
  })]
}
html { font-size: calc(100 * 100vw / 750); }
body { font-size: 16px; }
​
img {
    width: 750rpx; // 等同于 375px
}

这样的话,就可以使用rpx来像小程序那样完成布局了,更多配置可以看postcss-plugin-px2rem

总结

适配的方案无非就是remvw两种方式,主要是换算公式可能比较麻烦,甚至有些时候难以理解,个人觉得多上手试试,慢慢还是能理解的。