rem适配(等比适配)
核心原理:
-
将 设备视口 划分成 n 份, n 可以是 任何正确的值(如
flexible.js中的n = 10)- 设置 设备视口
根元素 html的font-size = 设备视口宽 ÷ 份数 n,即得到 设备视口1rem 到底表示 多少设备视口 px
- 设置 设备视口
-
将 设计稿 也同样划分成 n 份,此时 设计稿中的
apx 对应 设备视口brem 的计算方式为- 设备视口
brem = 设计稿apx ÷ (设计稿宽÷n份)
- 设备视口
vw/vh适配
vh、vw方案即将视觉视口宽度 window.innerWidth和视觉视口高
度 window.innerHeight 等分为 100 份。
如果使用的是 CSS 预处理器(Less、Sass) ,那么就可以通过定义一个全局的 函数 来帮助我们进行运算,例如:
Less 中 px2vw() 的定义:
// plugin.js
module.exports = {
install: function (less, pluginManager, functions) {
functions.add('px2vw', (param, perVW) => {
if (!param.value) return '0vw'
if (!perVW.value) return param.value + 'px'
return Number(param.value) / perVW.value + 'vw'
})
},
}
// 具体使用
<style lang="less">
@plugin './plugin.js';
@design-width: 750;
@per-vw: @design-width / 100;
.text {
font-size: px2vw(34, @per-vw);
color: #457fff;
}
</style>
Sass中px2vw()的定义:
<style lang="scss">
$design-width: 750;
$per-vw: $design-width / 100;
@function px2vw($param) {
@return $param / $per-vw + 'px';
}
.text {
font-size: px2vw(34);
color: #457fff;
}
</style>
等比缩放--- viewport<meta>标记
在 HTML 的 head 标签里加入 <meta name="viewport" content="width={设计稿宽度}, initial-scale={屏幕逻辑像素宽度/设计稿宽度}" > 。
(function (designWidth) {
const dEl = document.documentElement;
let meta = document.querySelector("meta[name=viewport]");
// 页面中不存在 <meta name="viewport" /> 时,手动创建一个
if(!meta) {
meta = document.createElement('meta');
meta.setAttribute('name', 'viewport');
document.head.appendChild(meta);
}
function setMetaContent(){
const deviceWidth = dEl.clientWidth;
const scale = deviceWidth / designWidth;
const content = `width=${deviceWidth}, initial-scale=${scale}`;
meta.setAttribute("content", content);
}
setMetaContent();
window.addEventListener("resize", setMetaContent)
})(750);