H5移動端的適配以及在移動端顯示的視覺偏差

web.jpeg

1.移動端認(rèn)知

  • 分類
    • 原生
      • iOS,編寫語言O(shè)C/swift
      • 安卓,編寫語言java
    • H5 編寫的移動端是web網(wǎng)頁,簡稱M站,使用與手機(jī)瀏覽器,其原理就是通過手機(jī)上瀏覽器通過webKit內(nèi)核去加載寫好的html5和css文件

一般大型的公司是這些區(qū)分開的,原生人需要,H5的人也是需要,比如電商類,旅游類等

2.開發(fā)常用的單位

2.1 像素px

  • 不會隨著視口大小的變化而變化, 像素是一個固定的單位(絕對單位)


    image.png

2.2 百分比%

  • 子元素寬度/高度是參考父元素寬度/高度計算的
 .father {

            width: 300px;
            height: 200px;
            background-color: rebeccapurple;
            margin: 100px auto;
        }

        .son {
            /*
              2.1 子元素寬度是參考父元素寬度計算的
            *  2.2子元素高度是參考父元素高度計算的
            */
            width: 50%;
            height: 50%;
         background-color: green;

   }
image.png
  • 子元素padding無論是水平還是垂直方向都是參考父元素寬度計算的
 .father {

            width: 300px;
            height: 200px;
            background-color: rebeccapurple;
            margin: 100px auto;
        }
        .son{
            padding-top: 50%;
            padding-bottom: 50%;
            padding-left: 50%;
            padding-right: 50%;
            background-color: green;
        }
image.png
  • 子元素margin無論是水平還是垂直方向都是參考父元素寬度計算的
 .father {

            width: 300px;
            height: 200px;
            background-color: rebeccapurple;
            margin: 100px auto;
        }
        .son{
            width: 100px;
            height: 100px;
            margin-top: 50%;
            margin-left: 50%;
            margin-right: 50%;
            margin-bottom: 50%;
            background-color: green;
        }
image.png
  • 不能用百分比設(shè)置元素的border

注意:百分比是一個動態(tài)的單位, 會隨著父元素寬高的變化而變化(相對單位),如果父元素沒有高那么設(shè)置子元素為100%也是不起作用的,只能是根據(jù)子元素的內(nèi)容撐起高度

2.3 em單位

  • em是前端開發(fā)中的一個動態(tài)單位, 是一個相對于元素字體大小的單位
    • 比如:font-size: 12px; ,那么1em就等于12px
  • 當(dāng)前元素設(shè)置了字體大小, 那么就相對于當(dāng)前元素的字體大小
  • 當(dāng)前元素沒有設(shè)置字體大小, 那么就相當(dāng)于第一個設(shè)置字體大小的祖先元素的字體大小
  • 如果當(dāng)前元素和所有祖先元素都沒有設(shè)置大小, 那么就相當(dāng)于瀏覽器默認(rèn)的字體大小

自身元素有 字體大小

        .son {
            font-size: 13px;
            width: 10em;
            height: 10em;
            background-color: orange;
        }
image.png

自身元素沒有設(shè)置 font-size 父元素設(shè)置font-size

    .father {
            font-size: 15px;
        }

        .son {
     
            width: 10em;
            height: 10em;
            background-color: orange;
        }
image.png

2.4 rem單位

  • rem也是一個動態(tài)的單位, 會隨著根元素字體大小的變化而變化(相對單位)
  • rem只根據(jù)html根元素的font-size 有關(guān)
  • 如果根元素沒有設(shè)置字體大小, 那么就相對于瀏覽器默認(rèn)的字體大小

2.5 vw(Viewport Width)和vh(Viewport Height)相對于視口的寬度和高度

  • vw和vh:是前端開發(fā)中的一個動態(tài)單位, 是一個相對于網(wǎng)頁視口的單位
  • 系統(tǒng)會將視口的寬度和高度分為100份,1vw就占用視口寬度的百分之一, 1vh就占用視口高度的百分之一
  • vw和vh和百分比不同的是, 百分比永遠(yuǎn)都是以父元素作為參考,而vw和vh永遠(yuǎn)都是以視口作為參考

3.視口 (移動端必備)

  • 視口簡單理解就是可視區(qū)域大小我們稱之為視口
  • 通過meta設(shè)置視口大小, 快捷方式 meat:vp + tab 鍵

<meta name="viewport" content="width=device-width, initial-scale=1.0">
width=device-width 設(shè)置視口寬度等于設(shè)備的寬度
initial-scale=1.0 初始縮放比例, 1不縮放
maximum-scale:允許用戶縮放到的最大比例
minimum-scale:允許用戶縮放到的最小比例
user-scalable:用戶是否可以手動縮放

4.移動端的適配

4.1移動端適配一(媒體查詢)

 @media screen and (min-width: 320px) {
// 需要布局的 CSS 代碼
}
 //適配375屏幕
  @media screen and (min-width: 375px) {
   // 需要布局的 CSS 代碼
}

 @media screen and (min-width: 414px) {
// 需要布局的 CSS 代碼
}

調(diào)整屏幕寬度的時候不用刷新頁面即可響應(yīng)式展示
特別適合對移動短和PC維護(hù)同一套代碼的時候
缺點: 由于移動端和PC端維護(hù)同一套代碼, 所以代碼量比較大,維護(hù)不方便

4.1移動端適配二 (rem)

在說明使用rem適配時,需要先說明一個等比縮放問題,因為在我們開發(fā)過程中,UI設(shè)計圖片 一般是750 * xxx的或者1125 * xxx的大小,所以我們需要對設(shè)計師提供的圖片進(jìn)行等比縮放, 這樣才能1:1還原設(shè)計圖片

  • 如果等比例縮放 ?

