zoukankan      html  css  js  c++  java
  • 淘宝flexibleJS源码分析

    知识梳理

    //1 onload 和 onpageshow的区别

    1)参数说明

    (function flexible(window, document) {
    }(window, document));
    //window 顶级对象
    //document 下一个对象

    2)代码

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            div {
                 200px;
                height: 200px;
                border: sienna solid 10px;
            }
        </style>
    </head>
    <body>
    <div></div>
    <script>
        console.log(window.devicePixelRatio);
        (function flexible(window, document) {
            //获取到根元素 html
            var docEl = document.documentElement;
            // dpr 物理像素比
            // pc下是1:1   手机端是 1:2
            var dpr = window.devicePixelRatio || 1;
    
            // adjust body font size   //adjust 调整 适应 的意思
            function setBodyFontSize() {
                //如果页面有body这个元素 我们设置body的字体大小
                //pc端 12*1  手机端 12*2
                if (document.body) {
                    document.body.style.fontSize = (12 * dpr) + 'px'
                } else {
                    //如果没有我们就添加事件 DOMContentLoaded 让页面加载完成后再执行这个函数 设置字体
                    document.addEventListener('DOMContentLoaded', setBodyFontSize)
                }
            }
            setBodyFontSize();
    
            //设置 1rem 大小 [最核心的功能]
            // set 1rem = viewWidth / 10
            function setRemUnit() {
                var rem = docEl.clientWidth / 10; //把html的宽度 除以 平均分成10等份
                docEl.style.fontSize = rem + 'px'; //设置html字体
            }
            setRemUnit();//unit 单元的意思
    
            // 当页面大小发生变化的时候 重新设置
            // reset rem unit on page resize
            window.addEventListener('resize', setRemUnit)
            window.addEventListener('pageshow', function(e) {
                if (e.persisted) {//如果当前页面是从缓存中取来的 也重新计算rem的大小
                    setRemUnit();
                }
            });
            //resize 当调整浏览器窗口的大小时,发生 resize 事件
            //onpageshow 重新加载页面时触发 和 onload事件类似
            //onload 加载缓存时不触发
    
            //有些浏览器不支持0.5px的写法
            // detect 0.5px supports
            if (dpr >= 2) {
                var fakeBody = document.createElement('body')
                var testElement = document.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))
    </script>
    </body>
    </html>
  • 相关阅读:
    综合练习:词频统计
    Dart SDK 2.0安装问题
    The DartEditor executable launcher was unable to locate its companion shared library.
    pycharm中如何正确配置pyqt5
    发现黑苹果带双显示器无法启动的原因
    Pycharm中用鼠标改变字体大小
    失望的visual studio for mac
    laravel 函数测试 --- Route::has()
    laragon 之Nginx
    laragon 之xdebug
  • 原文地址:https://www.cnblogs.com/fuyunlin/p/14459555.html
Copyright © 2011-2022 走看看