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

資訊專欄INFORMATION COLUMN

響應(yīng)式布局方案

lowett / 1793人閱讀

摘要:說(shuō)到響應(yīng)式布局方案,我們首先需要了解視口這個(gè)概念視口在早期的時(shí)候我們沒(méi)有專門(mén)針對(duì)手機(jī)尺寸寫(xiě)的頁(yè)面,所以在用手機(jī)瀏覽頁(yè)面的時(shí)候我們看到的都是專門(mén)針對(duì)端的頁(yè)面,在這種情況下頁(yè)面會(huì)被嚴(yán)重壓縮,而且會(huì)極大的影響頁(yè)面的結(jié)構(gòu)和布局,為了解決這個(gè)問(wèn)題,蘋(píng)

說(shuō)到響應(yīng)式布局方案,我們首先需要了解視口這個(gè)概念

視口

在早期的時(shí)候我們沒(méi)有專門(mén)針對(duì)手機(jī)尺寸寫(xiě)的頁(yè)面,所以在用手機(jī)瀏覽頁(yè)面的時(shí)候我們看到的都是專門(mén)針對(duì)PC端的頁(yè)面,在這種情況下頁(yè)面會(huì)被嚴(yán)重壓縮,而且會(huì)極大的影響頁(yè)面的結(jié)構(gòu)和布局,為了解決這個(gè) 問(wèn)題,蘋(píng)果公司提出了視口的概念,因?yàn)槲覀冊(cè)缙诘腜C端的頁(yè)面的版心一般是960px,為了容納這個(gè)頁(yè)面,我們?cè)谑謾C(jī)建立一個(gè)虛擬的區(qū)域,大小一般為980px,來(lái)容納PC的頁(yè)面,以方便用戶來(lái)瀏覽頁(yè)面

但是在如今移動(dòng)端快速發(fā)展的時(shí)候,我們有了專門(mén)針對(duì)手機(jī)屏幕尺寸的的移動(dòng)端頁(yè)面,所以在寫(xiě)移動(dòng)端的頁(yè)面的時(shí)候我們需要調(diào)整視口的寬度,保證頁(yè)面內(nèi)容會(huì)在手機(jī)屏幕尺寸大小的頁(yè)面上進(jìn)行展示

 


 


 
 

 
媒體查詢 媒體類型

媒體查詢可以為不同的設(shè)備規(guī)定不同的樣式,常用的一般有三種設(shè)備 screen(計(jì)算機(jī)屏幕,該值是默認(rèn)值)、print(打印預(yù)覽)、all(所有設(shè)備)

@media screen
媒體屬性

媒體屬性用來(lái)規(guī)定在指定的符合某些條件的情況下為指定的元素設(shè)置樣式,需要注意媒體屬性必須用()包起來(lái),否則無(wú)效,常用的媒體屬性有

width    可視區(qū)域?qū)挾龋≈蹈袷綖橹付▽挾然蛘叻秶? @media (width: 900px){ }
height 可視區(qū)域高度,取值格式為指定寬度或者范圍,如 @media (max-height: 900px){ }
device-width 設(shè)備寬度,取值格式為指定寬度或者范圍,如 @media (max-device-width: 5000px) { }
device-height 設(shè)備高度 取值格式為指定寬度或者范圍,如 @media (max-device-height: 5000px) { }
orientation 設(shè)備是豎屏還是橫屏模式,可選值有l(wèi)andscape(橫屏)、portrait(豎屏),如 @media (orientation: landscape) { }
aspect-ratio 可視區(qū)域?qū)捀弑龋≈蹈袷綖樗较袼?垂直像素,如@media (device-aspect-ratio:16/9) { }
device-aspect-ratio 設(shè)備寬高比,取值格式為水平像素/垂直像素,如@media (device-aspect-ratio:16/9) { }

例如我們要針對(duì)某個(gè)設(shè)備的body在橫屏?xí)r設(shè)置的背景顏色是黑色,在豎屏的時(shí)候背景是白色,那么可以使用以下寫(xiě)法

html, body {
    height: 100%;
    }
@media  (orientation: landscape) {
    body{
        background-color:#000;
    }
}
@media  (orientation: portrait) {
    body{
        background-color:#fff;
    }
}
邏輯操作符

媒體查詢可以使用三種操作符,通過(guò)操作符配合媒體屬性來(lái)判斷是否載入媒體屬性下的樣式表

and 將每一個(gè)條件組合起來(lái),只有當(dāng)所有條件都成立時(shí)條件才成立,可以理解為JavaScript中的&

not 對(duì)媒體查詢的條件取反

