方案一:rem+flexible
postcss配置
"postcss": {
"plugins": {
// 将css文件中的px转换成rem,autoprefixer是加上各种浏览器前缀
"postcss-px2rem": {
// UI图片的基准值 750px就是75,640px就是64,默认为75
"remUnit": 37.5,
"remPrecision": 6, //准换成rem后的小数点精确数位 默认为6
"baseDpr": 2, //基准device pixel ratio值 默认为2
},
"autoprefixer": {
"overrideBrowserslist": [
"Android 4.1",
"iOS 7.1",
"Chrome > 31",
"ff > 31",
"ie >= 8"
]
}
}
},
"postcss-pxtorem": {
"rootValue": 50, // 根元素字体大小
"propList": [
"*"
]
},
适配代码
import 'amfe-flexible/index.js'
const baseSize = 100 // 这个是设计稿中1rem的大小。
function setRem () {
// 实际设备页面宽度和设计稿的比值
const scale = (document.documentElement.clientWidth || document.body.clientWidth) / 750
// 计算实际的rem值并赋予给html的font-size
document.documentElement.style.fontSize = (baseSize * scale) + 'px'
}
setRem()
window.addEventListener('resize', () => {
setRem()
})
提示 : 当脱离掉node_modules重新npm install项目依赖时还是需要重新修改一遍的,谨记!
// rem适配
// rem适配原理,改变了一个元素在不同设备上占据的css像素的个数
// 优点:没有破坏完美视口
// 缺点:px值到rem值到转换太复杂
(function(){
var styleNode = document.createElement("style");
var w = document.documentElement.clientWidth / 16;
styleNode.innerHTML = "html{font-size:" + w + "px!important}";
document.head.appendChild(styleNode)
})()
方案二:viewport 适配
/* viewport 适配的原理,viewport适配方案中,每一个元素在不同设备上占据的css像素的个数是一样的,
但是css像素和物理像素的比例是不一样的,等比的。
优点:所量即所得
缺点:没有使用完美视口*/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width">
<title>Document</title>
</head>
<body>
</body>
<script type="text/javascirpt">
(function(){
var targetW = 640;
var scale = document.documentElement.clientWidth/targetW;
var meta=document.querySelector("meta[name='viewport'");
meta.content = "initial-scale="+scale + ",minimum-scale="+ scale + ",maximum-scale="+scale+",user-scalable=no";
})()
</script>
</html>