移動端適配最佳方案

JS動態計算當前屏幕每一份大小

缺點:切換屏幕尺寸需要刷新界面纔有效,真機上測試,可忽略

document.documentElement.style.fontSize = window.innerWidth / 7.5 + "px";

設置設備像素比

通過meta的initial-scale屬性來縮小
注意點:縮放視口後視口大小會發生變化
當移動端設備的CSS像素和設備像素比例不爲1時,需要進行縮放

 let scale = 1.0 / window.devicePixelRatio;// 計算縮放比例
 let text = `<meta name="viewport" content="width=device-width, initial-scale=${scale}, maxinum-scale=${scale}, mininum-scale=${scale}, user-scalable=no ">`;
 document.write(text);

style樣式中通過比例公式計算

公式:原始元素尺寸 / 原始圖片每一份大小 * 目標屏幕每一份大小 = 等比例縮放後的尺寸

設計圖片是150*150

如何在前端開發中應用這個計算公式
目標屏幕每一份的大小就是HTML的font-size:50px(一共有7.5份,375/7.5)
使用時只需要用 原始元素尺寸 / 原始圖片每一份大小rem 即可

案例

爲了直接計算縮放後的尺寸,這個案例中用了less

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>移動端常用適配方案-不用媒體查詢</title>
    <style type="text/less">
        *{
            margin: 0;
            padding: 0;
        }
        @media screen and (max-width: 320px) {
            html{
                font-size: 42.67px;
            }
        }
        @media screen and (min-width: 375px) {
            html{
                font-size: 50px;
            }
        }
        @media screen and (min-width: 414px) {
            html{
                font-size: 55.2px;
            }
        }
        .top{
            position: relative;
        }
        .top>img{
            width: 100%;
            height: auto;
        }
        .top>p{
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 80/100rem;
            font-size: 36/100rem;
            color: #fff;
        }
        .middle, .bottom{
            position: relative;
            height: 290/100rem;
        }
        .main{
            border: 1/100rem dashed #0d7efb;
            border-radius: 5/100rem;
            padding: 10/100rem;
            display: inline-block;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
        }
        .main>img:nth-of-type(1){
            width: 410/100rem;
            height: 270/100rem;
            vertical-align: bottom;
        }
        .main>img:nth-of-type(2){
            width: 84/100rem;
            height: 84/100rem;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            top: 60/100rem;
        }
        .bottom{
            margin-top: 35/100rem;
        }
    </style>
    <script src="../js/less.js"></script>
    <script>
        /*
        * 注意點:通過JS動態計算當前屏幕每一份大小的好處:不用寫很多的媒體查詢
        * 壞處:切換了屏幕尺寸之後需要刷新界面纔有效
        *       而媒體查詢如果切換了屏幕的尺寸不需要重新刷新界面
        * */
        console.log(window.devicePixelRatio);
        document.documentElement.style.fontSize = window.innerWidth / 7.5 + "px";
        // console.log(document.documentElement);
        let scale = 1.0 / window.devicePixelRatio;
        let text = `<meta name="viewport" content="width=device-width, initial-scale=${scale}, maxinum-scale=${scale}, mininum-scale=${scale}, user-scalable=no ">`;
        document.write(text);
    </script>
</head>
<body>
<div class="top">
    <img src="../images/bg.png" alt="">
    <p>實名認證</p>
</div>
<div class="middle">
    <div class="main">
        <img src="../images/back.png" alt="">
        <img src="../images/add.png" alt="">
    </div>
</div>
<div class="bottom">
    <div class="main">
        <img src="../images/back.png" alt="">
        <img src="../images/add.png" alt="">
    </div>
</div>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章