前端自适应解决方案

1,186 阅读1分钟

方案一:rem

步骤一:新建rem.js,然后引入到页面即可

(function (doc, win) {
    var docEl = doc.documentElement
    var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize'
    var reCalc = function () {
      var clientWidth = docEl.clientWidth
      if (!clientWidth) return
      docEl.style.fontSize = 16 * (clientWidth / 320) + 'px'
    }
    if (!doc.addEventListener) return
    win.addEventListener(resizeEvt, reCalc, false)
    doc.addEventListener('DOMContentLoaded', reCalc, false)
})(document, window)

步骤二:新建base.scss文件并定义rem转px函数

$browser-default-font-size:16px!default;//iphone6
html,body{
    font-size:$browser-default-font-size;
}
@function px2rem($px){
    @return $px/$browser-default-font-size*1rem;
}

步骤三:代码中所有尺寸都用px2rem()进行转换,例如:

div{
	width:px2rem(100px);
    height:px2rem(100px);
    fonst-size:px2rem(20px);
}

方案二:vw方案,借用插件

步骤一:安装插件

npm install postcss-px-to-viewport --save

步骤二:增加配置

新建完成后会自动创建postcss.config.js文件,如果没用可自行创建,与package.json文件在同一目录下
增加以下配置即可:
module.exports = {
  plugins: {
    autoprefixer: {}, // 用来给不同的浏览器自动添加相应前缀,如-webkit-,-moz-等等
    'postcss-px-to-viewport':{
      unitToConvert: 'px',// 要转化的单位
      viewportWidth: 750,// UI设计稿的宽度
      unitPrecision: 6,// 转换后的精度,即小数点位数
      propList: ['*'],// 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
      viewportUnit: 'vw',// 指定需要转换成的视窗单位,默认vw
      fontViewportUnit: 'vw',// 指定字体需要转换成的视窗单位,默认vw
      selectorBlackList: [],// 指定不转换为视窗单位的类名,
      minPixelValue: 1,// 默认值1,小于或等于1px则不进行转换
      mediaQuery: true,// 是否在媒体查询的css代码中也进行转换,默认false
      replace: true,// 是否转换后直接更换属性值
      exclude: undefined,// 设置忽略文件,用正则做目录名匹配
      include: undefined,
      landscape: false,// 是否处理横屏情况
      landscapeUnit: 'vw',
      landscapeWidth: 568
    }
  }
}

补充说明:

高度尽量用em或者不转换高度,可以避免高度错位的问题。