webapp新體驗Rem實現移動端網頁適配詳解資源


  本來想寫一篇,webapp使用Rem的問題,查了一下相關rem的介紹之后,發現很多平台已經解釋的很清楚了,圖文並茂,於是我便想將其解釋資源整理一些,方便以后自己查閱。

   騰訊ISUX:web app變革之rem(解釋的最精辟了)

   大漠博客:CSS3的REM設置字體大小 

   小黑成長錄:關於webapp中的文字單位的一些搗騰

   前端觀察站:px em rem在WEB前端開發中的區別

   這里面需要注意的一點就是,ren是根據根元素的字體大小來確定的:

    我們可能經常設置html{font-size:20px}或者font-size:16px,這些其實都沒有錯,但是可能我們有更好的設置方法:

html{font-size:62.5%;}      /* font-size 62.5% = 10px =1rem */
body{font-size:100%;}       /* font-size 100% = 10px = 1rem */
.rem-1{font-size:1.2rem;}
.rem-2{font-size:1.4rem;}
.rem-3{font-size:1.6rem;}

  通過設置html的font-size:62.5%,我們就可以很方便的計算出px所對應的rem值,簡單粗暴。

  常用的調節rem的視口尺寸:

html {
    font-size : 20px;
}
@media only screen and (min-width: 401px){
    html {
        font-size: 25px !important;
    }
}
@media only screen and (min-width: 428px){
    html {
        font-size: 26.75px !important;
    }
}
@media only screen and (min-width: 481px){
    html {
        font-size: 30px !important; 
    }
}
@media only screen and (min-width: 569px){
    html {
        font-size: 35px !important; 
    }
}
@media only screen and (min-width: 641px){
    html {
        font-size: 40px !important; 
    }
}

  最后分享一段淘寶手機屏幕尺寸判斷改變字體大小的js(淘寶首頁好像現在沒有用rem了還是采用定寬px):

 

