一、为什么需要适配
在日常的开发中,设计师给的设计稿的尺寸一般为375和750像素的,但是用户使用的手机的尺寸都是不一样的,需要根据设计尺寸生成适合所有手机的尺寸。
二、传统的方法
通常如果要实现响应式的尺寸,会使用rem和vw,rem是相对于跟元素的字体大小,vw是相对于适口的大小,1vw相当于总宽的的1%。这两种方法的弊端也十分明显,代码不利于维护,也不清晰。
三、实现
// postcss.config.js
module.exports = {
plugins: {
'postcss-px-to-viewport': {
viewportWidth: 375,
},
},
};
用于将 px 单位转化为 vw/vh 单位,但是vant组件的设计稿尺寸为375,往往不适配一般的750设计稿。
需要一个新的插件cnjm-postcss-px-to-viewport
const path = require('path');
module.exports = {
plugins: {
// ....
// 修改插件名称
'cnjm-postcss-px-to-viewport': {
unitToConvert: 'px', // 要转化的单位
viewportWidth: 750, // UI设计稿的宽度
unitPrecision: 3, // 转换后的精度,即小数点位数
propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
selectorBlackList: ['ignore'], // 指定不转换为视窗单位的类名,
minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
replace: true, // 是否转换后直接更换属性值
exclude: [], // 设置忽略文件,用正则做目录名匹配
landscape: false, // 是否处理横屏情况
// 如果没有使用其他的尺寸来设计,下面这个方法可以不需要,比如vant是375的
customFun: ({ file }) => {
// 这个自定义的方法是针对处理vant组件下的设计稿为375问题
const designWidth = path.join(file).includes(path.join('node_modules', 'vant')) ? 375 : 750;
return designWidth;
}
}
}
};
autoprefixer插件,为兼容所有浏览器,部分CSS属性需要加上不同的浏览器前缀,Autoprefixer
就能很方便的解决上述问题,简化我们的开发模式。
module.exports = {
plugins: {
// ....
autoprefixer: {
overrideBrowserslist: ['Android 4.1', 'iOS 7.1', 'Chrome > 31', 'ff > 31', 'ie >= 8']
},
}
};