or 只要有一個(gè)媒體屬性條件成立就成立,可以理解為JavaScript中的||

配合邏輯操作符設(shè)置設(shè)備在可視窗口大小變化時(shí)背景顏色發(fā)生改變

html,body{
    height: 100%;
}
    
@media screen and (max-width: 500px ){
    body{
        background-color: skyblue;
    }
}
@media screen and (min-width: 501px) and (max-width: 800px){
    body{
        background-color: #ccc;
    }
}
@media screen and (min-width: 900px){
    body{
        background-color: yellowgreen;
    }
}
vw、vh布局方案

在CSS3規(guī)范中引入了vwvh單位,分別將視口劃分為100份,一個(gè)vw單位相當(dāng)于視口寬度的1%,一個(gè)vh相當(dāng)于視口高度的1%,需要注意的是不同于百分比的布局方案,vw和vh不受父元素寬高的影響,只由視口的大小決定
同時(shí)還有兩個(gè)單位vmaxvmin,vmax表示取視口寬度和高度中比較大的值,將其等分為100份,vmin表示取比較小的值,將其等分為100份




    
    
    
    
    vw、vh


目前瀏覽器的支持情況

rem布局

rem是css中的一個(gè)單位,是根據(jù)根字體大小來(lái)設(shè)定的,也就是html的font-size

在正常的UI設(shè)計(jì)稿件的時(shí)候一般設(shè)置大小為640/750px大小,我們一般選擇將稿件等分為20份(20份在設(shè)備大小和稿件大小一般可以除盡,我們盡量避免出現(xiàn)小數(shù))

那么如果UI稿件為640px大小,每一份的大小為32px,假設(shè)UI稿件上有一個(gè)160*160大小的元素,那么該元素占整個(gè)頁(yè)面的160/32份

同時(shí)我們也將屏幕分為20份,以Iphon為例(屏幕大小為320px),那么每份大小為16px,我們通過(guò)媒體查詢將html根字體大小設(shè)置為16px,那么在UI稿件上160px大小的元素在Iphon5上的實(shí)際大小為160/32 rem,那么通過(guò)這個(gè)公式我們就可以通過(guò)JavaScript設(shè)置不同的根節(jié)點(diǎn)字體大小來(lái)進(jìn)行適配

我們來(lái)寫(xiě)一個(gè)簡(jiǎn)單的例子

(function (doc, win) {
       var docEl = doc.documentElement,
/*
          document.documentElement
          返回文檔的根節(jié)點(diǎn)
        * orientationchange 在用戶移動(dòng)端設(shè)備屏幕垂直或水平旋轉(zhuǎn)移動(dòng)設(shè)備時(shí)被觸發(fā)
        * resize 事件,在綁定元素大小發(fā)生變化時(shí)觸發(fā)該事件,例如檢測(cè)屏幕變化:
        * window.addEventLisenter("resize",function(){
        *      alert("屏幕大小變化了")
        * })
        *
        * resize 屬性,css3新增屬性,用來(lái)指定用戶是否可以縮放該元素
        * none:用戶無(wú)法調(diào)整該元素尺寸
        * both:用戶可以調(diào)整元素的高度和寬度
        * horizontal:用戶可調(diào)整元素的寬度
        * vertical:用戶可調(diào)整元素的寬度
        * */
           resizeEvt = "orientationchange" in window ? "orientationchange" : "resize",
           recalc = function () {
               var clientWidth = docEl.clientWidth;
               if (clientWidth >= 640) {
                   clientWidth = 640
               }
               if (!clientWidth) return;

               docEl.body.style.fontSize = (clientWidth / 640) * 100 + "px";
           };
       win.addEventListener("resizeEvt", recalc, false);
/*
         * DOMContentLoaded 該事件會(huì)在load事件之前觸發(fā),在DOM樹(shù)構(gòu)建完成時(shí)就觸發(fā)
         * 而load事件則是在DOMContentLoaded事件觸發(fā)之后,繼續(xù)加載圖片等外部文件完成后觸發(fā)
         * */
       doc.addEventListener("DOMContentLoaded", recalc, false)
   })(document, window)

之前一直在使用手淘的rem布局方案,可以大概看一下源碼