!function(x) {
  //x 為window 
    function w() {
    //document.documentElement.getBoundingClientRect().width;
        var a = r.getBoundingClientRect().width;
     //先計算 a / v>540然后 && (a =540*v)
        a / v > 540 && (a = 540 * v), x.rem = a / 16, r.style.fontSize = x.rem + "px"
    }
  //s = window.document ,r = document.documentElement,q = document.querySelector('meta[name = "viewport"]'),p = document.querySelector("meta[name = 'flexible']")
    var v, u, t, s = x.document, r = s.documentElement, q = s.querySelector('meta[name="viewport"]'), p = s.querySelector('meta[name="flexible"]');
    if (q) {
        console.warn("將根據已有的meta標簽來設置縮放比例");
        var o = q.getAttribute("content").match(/initial\-scale=(["']?)([\d\.]+)\1?/);
        o && (u = parseFloat(o[2]), v = parseInt(1 / u))
    } else {
        if (p) {
            var o = p.getAttribute("content").match(/initial\-dpr=(["']?)([\d\.]+)\1?/);
      //v是meta[name = "viewport"] dpi值大小

            o && (v = parseFloat(o[2]), u = parseFloat((1 / v).toFixed(2)))
        }
    }
    if (!v && !u) {
        var n = (x.navigator.appVersion.match(/android/gi), x.navigator.appVersion.match(/iphone/gi)), v = x.devicePixelRatio;
        v = n ? v >= 3 ? 3 : v >= 2 ? 2 : 1 : 1, u = 1 / v
    }
    if (r.setAttribute("data-dpr", v), !q) {
        if (q = s.createElement("meta"), q.setAttribute("name", "viewport"), q.setAttribute("content", "initial-scale=" + u + ", maximum-scale=" + u + ", minimum-scale=" + u + ", user-scalable=no"), r.firstElementChild) {
            r.firstElementChild.appendChild(q)
        } else {
            var m = s.createElement("div");
            m.appendChild(q), s.write(m.innerHTML)
        }
    }
    x.dpr = v, x.addEventListener("resize", function() {
        clearTimeout(t), t = setTimeout(w, 300)
    }, !1), x.addEventListener("pageshow", function(b) {
        b.persisted && (clearTimeout(t), t = setTimeout(w, 300))
    }, !1), "complete" === s.readyState ? s.body.style.fontSize = 12 * v + "px" : s.addEventListener("DOMContentLoaded", function() {
        s.body.style.fontSize = 12 * v + "px"
    }, !1), w()
}(window);

 

(function () {
    var b = document.documentElement,
        a = function () {
            var a = b.getBoundingClientRect().width;
            //b.style.fontSize = 20 * (640 <= a ? 640 : a)/320 + "px"    這里設置的為根元素節點大小為20px,必須與樣式里面的根節點樣式大小一致,貌似不能通過document.documentElement.style.fontSize獲取根節點元素字體大小只能手寫,根元素大小*視口比例
            b.style.fontSize = .0625 * (640 <= a ? 640 : a) + "px"
        }, c = null;
    window.addEventListener("resize", function () {
        clearTimeout(c);
        c = setTimeout(a, 300)
    });
    a()
})();

  根元素大小設置為多少,子元素的rem單位跟着一起變化擴大。我們這樣設置:

            html {font-size: 62.5%;/*10 ÷ 16 × 100% = 62.5%*/}
            body {font-size: 1.4rem;/*1.4 × 10px = 14px */}
            h1 { font-size: 2.4rem;/*2.4 × 10px = 24px*/}

  達到的目的只是方便我們去計算,等同於現在html 的fontsize:10px;  但是元素h1大小為20px 那么我們就可以把h1設置為2rem

 

  最后我還想談一下,關於h5布局活動頁面的問題:

  先來兩張圖做對比吧:

    

        chrome控制台                                                                 iphone4s

看到這兩張圖,可能我們不禁要問,問什么320*480下正常,到了微信上面為什么不正常了,主要是因為微信底部有個頂部條導致的高度為65px(320下),為了解決這個問題,我們可能就要通過視口@media query去媒介調整,但每次未免也太麻煩了。

為了解決這個問題,我們分析一下,通常設計師給我的設計稿可能有兩種大小一種640*960  ,640*1136,如果說設計師在設計稿下大部分都填充了,那肯定會出現擁擠。其實我們應該這樣做將布局分層三部分,頂部,中部,底部,讓三者內容挨近保證能在帶有微信底部條的960px下面不溢出,那么這樣,我們就會少出現這些情況了。

  但是我們即使基於如上我說的設計稿要求去做也會遇到問題,那就是我們做出來的在320*480下是展現正常的,但是在微信下頂部bar+電量高度為64px,則實際變成了320*416的尺寸,所以通常來說要進行縮放,我們可以單獨基於iphone4s來做一個處理:

/* 兼容iphone4/4s */
@media (device-height:480px) and (-webkit-min-device-pixel-ratio:2){
    .page1inner{padding-top: 5rem;}
    .page2inner{padding-top: 4%;}
    .img-zhong{margin-bottom: 0}
    .page3inner{padding-top: 10%;}
    .img-jj{margin-bottom: 5%}
    .img-shu{width: 66%; margin-bottom: 6%}
    .page5inner{padding-top: 0;}
    .page6inner{ padding-top: 1rem;}
    .img-hua{width: 35%; margin-bottom: 0}
    .page8inner{padding-top: .5rem}
    .page8-title{ margin-bottom: 1rem;}
    .page7-text{top: 10%}
}

 用zoom加強,對元素進行縮放

<script type="text/javascript">

    
        !function(){
            var cw=document.documentElement.clientWidth||document.body.clientWidth,zoom=cw/320;
            var ch= document.documentElement.clientHeight || document.body.clientHeight;

            zoom = Math.min(cw/320,ch/500);

            document.write('\
                <style id="htmlzoom">\
                    html{font-size:'+(zoom*20)+'px;}\
                    .svn_wrp{zoom:'+(zoom/2)+';}\
                </style>\
                ');
        }();

</script>

 另外兩種通過縮放解決多屏下,元素尺寸縮放問題:

 通過zoom解決的縮放問題:

    <script>
        (function () {
            var b = document.documentElement,
                a = function () {
                    var a = b.getBoundingClientRect().width;
                    //b.style.fontSize = 20 * (640 <= a ? 640 : a)/320 + "px"    這里設置的為根元素節點大小為20px,必須與樣式里面的根節點樣式大小一致,貌似不能通過document.documentElement.style.fontSize獲取根節點元素字體大小只能手寫,根元素大小*視口比例
                 //   b.style.fontSize = .0625 * (640 <= a ? 640 : a) + "px"
                    b.style.cssText="-webkit-transform: translate3d(0px, 0px, 0px);zoom:"+(640 <= a ? 640 : a)/320;
                }, c = null;
            window.addEventListener("resize", function () {
                clearTimeout(c);
                c = setTimeout(a, 300)
            });
            a()
        })();
    </script>

  基於transform中scale進行縮放

    <script>
        (function () {
            var b = document.documentElement,
                a = function () {
                    var a = b.getBoundingClientRect().width;
                    //b.style.fontSize = 20 * (640 <= a ? 640 : a)/320 + "px"    這里設置的為根元素節點大小為20px,必須與樣式里面的根節點樣式大小一致,貌似不能通過document.documentElement.style.fontSize獲取根節點元素字體大小只能手寫,根元素大小*視口比例
                 //   b.style.fontSize = .0625 * (640 <= a ? 640 : a) + "px"
                    var p = (640 <= a ? 640 : a)/320;
                    b.style.webkitTransform = "scale(" + p + ")";
                }, c = null;
            window.addEventListener("resize", function () {
                clearTimeout(c);
                c = setTimeout(a, 300)
            });
            a()
        })();
    </script>

  這里這兩種縮放一定要注意一個問題,就是html,body,容器都是width:100%,height:100%

 

      //判斷瀏覽器支持那個,然后加前綴
      prefix=function(){
         var style=document.body.style,vendor=["t","webkitT","mozT","oT","msT"],i=vendor.length;
             while(i--)
             {
               if(typeof style[vendor[i]+"ransition"]!="undefined")
                 return vendor[i];
             }
             return vendor[0];
      }();

 

 

 

  友盟:http://www.umindex.com/devices/android_os


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM