自适应页面
2023-09-30
//css
    body {
                -webkit-box-sizing: border-box;
                box-sizing: border-box;
                background-color: #fff;
            }
            .page_loading_box{
                position: fixed;
                width: 100vw;
                height: 100vh;
                background: #fff;
                z-index: 9999999;
                left: 0;
                top: 0;
                text-align: center;
            }
            .page_loading {
                position: absolute;
                left: 0;
                top: 30vh;
                right: 0;
                margin: auto;
                width: 8vw;
                height: 8vw;
                border-top: 4px solid #C9151E;
                border-right: 4px solid transparent;
                border-radius: 50%;
                -webkit-animation: 1s spin linear infinite;
                animation: 1s spin linear infinite;
            }
            -webkit-@keyframes spin {
                        -webkit-from {
                            -webkit-transform: rotate(0deg);
                            -ms-transform: rotate(0deg);
                            transform: rotate(0deg);
                        }
                        -webkit-to {
                            -webkit-transform: rotate(360deg);
                            -ms-transform: rotate(360deg);
                            transform: rotate(360deg);
                        }
                    }
            @-webkit-keyframes spin {
                from {
                    -webkit-transform: rotate(0deg);
                    transform: rotate(0deg);
                }
                to {
                    -webkit-transform: rotate(360deg);
                    transform: rotate(360deg);
                }
            }
            @keyframes spin {
                from {
                    -webkit-transform: rotate(0deg);
                    transform: rotate(0deg);
                }
                to {
                    -webkit-transform: rotate(360deg);
                    transform: rotate(360deg);
                }
            }
//js
            var curr_rem = 0;//用于存储全局参数
         function w_load() {
                (function(designWidth, designHeight , maxWidth) {
                    let doc = document,
                        win = window,
                        docEl = doc.documentElement,
                        remStyle = document.createElement("style"),
                        tid;
                    function refreshRem() {
                        let wind_width = docEl.getBoundingClientRect().width;
                        let wind_height = docEl.getBoundingClientRect().height;
                        let width =  wind_width;

                        if(designHeight){
                            let hd = wind_width  / (designWidth / designHeight)
                            if( hd >  wind_height ) maxWidth = (designWidth / designHeight) * wind_height
                        }

                        wind_width>=maxWidth && (width=maxWidth);
                        console.log( width )
                        //var rem = width * 10 / designWidth; 
                         curr_rem = width * 10 / designWidth;//10=设计图宽度/rem宽度
                        remStyle.innerHTML = 'html{font-size:' + curr_rem+ 'px;}';
                    }

                    if (docEl.firstElementChild) {
                        docEl.firstElementChild.appendChild(remStyle);
                    } else {
                        var wrap = doc.createElement("div");
                        wrap.appendChild(remStyle);
                        doc.write(wrap.innerHTML);
                        wrap = null;
                    }
                    //要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;
                    refreshRem();

                    win.addEventListener("resize", function() {
                        clearTimeout(tid); //防止执行两次
                        tid = setTimeout(refreshRem, 300);
                    }, false);

                    win.addEventListener("pageshow", function(e) {
                        if (e.persisted) { // 浏览器后退的时候重新计算
                            clearTimeout(tid);
                            tid = setTimeout(refreshRem, 300);
                        }
                    }, false);
                    win.addEventListener('orientationchange',function () {
                        clearTimeout(tid);
                        tid = setTimeout(refreshRem, 300);
                    }, true);
                })(2048, 1536,2048);
                //$('.page_loading_box').hide()
          }       
          //页面不能配置默认字体大小
      w_load();
            
     //获得rem对应px值  需要等页面计算完成后生效
     function rem2px(res) {
        return curr_rem * res ;
    }
            
            
 //html
    <!--页面加载start-->
        <div class="page_loading_box"  >
            <div class="page_loading"></div>
        </div>
    <!--页面加载end-->