如果是 750 * xxx 的圖片,我們自己定義一個 平均的分?jǐn)?shù)
比如: 750設(shè)計圖片分為10份, 那么每一份的大小就是75px
那么在目標(biāo)手機(jī)屏幕上與之對應(yīng)的分?jǐn)?shù)應(yīng)該 :
375屏幕也分為10份, 那么每一份的大小就是37.5px,我們可以根據(jù) rem 把計算出來的結(jié)果設(shè)置為 htmlfont-size = 37.5px

計算圖片的等比例大小
原始元素尺寸 / 原始圖片每一份大小 * 目標(biāo)屏幕每一份大小 = 等比縮放后的尺寸
比如:100 * 100 的圖片 等比縮放為: 100/75 * 37.5 = 46.667px;
與之對應(yīng)的rem100/75 = 1.33rem ,1rem= 37.5px

布局適配,不同的時機(jī)屏幕對應(yīng)的remfont-size不同
320的屏幕,分10份 對應(yīng)的事 font-size = 32px
375屏幕也分為10份, 那么每一份的大小就是37.5px,
414的屏幕對應(yīng)的事 font-size = 41.4px

750設(shè)計圖片分為10份, 那么每一份的大小就是75px

所以下面的布局中,只要使用到 距離計算或者寬度和高度計算時 就要換算成對應(yīng)的rem

 <style type="text/less">
        *{
            padding: 0;
            margin: 0;
        }

        @media screen and (max-width: 320px) {
            html{
                font-size: 32px;
            }
        }

        @media screen and (min-width: 375px){
            html{
                font-size: 37.5px;
            }
        }

        @media screen and(min-width:414px ){
                html{
                    font-size: 41.4px;
                }
        }

        .header {
            position: relative;
        }
        .header > img {
            width: 100%;
            height: auto;
        }
        .header > p {
            position: absolute;
            top: 80/75rem;
            left: 50%;
            transform: translateX(-50%);
            color: #fff;
            font-size: 36/75rem;
        }
        .middle,.bottom{
            height: 290/75rem;
            position: relative;
        }
        .main {
            border: 1px dashed #0d7efb;
            border-radius: 5/75rem;
            padding: 10/75rem;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);

        }
        .main > img:nth-of-type(1){
            width: 410/75rem;
            height: 270/75rem;
            vertical-align: bottom;
        }

        .main > img:nth-of-type(2){
            position: absolute;
            top: 60/75rem;
            left: 50%;
            transform: translateX(-50%);
            width: 84/75rem;
            height: 84/75rem;
        }

        .bottom {
            margin-top: 35/75rem;
        }



    </style>

改進(jìn)(視覺偏差 和 動態(tài)的計算rem對應(yīng)的font-size)

在真實的開發(fā)中,由于不同的屏幕對應(yīng)的像素不太一樣,我們在設(shè)置CSS中對應(yīng)的是虛擬像素(對應(yīng)下圖的邏輯分辨率)和手機(jī)上真實的物理像素(對應(yīng)下圖的 分辨率) 時,有時存在偏差,
所謂的偏差就是,CSS的虛擬像素在顯示在真實手機(jī)上時,由于真實手機(jī)的分辨率可能是CSS虛擬像素的2倍或者3倍,那么對應(yīng)出來的布局可能就是 css 1px在真實手機(jī)上可能就是 4px 和 9px,因為2/3倍 擴(kuò)大至x,y軸上的像素網(wǎng)格點

iPhone各屏幕分辨率.jpg

為了解決上述問題的視覺偏差,那么對應(yīng)的視口就要進(jìn)行相應(yīng)的縮放

  • 那么如何獲取到對應(yīng)的縮放比例呢?

通過window.devicePixelRatio獲取當(dāng)前的設(shè)備像素
測試:在不同的模擬器上打印出的window.devicePixelRatio是不同的,iphone對應(yīng)的就是 上圖Scale 里面的 數(shù)字
因為圓視口對應(yīng)的事真實initial-scale= 1.0,所以我們通過通過 <meta name="viewport">initial-scale屬性來進(jìn)行 縮小,從而來解決 視覺偏差

//獲取不同手機(jī)上 進(jìn)行縮放的比例
let scale = 1.0 / window.devicePixelRatio;
//模板字符串
 let text = `<meta name="viewport" content="width=device-width, initial-scale=${scale}, maximum-scale=${scale}, minimum-scale=${scale}, user-scalable=no">`;
//寫入document對象
 document.write(text);
動態(tài)的計算rem對應(yīng)的font-size

因為沒有個對應(yīng)的手機(jī)的真實內(nèi)容的可見寬度是固定的,所以在加載的時候
根據(jù)屏幕的寬度設(shè)置自己的定義的 份數(shù) 就是 對應(yīng)的font-size,比如上述自己定義的是 10份

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

所以上述代碼的 完美適配方式為

    <script type="text/javascript">
      // 獲取不同手機(jī)上 進(jìn)行縮放的比例
        let scale = 1.0 / window.devicePixelRatio;
   //設(shè)置模板字符串
        let text = `<meta name="viewport" content="width=device-width, initial-scale=${scale}, maximum-scale=${scale}, minimum-scale=${scale}, user-scalable=no">`;
//寫入document對象
        document.write(text);
  //動態(tài)設(shè)置 fontSize 
        document.documentElement.style.fontSize = window.innerWidth / 10 + "px";
    </script>
 

對應(yīng)上述代碼的CSS設(shè)置,刪除 @media對應(yīng)的媒體適配

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容