flexible 适配方案
实现
一、根据布局视口动态计算根节点字体大小
实现
function setBodyFontSize() {
if (document.body) {
document.body.style.fontSize = 12 * dpr + "px";
} else {
document.addEventListener("DOMContentLoaded", setBodyFontSize);
}
}
function setRemUnit() {
const rem = document.clientWith / 10;
document.style.fontSize = rem + "px";
}
setBodyFontSize();
setRemUnit();
window.addEventListener("resize", setRemUnit);
window.addEventListener("pageshow", function (e) {
if (e.persisted) {
setRemUnit();
}
});
二、控制 viewport 的 width 和 scale 值适配高倍屏
思路:
-
设置
viewport
的width
为device-width
: 改变浏览器viewport
的默认宽度为理想视口宽度 -
设置
viewport
的initial-scale
、minimum-scale
、maximum-scale
的值: 从而实现1 Css 像素 = 1 物理像素
, 用来适配高倍屏的显示效果
实现
function setViewPort() {
const metaElement = document.querySelector("meta[name='viewport']");
const dpr = window.devicePixelRatio;
const scale = 1 / dpr;
metaElement.setAttribute(
"content",
`width=device-width,initial-scale=${scale},minimum-scale=${scale},maximum-scale=${scale},user-scalable=no`
);
}