;(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 = {});

        if (metaEl) {

            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));
                }
            }
        }
        //如果用戶自定了name="viewport"的meat標(biāo)簽,那么通過(guò)match獲取用戶設(shè)置的initial-scale,也就是縮放級(jí)別,然后獲得設(shè)置dpr
        //如果用戶沒(méi)有設(shè)定name="viewport"的meat標(biāo)簽,那么獲取flexible.js自身定義的縮放級(jí)別來(lái)設(shè)置dpr


        if (!dpr && !scale) {
            //檢測(cè)的當(dāng)前設(shè)備的版本
            var isAndroid = win.navigator.appVersion.match(/android/gi);
            var isIPhone = win.navigator.appVersion.match(/iphone/gi);

            var devicePixelRatio = win.devicePixelRatio;
            //window.devicePixelRatio 該屬性返回當(dāng)前顯示設(shè)備的物理像素分辨率與css像素分辨率的比值
            //可以通過(guò)重寫(xiě)window.devicePixelRatio來(lái)更改此屬性,例如window.devicePixelRatio=2;

            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;
        }

        docEl.setAttribute("data-dpr", dpr);
        //判斷頁(yè)面是否存在 metaEl
        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);
            }
        }

        function refreshRem(){
            var width = docEl.getBoundingClientRect().width;
            //getBoundingClientRect
            //返回一個(gè)DOMRect對(duì)象,包含一組矩形的集合,該集合內(nèi)是與該元素相關(guān)的css邊框集合

            // DOMRect
            // bottom:8
            // height:8
            // left:0
            // right:520
            // top:0
            // width:520
            // x:0
            // y:0

            if (width / dpr > 540) {
                width = 540 * dpr;
            }
            //手淘的布局方案默認(rèn)將屏幕分成十份,當(dāng)然,如果愿意我們可以對(duì)其進(jìn)行更改
            var rem = width / 10;
            docEl.style.fontSize = rem + "px";
            flexible.rem = win.rem = rem;
        }
        // resize 在設(shè)備寬度發(fā)生改變時(shí)觸發(fā)
        win.addEventListener("resize", function() {
            clearTimeout(tid);
            tid = setTimeout(refreshRem, 300);
        }, false);
        //pageshow firefox/open的一個(gè)事件,在chrome中不會(huì)觸發(fā)
        //在頁(yè)面后退時(shí)靜態(tài)資源會(huì)直接重緩存中讀取
        win.addEventListener("pageshow", function(e) {
            if (e.persisted) {
                clearTimeout(tid);
                tid = setTimeout(refreshRem, 300);
            }
        }, false);
        //document.readyState 描述文檔的加載狀態(tài)

        // loding 文檔仍然在加載中
        // interactive 文檔已經(jīng)加載完成并已經(jīng)被解析,但是圖像,框架之類的資源仍然在加載中
        // complete 說(shuō)有資源都已經(jīng)加載完成,load事件即將被觸發(fā)
        // 在狀態(tài)改變時(shí)document.readyState事件將被觸發(fā)

        if (doc.readyState === "complete") {
            doc.body.style.fontSize = 12 * dpr + "px";
        } else {
            //DOMContentLoaded 在文檔加載完成后觸發(fā),不會(huì)等待圖像,框架等資源,參考$(function(){}) / $.ready()
            doc.addEventListener("DOMContentLoaded", function(e) {
                doc.body.style.fontSize = 12 * dpr + "px";
            }, false);
        }


        refreshRem();

        flexible.dpr = win.dpr = dpr;
        flexible.refreshRem = refreshRem;
        //rem 2 px  轉(zhuǎn)化方法
        flexible.rem2px = function(d) {
            var val = parseFloat(d) * this.rem;
            if (typeof d === "string" && d.match(/rem$/)) {
                val += "px";
            }
            return val;
        }
        //px 2 rem  轉(zhuǎn)化方法
        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"] = {}));

手淘的布局方法主要是通過(guò)dpr來(lái)設(shè)置不同屏幕下的不同比例關(guān)系,drp指的是默認(rèn)縮放為100%的情況下設(shè)備像素和CSS像素的比值

dpr=設(shè)備像素 / CSS像素

具體的關(guān)于dpr的解釋可以看下面這篇文章

移動(dòng)web開(kāi)發(fā)之像素和DPR

如果使用手淘的布局方案注意一個(gè)問(wèn)題,我們需要去除頁(yè)面中設(shè)置了name=viewportmeta標(biāo)簽,在源碼中我們可以看到如果存在改標(biāo)簽,那么lib-flexible不會(huì)動(dòng)態(tài)改變縮放比例

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

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

