国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

移動(dòng)端適配方案

blastz / 2815人閱讀

摘要:布局,縮放這也是淘寶使用的方案,根據(jù)屏幕寬度設(shè)定值,需要適配的元素都使用為單位,不需要適配的元素還是使用為單位。

討論適配方案之前,先了解幾個(gè)移動(dòng)端的概念。

基礎(chǔ)概念

設(shè)備像素(device pixels):又稱為物理像素,是顯示屏的最小物理單位。在操作系統(tǒng)的調(diào)度下,每一個(gè)設(shè)備像素都有自己的顏色值和亮度值。

設(shè)備獨(dú)立像素(device independent pixels):基于計(jì)算機(jī)控制的坐標(biāo)系統(tǒng)和抽象像素(虛擬像素),由底層系統(tǒng)的程序使用,轉(zhuǎn)換為物理像素的應(yīng)用。例如meta里面設(shè)置width=device-width,這個(gè)device-width就是設(shè)備獨(dú)立像素。

在chrome里 看到的375x667 320x480等等都是設(shè)備獨(dú)立像素,其數(shù)值上等于CSS像素?cái)?shù)組。

設(shè)備像素比(device pixel ratio):簡(jiǎn)稱dpr,定義了設(shè)備像素和設(shè)備獨(dú)立像素的對(duì)應(yīng)關(guān)系,它的值可以按公式得到:設(shè)備像素比 = 設(shè)備像素/設(shè)備獨(dú)立像素

目前了解到有三種方法實(shí)現(xiàn)適配:

固定高度,寬度自適應(yīng)

利用rem布局,viewport縮放

vw適配

固定高度,寬度自適應(yīng)

垂直方向用定值,水平方向用百分比、定值、flex都行。這樣設(shè)置之后就可以不用管手機(jī)屏幕的尺寸進(jìn)行開發(fā)。該方法使用了完美視口:

但是該方法有個(gè)缺點(diǎn),由于高度固定,會(huì)導(dǎo)致頁(yè)面產(chǎn)生橫向拉伸的視覺效果。

rem布局,viewport縮放

這也是淘寶使用的方案,根據(jù)屏幕寬度設(shè)定 rem 值,需要適配的元素都使用 rem 為單位,不需要適配的元素還是使用 px 為單位。字體也需要通過CSS hack使用px為單位,因?yàn)閞em可能會(huì)導(dǎo)致字體異形或模糊。

下面為手淘源代碼解析:

;(function(win, lib) {
    var doc = win.document;
    var docEl = doc.documentElement;
    var metaEl = doc.querySelector("meta[name="viewport"]");
    var flexibleEl = doc.querySelector("meta[name="flexible"]");
    var dpr = 0;
    var scale = 0;
    var tid;
    var flexible = lib.flexible || (lib.flexible = {});
    
    //是否已經(jīng)設(shè)置了viewport的meta標(biāo)簽,若已經(jīng)設(shè)置則根據(jù)設(shè)置的initial-scale來設(shè)置scale和dpr;是否手動(dòng)設(shè)置了dpr,若已經(jīng)設(shè)置則根據(jù)設(shè)置的initial-dpr或者maximum-dpr來設(shè)置scale和dpr
    if (metaEl) {
        console.warn("將根據(jù)已有的meta標(biāo)簽來設(shè)置縮放比例");
        var match = metaEl.getAttribute("content").match(/initial-scale=([d.]+)/);
        if (match) {
            scale = parseFloat(match[1]);
            dpr = parseInt(1 / scale);
        }
    } else if (flexibleEl) {
        var content = flexibleEl.getAttribute("content");
        if (content) {
            var initialDpr = content.match(/initial-dpr=([d.]+)/);
            var maximumDpr = content.match(/maximum-dpr=([d.]+)/);
            if (initialDpr) {
                dpr = parseFloat(initialDpr[1]);
                scale = parseFloat((1 / dpr).toFixed(2));    
            }
            if (maximumDpr) {
                dpr = parseFloat(maximumDpr[1]);
                scale = parseFloat((1 / dpr).toFixed(2));    
            }
        }
    }
    
    //若沒有手動(dòng)設(shè)置scale或者dpr,則把a(bǔ)ndroid的dpr設(shè)置為1,ios按照設(shè)備的devicePixelRatio 設(shè)置。
    if (!dpr && !scale) {
        var isAndroid = win.navigator.appVersion.match(/android/gi);
        var isIPhone = win.navigator.appVersion.match(/iphone/gi);
        var devicePixelRatio = win.devicePixelRatio;
        if (isIPhone) { 
            // iOS下,對(duì)于2和3的屏,用2倍的方案,其余的用1倍方案
            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {                
                dpr = 3;
            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
                dpr = 2;
            } else {
                dpr = 1;
            }
        } else {
            // 其他設(shè)備下,仍舊使用1倍的方案
            dpr = 1;
        }
        scale = 1 / dpr;
    }
    
    //html上設(shè)置了data-dpr自定義屬性
    docEl.setAttribute("data-dpr", dpr);
    
    //設(shè)置viewport
    if (!metaEl) {
        metaEl = doc.createElement("meta");
        metaEl.setAttribute("name", "viewport");
        metaEl.setAttribute("content", "initial-scale=" + scale + ", maximum-scale=" + scale + ", minimum-scale=" + scale + ", user-scalable=no");
        if (docEl.firstElementChild) {
            docEl.firstElementChild.appendChild(metaEl);
        } else {
            var wrap = doc.createElement("div");
            wrap.appendChild(metaEl);
            doc.write(wrap.innerHTML);
        }
    }
    
    //獲取設(shè)備的width,根據(jù)width計(jì)算出rem具體出,rem代表html的fontSize
    function refreshRem(){
        var width = docEl.getBoundingClientRect().width;
        if (width / dpr > 540) {
            width = 540 * dpr;
        }
        var rem = width / 10;
        docEl.style.fontSize = rem + "px";
        flexible.rem = win.rem = rem;
    }
    // 監(jiān)聽window的resize和pageshow事件,實(shí)現(xiàn)css樣式的重繪
    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);
    
    //判斷document對(duì)象是否處于complete狀態(tài),如果完成狀態(tài)我們給body一個(gè)font-size=12*dpr的值,否則我們判斷dom加載方法來實(shí)現(xiàn)body中的font-size的設(shè)置。這個(gè)設(shè)置是為了頁(yè)面中字體的大小,而html中的font-size是為了設(shè)置頁(yè)面的height,width等屬性
    if (doc.readyState === "complete") {
        doc.body.style.fontSize = 12 * dpr + "px";
    } else {
        doc.addEventListener("DOMContentLoaded", function(e) {
            doc.body.style.fontSize = 12 * dpr + "px";
        }, false);
    }
    

    refreshRem();

    flexible.dpr = win.dpr = dpr;
    flexible.refreshRem = refreshRem;
    flexible.rem2px = function(d) {
        var val = parseFloat(d) * this.rem;
        if (typeof d === "string" && d.match(/rem$/)) {
            val += "px";
        }
        return val;
    }
    flexible.px2rem = function(d) {
        var val = parseFloat(d) / this.rem;
        if (typeof d === "string" && d.match(/px$/)) {
            val += "rem";
        }
        return val;
    }

})(window, window["lib"] || (window["lib"] = {}));

總結(jié)一下,淘寶使用的方案其實(shí)就是做了三點(diǎn):

動(dòng)態(tài)生成viewport

屏幕寬度設(shè)置 rem的大小,即給設(shè)置font-size

根據(jù)設(shè)備像素比(window.devicePixelRatio)給設(shè)置data-dpr(css hack用)

設(shè)置 rem
例如設(shè)計(jì)圖給我們的尺寸是7501000的。某個(gè)容器在設(shè)計(jì)圖的寬度是150px225px,那我們?cè)赾ss里面
寬度:150px/750px/10=150px/75px=2rem;
高度為:225px/75px=3rem;

總結(jié)一下,布局的時(shí)候,各元素的css尺寸=設(shè)計(jì)稿標(biāo)注尺寸/設(shè)計(jì)稿橫向分辨率/10。

設(shè)置viewport和data-dpr
這兩個(gè)設(shè)置都是適配高清屏幕手機(jī)的px單位。

縮放是動(dòng)態(tài)的,不同設(shè)備下的px顯示一樣的長(zhǎng)度。例如設(shè)備像素比是2,縮放為0.5,data-dpr為2;設(shè)備像素比是3,縮放為0.3333,data-dpr為3。

而data-dpr用法見下圖,字體大小最好通過下面方式設(shè)置。

[data-dpr="2"] {
  font-size: 26px;
}
[data-dpr="3"] {
  font-size: 39px;
}
vw適配

如今vw已經(jīng)得到了眾多瀏覽器的支持,因此我們可以直接考慮將vw單位運(yùn)用于我們的適配布局中。
vw是基于Viewport視窗(window.innerWidth/window.innerHeight)的長(zhǎng)度單位。
對(duì)于viewport概念,可參考文章https://www.w3cplus.com/css/v...

vw、vh與視窗的寬高度關(guān)系如下:
1vw等于window.innerWidth的1%
1vh等于window.innerHeight的1%

因此,假設(shè)以750px的設(shè)計(jì)稿為例,100vw = 750px,即1vw = 7.5px。那么我們可以根據(jù)設(shè)計(jì)圖上的px值直接轉(zhuǎn)換成對(duì)應(yīng)的vw值。我們可以使用PostCSS的插件postcss-px-to-viewport,讓我們可以直接在代碼中寫px。我們可以在一下情境下使用vw

