flexible.js源码分析

(function flexible(window,document){
   // 获取html的根元素
   var docEl = document.documentElement;
   // dpr 物理像素比  window.devicePixelRatio 会获取当前屏幕的物理像素比,如果是pc端则为1,移动端为2。
   // 如果当前浏览器没有window.devicePixelRatio则取1
   var dpr = window.devicePixelRatio || 1;

   // 设置body的字体大小
   function setBodyFontSize(){
    // 如果页面有body这个元素,就设置body的字体大小
    if (document.body){
        document.body.style.fontSize = (12 * dpr) + 'px';
    }else{
        //否则,等待页面的主要DOM元素加载完毕再去设置body的字体大小
        document.addEventListener("DOMContentLoaded",setBodyFontSize);
    }
   }
   setBodyFontSize();

   // 核心
   // 设置html的文字大小
   function setRemUnit(){
    // 将html文档宽度划分为10等分,每一等分为一rem,即html的fontsize
    var rem = docEl.clientWidth / 10;
    docEl.style.fontSize = rem + 'px';
   }
   setRemUnit();
   // 当页面尺寸大小发生变化时,要重新设置rem的大小
   window.addEventListener('resize',setRemUnit);
   // pageshow 是我们重新加载页面触发的事件
   window.addEventListener('pageshow',function(e){
    if(e.persisted){
        // 返回的是true,说明这个页面是从缓存中去过来的页面,也需要重新计算一下rem的大小
        setRemUnit();
    }
   })

   // 下面这块不必了解
   // detect 0.5px supports  // 有些移动端浏览器不支持0.5像素的写法,下面这个解决方案可以让其支持
   if(dpr >= 2){
    var fakeBody = document.createElement('body');
    var testElement = docunment.createElement('div');
    testElement.style.border = '.5px solid transparent';
    fakeBody.appendChild(testElement);
    docEl.appendChild(fakeBody)
    if(testElement.offsetHeight === 1){
        docEl.classList.add('hairlines')
    }
    docEl.removeChild(fakeBody)
   }
}(window,document))

试例

<!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">
    <title>Document</title>
    <script src="flexible.js"></script>
</head>
<body>
   
</body>
</html>

  

posted @ 2023-02-16 11:38  live丶  阅读(73)  评论(0编辑  收藏  举报