相關(guān)文章

  • 響應(yīng)布局的實(shí)現(xiàn)

    摘要:響應(yīng)式布局的概念響應(yīng)式布局,即,在實(shí)現(xiàn)不同屏幕分辨率的終端上瀏覽網(wǎng)頁(yè)的不同展示方式。框架實(shí)現(xiàn)響應(yīng)式布局利用中柵格系統(tǒng)可以簡(jiǎn)單實(shí)現(xiàn)響應(yīng)式布局,這里就需要去理解一下啥是柵格系統(tǒng)代表在端上顯示在一行的個(gè)柵欄,也就是一半。 響應(yīng)式布局的概念 響應(yīng)式布局,即 Responsive design,在實(shí)現(xiàn)不同屏幕分辨率的終端上瀏覽網(wǎng)頁(yè)的不同展示方式。通過(guò)響應(yīng)式設(shè)計(jì)能使網(wǎng)站在手機(jī)和平板電腦上有更好的瀏...

    syoya 評(píng)論0 收藏0
  • CSS及布局

    摘要:經(jīng)過(guò)半年的打磨,正式發(fā)布,主要是新增了一些常用組件,并使用命名,為接下來(lái)的微信小程序開(kāi)發(fā)做好準(zhǔn)備。這兩種方式實(shí)現(xiàn)的瀑布流式布局均支持首屏和網(wǎng)頁(yè)窗口大小改變時(shí)的列數(shù)自適應(yīng)。主要是對(duì)于標(biāo)準(zhǔn)里的布局方式草案中的布局方式進(jìn)行一些總結(jié)。 一勞永逸的搞定 flex 布局 尋根溯源話布局 一切都始于這樣一個(gè)問(wèn)題:怎樣通過(guò) CSS 簡(jiǎn)單而優(yōu)雅的實(shí)現(xiàn)水平、垂直同時(shí)居中。記得剛開(kāi)始學(xué)習(xí) CSS 的時(shí)候,看...

    jaysun 評(píng)論0 收藏0
  • 不規(guī)則圖片列表實(shí)現(xiàn)響應(yīng)布局

    摘要:優(yōu)點(diǎn)在于響應(yīng)式布局非常方便,都是按照比例進(jìn)行的縮放,弊端是在于如果圖片不規(guī)則,那么圖片變形是難免的。一次布局多終端友好 技術(shù)開(kāi)發(fā)和實(shí)際運(yùn)營(yíng)總是有很大差別的,比如常見(jiàn)的圖片列表,一般設(shè)計(jì)圖上都是固定尺寸大小的,但是實(shí)際操作起來(lái)并沒(méi)有太多人去ps修剪圖片到知道的尺寸,大部分都是差不多比例的圖片就直接上傳了,為了解決不規(guī)則圖片列表展示問(wèn)題有相應(yīng)的解決方案例如瀑布流,或者相冊(cè)等,但是對(duì)于多終端...

    ASCH 評(píng)論0 收藏0
  • 不規(guī)則圖片列表實(shí)現(xiàn)響應(yīng)布局

    摘要:優(yōu)點(diǎn)在于響應(yīng)式布局非常方便,都是按照比例進(jìn)行的縮放,弊端是在于如果圖片不規(guī)則,那么圖片變形是難免的。一次布局多終端友好 技術(shù)開(kāi)發(fā)和實(shí)際運(yùn)營(yíng)總是有很大差別的,比如常見(jiàn)的圖片列表,一般設(shè)計(jì)圖上都是固定尺寸大小的,但是實(shí)際操作起來(lái)并沒(méi)有太多人去ps修剪圖片到知道的尺寸,大部分都是差不多比例的圖片就直接上傳了,為了解決不規(guī)則圖片列表展示問(wèn)題有相應(yīng)的解決方案例如瀑布流,或者相冊(cè)等,但是對(duì)于多終端...

    linkFly 評(píng)論0 收藏0
  • 真的,移動(dòng)端尺寸自適應(yīng)與dpr無(wú)關(guān)

    摘要:做移動(dòng)端自適應(yīng)時(shí)可能很多人都對(duì)自適應(yīng)和之間的關(guān)系產(chǎn)生疑問(wèn)也有一些人會(huì)疑慮比如我的自適應(yīng)方案沒(méi)有加會(huì)不會(huì)出問(wèn)題針對(duì)這些疑問(wèn)我說(shuō)一下我的見(jiàn)解。 做移動(dòng)端自適應(yīng)時(shí)可能很多人都對(duì)自適應(yīng)和dpr之間的關(guān)系產(chǎn)生疑問(wèn),也有一些人會(huì)疑慮比如我的自適應(yīng)方案沒(méi)有加dpr會(huì)不會(huì)出問(wèn)題,針對(duì)這些疑問(wèn)我說(shuō)一下我的見(jiàn)解。 1. 什么是尺寸自適應(yīng) 首先標(biāo)題說(shuō)的自適應(yīng),可能自適應(yīng)在不同人眼里理解不同,特別與響應(yīng)式的關(guān)...

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

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

0條評(píng)論

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