1:第一种方案
下载插件
- yarn add postcss-px2rem@5 -D
- yarn add amfe-flexible -D
新建postcssrc.js
module.exports = {
plugins: {
// 'postcss-import': {},
// 'postcss-url': {},
// to edit target browsers: use "browserslist" field in package.json
autoprefixer: {},
'postcss-px2rem': {
// rootValue: 422.4,//对应设计图宽度4224*1296
// rootValue: 192,//对应设计图宽度1920*1080
rootValue: 75, // 对应设计图的750*667 1rem = 75px
propList: ['*', '!border*'] // 表示不匹配 要是想匹配边框之类的 可以在里面用 !border* 表示不配备边框,这样不会把边框1px变成1rem
}
}
}
// 在入口main.js中 引入 lib-flexible
import "amfe-flexible/index.js";
在package.json文件下配置浏览器兼容的方案
"browserslist": [
"> 1%",
"last 3 versions",
"not ie <= 8",
"chrome >= 14",
"safari >= 3",
"ios >= 7",
"android >= 4.0"
]
或者在.browserslistrc中配置(推荐)
> 1%
last 3 versions
not ie <= 8
chrome >= 14
safari >= 3
ios >= 7
android >= 4.0
效果图如下
2:第二种方案,直接引入rem.js
(function(doc, win) {
var docEl = doc.documentElement,
isIOS = navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
dpr = isIOS ? Math.min(win.devicePixelRatio, 3) : 1,
dpr = window.top === window.self ? dpr : 1, //被iframe引用时,禁止缩放
dpr = 1,
scale = 1 / dpr,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
docEl.dataset.dpr = dpr;
var metaEl = doc.createElement('meta');
metaEl.name = 'viewport';
metaEl.content = 'initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale;
docEl.firstElementChild.appendChild(metaEl);
var recalc = function() {
var width = docEl.clientWidth;
if (width / dpr > 750) {
width = 750 * dpr;
}
// 乘以100,px : rem = 100 : 1
docEl.style.fontSize = 100 * (width / 750) + 'px';
};
recalc()
if (!doc.addEventListener) return;
win.addEventListener(resizeEvt, recalc, false);
})(document, window);
import './utils/rem';
效果图如下
不过这种需要自己手动计算,1rem = 100px,可以借助vscode插件,下载px to rem
然后自己配置,点开扩展设置
设置转换的字体大小
然后输入css样式,手动选择,这种比较笨重,推荐使用px-to2rem插件自动转换