容器適配,可以使用vw

文本的適配,可以使用vw

大于1px的邊框、圓角、陰影都可以使用vw

內(nèi)距和外距,可以使用vw

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97498.html

相關(guān)文章

  • rem, vw, 還是...? 各憑本事的移動(dòng)適配方案

    摘要:另一種就是不縮放,對(duì)等問題單獨(dú)引入處理方案。彩蛋部分相信大多數(shù)同學(xué)也是有想法在實(shí)際開發(fā)中把融入到現(xiàn)有的移動(dòng)端適配方案中的。 前言 2018年最后的法定假期都已經(jīng)結(jié)束了,我相信大部分正在進(jìn)行或曾經(jīng)進(jìn)行過移動(dòng)端頁(yè)面開發(fā)的同學(xué)都或多或少的了解過使用rem進(jìn)行移動(dòng)端頁(yè)面適配的方案以及使用vw的方案,(沒了解過的同學(xué)可以參見大漠老師的這兩篇文章 使用Flexible實(shí)現(xiàn)手淘H5頁(yè)面的終端適配和再...

    wangbinke 評(píng)論0 收藏0
  • rem, vw, 還是...? 各憑本事的移動(dòng)適配方案

    摘要:另一種就是不縮放,對(duì)等問題單獨(dú)引入處理方案。彩蛋部分相信大多數(shù)同學(xué)也是有想法在實(shí)際開發(fā)中把融入到現(xiàn)有的移動(dòng)端適配方案中的。 前言 2018年最后的法定假期都已經(jīng)結(jié)束了,我相信大部分正在進(jìn)行或曾經(jīng)進(jìn)行過移動(dòng)端頁(yè)面開發(fā)的同學(xué)都或多或少的了解過使用rem進(jìn)行移動(dòng)端頁(yè)面適配的方案以及使用vw的方案,(沒了解過的同學(xué)可以參見大漠老師的這兩篇文章 使用Flexible實(shí)現(xiàn)手淘H5頁(yè)面的終端適配和再...

    tianren124 評(píng)論0 收藏0
  • 移動(dòng)適配方案

    摘要:業(yè)務(wù)環(huán)境是決定整體項(xiàng)目的適配方案的核心因素。而淘寶的主站和類似,分為移動(dòng)端頁(yè)面和端頁(yè)面,端頁(yè)面同樣有著左右的留白,這也是為了讓用戶能夠在寬屏的時(shí)候?qū)⒆⒁饬性谥虚g區(qū)域。 移動(dòng)端適配方案 移動(dòng)端適配方案是一個(gè)老生常談的話題,但是對(duì)于不同的項(xiàng)目、不同的業(yè)務(wù)場(chǎng)景可能會(huì)需要不同的適配方案來進(jìn)行移動(dòng)端適配,向下兼容的baseline也需要提前訂好。 整體寬高 其實(shí)移動(dòng)端適配就和下面的玩具一樣,...

    feng409 評(píng)論0 收藏0
  • 我對(duì)移動(dòng)適配的了解

    摘要:隨著移動(dòng)端的發(fā)展,在手機(jī)上看電腦端的頁(yè)面已成為非常普及現(xiàn)象。方案一固定高度,使其寬度自適應(yīng)這也是我接觸移動(dòng)端適配第一次使用的方案。 不知不覺做前端已經(jīng)兩年了,從PC端,移動(dòng)端,微信小程序一路走來到今天剛剛開放注冊(cè)的快應(yīng)用(手機(jī)廠商對(duì)抗小程序的新技能,所以在注冊(cè)時(shí)用的是qq郵箱的話要去垃圾箱里才能找到注冊(cè)郵件),對(duì)于前端圈日新月異的磅礴發(fā)展對(duì)于大前端發(fā)展是喜聞樂見的,這次的快應(yīng)用的手機(jī)廠...

    import. 評(píng)論0 收藏0
  • 我對(duì)移動(dòng)適配的了解

    摘要:隨著移動(dòng)端的發(fā)展,在手機(jī)上看電腦端的頁(yè)面已成為非常普及現(xiàn)象。方案一固定高度,使其寬度自適應(yīng)這也是我接觸移動(dòng)端適配第一次使用的方案。 不知不覺做前端已經(jīng)兩年了,從PC端,移動(dòng)端,微信小程序一路走來到今天剛剛開放注冊(cè)的快應(yīng)用(手機(jī)廠商對(duì)抗小程序的新技能,所以在注冊(cè)時(shí)用的是qq郵箱的話要去垃圾箱里才能找到注冊(cè)郵件),對(duì)于前端圈日新月異的磅礴發(fā)展對(duì)于大前端發(fā)展是喜聞樂見的,這次的快應(yīng)用的手機(jī)廠...

    snowLu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<