rem是个相对单位,相对的是 html 根元素的 font-size
大小。这样一来我们就可以通过 html 上的字体大小来控制页面上所有以rem为单位的元素尺寸。
思路:
window.innerWidth / 10
)rem份数 = 设计稿px / 每份有多少px值
示例代码 例如在vue项目的index.html页中动态计算根元素字体大小
index.html
<!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,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
...
</head>
<body>
<noscript>
...
</noscript>
<div id="app"></div>
<script>
;(function(doc, win) {
const docEl = doc.documentElement
const resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize'
const recalc = () => {
let clientWidth = docEl.clientWidth;
clientWidth = clientWidth < 750 ? clientWidth : 750;
// 把屏幕宽度划分成10份,那么每一份的宽度就等于1rem,也就是 75px
docEl.style.fontSize = clientWidth / 10 + 'px'
}
if (!doc.addEventListener) return
win.addEventListener(resizeEvt, recalc, false)
doc.addEventListener('DOMContentLoaded', recalc, false)
recalc()
})(document, window)
</script>
</body>
</html>
然后利用 CSS 预处理器定义一个 mixin 函数(下方用的 stylus),用来将设计稿上的 px 转为对应的rem值 计算公式为: 页面元素的rem值 = 设计稿元素值(px)/(屏幕宽度 / 划分的份数)
mixin.stylus
/* 把px转为rem */
/* 用设计稿px除以每一份rem的px,就能算出几个rem */
px2rem(designpx)
$rem = 750 / 10;
return (designpx / $rem)rem
最后在css中使用
某vue组件的style标签中
/* 375设计稿上100%宽以及50高的导航条(iPhone6的dpr为2,所以px值得都乘以2) */
header
width px2rem(750)
height px2rem(100)
思路:
html { font-size: 100px; }
,把100px当做因子