時(shí)間:2023-09-03 02:48:02 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-09-03 02:48:02 來源:網(wǎng)站運(yùn)營
響應(yīng)式布局,你需要知道的一切:2011年,Google 發(fā)布了 Android 4.0,在經(jīng)歷了 Cupcake,Donut,F(xiàn)royo 等多個(gè)甜品名稱版本的迭代后,安卓終結(jié)了 Symbian(塞班)的霸主地位,迅速占領(lǐng)了手機(jī)市場(chǎng)躍居全球第一。同年,騰訊發(fā)布了微信開始進(jìn)軍移動(dòng)互聯(lián)網(wǎng),阿里也在 2013 年宣布 ALL IN 無線,隨著智能設(shè)備的普及和移動(dòng)互聯(lián)網(wǎng)時(shí)代的到來,響應(yīng)式布局這個(gè)詞開始頻繁地出現(xiàn)在 Web 設(shè)計(jì)和開發(fā)領(lǐng)域,作為一名優(yōu)秀的前端攻城獅,要將極致的用戶體驗(yàn)和最佳的工程實(shí)踐作為探索的目標(biāo) ): balabala...最近一門新興的學(xué)科“響應(yīng)式建筑(responsive architecture)”開始在探討物理空間根據(jù)流動(dòng)于其中的人進(jìn)行響應(yīng)的方法。建筑師們通過把嵌入式機(jī)器人與可拉伸材料結(jié)合的方法,嘗試藝術(shù)裝置和可彎曲、伸縮和擴(kuò)展的墻體結(jié)構(gòu),達(dá)到根據(jù)接近人群的情況變化的效果。運(yùn)動(dòng)傳感器與氣候控制系統(tǒng)相結(jié)合,調(diào)整圍繞人們周圍的房間的溫度以及環(huán)境照明。已經(jīng)有公司制造了“智能玻璃技術(shù)”,當(dāng)室內(nèi)人數(shù)達(dá)到一定的閥值時(shí),它可以自動(dòng)變?yōu)椴煌该鳡顟B(tài),為人們提供更多隱私保護(hù)Web 響應(yīng)式設(shè)計(jì)的理念與之非常相似,只不過在這里,
1 css px = 3 * 3 device px // IPhone X 中,1 個(gè) CSS 像素對(duì)應(yīng) 3*3 的 9 個(gè)設(shè)備像素點(diǎn)復(fù)制代碼
而上面這個(gè)比值 3 就是設(shè)備像素比(Device Pixel Ratio,簡(jiǎn)稱 DPR)。window.devicePixelRatio // IPhone X 中等于 3,IPhone 6/7/8 中等于 2,Web 網(wǎng)頁為 1復(fù)制代碼
像素是一個(gè)固定單位,一般我們不會(huì)使用固定像素來做響應(yīng)式布局,但是你需要了解他。相反,響應(yīng)式布局里經(jīng)常會(huì)用到相對(duì)單位,比如 EM。font-size
,p { font-size: 16px; padding: 1em; /* 1em = 16px */}復(fù)制代碼
如果元素沒有顯式地設(shè)置 font-size
,那么 1em
等于多少呢?em
沒啥關(guān)系,這里跟 font-size
的計(jì)算規(guī)則相關(guān),回顧一下。如果元素沒有設(shè)置 font-size
,會(huì)繼承父元素的 font-size
,如果父元素也沒有,會(huì)沿著 DOM 樹一直向上查找,直到根元素 html
,根元素的默認(rèn)字體大小為 16px。EM
,REM
就很簡(jiǎn)單了。rem
就等于根元素 html
的字體大小,html { font-size: 14px;}p { font-size: 1rem; /* 1rem = 14px */}復(fù)制代碼
所以,如果我們改變根元素的字體大小,頁面上所有使用 rem
的元素都會(huì)被重繪。html
的字體大小,所以 REM 的使用更加廣泛一些PostCSS
插件在基于 Webpack 構(gòu)建的項(xiàng)目中自動(dòng)轉(zhuǎn)換的例子,var px2rem = require('postcss-px2rem');module.exports = { module: { loaders: [ { test: //.css$/, loader: "style-loader!css-loader!postcss-loader" } ] }, postcss: function() { return [px2rem({remUnit: 75})]; }}復(fù)制代碼
我們已經(jīng)有響應(yīng)式單位了,接下來要怎么讓頁面支持響應(yīng)式布局呢?viewport
。viewport
的文章,viewport
最先由 Apple 引入,用于解決移動(dòng)端頁面的顯示問題,通過一個(gè)叫 <meta>
的 DOM 標(biāo)簽,允許我們可以定義視口的各種行為,比如寬度,高度,初始縮放比例等,<!-- 下面的 meta 定義了 viewport 的寬度為屏幕寬度,單位是 CSS 像素,默認(rèn)不縮放 --><meta name="viewport" content="width=device-width, initial-scale=1">復(fù)制代碼
Peter-Paul Koch 在文章中將移動(dòng)瀏覽器的視口分為三種。viewport meta
標(biāo)簽,它可以創(chuàng)建一個(gè)虛擬的布局視口(layout viewport
),這個(gè)視口的分辨率接近于 PC 顯示器。這樣一來,由于兩者的寬度趨近,CSS只需要像在PC上那樣渲染頁面就行,原有的頁面結(jié)構(gòu)也基本不會(huì)被破壞。layout viewport
是一個(gè)固定的值,由瀏覽器廠商設(shè)定,document
獲取布局視口的寬度和高度,var layoutViewportWidth = document.documentElement.clientWidthvar layoutViewportHeight = document.documentElement.clientHeight復(fù)制代碼
visual viewport
,我們就可以實(shí)現(xiàn)網(wǎng)頁的拖拽和縮放了,為什么?visual viewport
上,創(chuàng)建一個(gè)寬為 980px 的 layout viewport
,于是用戶可以在 visual viewport
中拖動(dòng)或縮放網(wǎng)頁來獲得更好的瀏覽體驗(yàn)。window
獲取,var visualViewportWidth = window.innerWidthvar visualViewportHeight = window.innerHeight復(fù)制代碼
meta
設(shè)置將布局視口轉(zhuǎn)換為理想視口,<meta name="viewport" content="width=device-width">復(fù)制代碼
<meta>
進(jìn)行設(shè)置,viewport
元標(biāo)簽的取值有 6 種,vw
和 vh
的支持相對(duì)較晚,在 Android 4.4 以下的瀏覽器中可能沒辦法使用,下面是來自 Can I use 完整的兼容性統(tǒng)計(jì)數(shù)據(jù),vw
和 vh
常被用于布局,因?yàn)樗鼈兪窍鄬?duì)于視口的,<!-- 假設(shè)我們?cè)O(shè)置視口為完美視口,這時(shí)視口寬度就等于設(shè)備寬度,CSS 像素為 375px --><meta name="viewport" content="width=device-width, initial-scale=1"><style> p { width: 10vw; /* 10vw = 1% * 10 * 375px = 37.5px */ }</style>復(fù)制代碼
我們說百分比也可以用來設(shè)置元素的寬高,它和 vw
,vh
的區(qū)別是什么?FlexBox
的支持已經(jīng)相對(duì)完善,下面是 Can I use FlexBox 完整的兼容性情況,FlexBox
里的兩個(gè)角色:容器和子元素。display
屬性為 flex
,就可以將一個(gè)元素設(shè)置為 FlexBox
容器,我們可以通過定義它的屬性,決定子元素的排列方式,屬性可選值有 6 種,FlexBox
基于軸線,只能解決一維場(chǎng)景下的布局,作為補(bǔ)充,W3C 在后續(xù)提出了網(wǎng)格布局(CSS Grid Layout),網(wǎng)格將容器再度劃分為 “行” 和 “列”,產(chǎn)生單元格,項(xiàng)目(子元素)可以在單元格內(nèi)組合定位,所以網(wǎng)格可以看作二維布局。Grid
的實(shí)現(xiàn)中,通常會(huì)使用到媒體查詢,這也是響應(yīng)式布局的核心技術(shù)。min-width
時(shí)應(yīng)用樣式max-width
時(shí)應(yīng)用樣式portrait
| landscape
,當(dāng)前設(shè)備的方向min-width
和 max-width
取值的過程,稱為設(shè)備斷點(diǎn)選擇,它可能取決于產(chǎn)品設(shè)計(jì)本身,下面是 百度 Web 生態(tài)團(tuán)隊(duì) 總結(jié)的一套比較具有代表性的設(shè)備斷點(diǎn),/* 很小的設(shè)備(手機(jī)等,小于 600px) */@media only screen and (max-width: 600px) { }/* 比較小的設(shè)備(豎屏的平板,屏幕較大的手機(jī)等, 大于 600px) */@media only screen and (min-width: 600px) { }/* 中型大小設(shè)備(橫屏的平板, 大于 768px) */@media only screen and (min-width: 768px) { }/* 大型設(shè)備(電腦, 大于 992px) */@media only screen and (min-width: 992px) { }/* 超大型設(shè)備(大尺寸電腦屏幕, 大于 1200px) */@media only screen and (min-width: 1200px) { }復(fù)制代碼
如果你需要對(duì)細(xì)分屏幕大小進(jìn)行適配,ResponsiveDesign 站點(diǎn)上的這篇文章 Media queries for common device breakpoints 可能會(huì)有所幫助。16px
,行高大于 1.2em
。p { font-size: 16px; line-height: 1.2em; /* 1.2em = 19.2px */}復(fù)制代碼
我的大部分性能優(yōu)化工作都集中在 JavaScript 和 CSS 上,從早期的 Move Scripts to the Bottom 和 Put Stylesheets at the Top 規(guī)則。為了強(qiáng)調(diào)這些規(guī)則的重要性,我甚至說過,“JS 和 CSS 是頁面上最重要的部分”。幾個(gè)月后,我意識(shí)到這是錯(cuò)誤的。圖片才是頁面上最重要的部分。圖片幾乎占了網(wǎng)頁流量消耗的 60%,雅虎軍規(guī)和 Google 都將圖片優(yōu)化作為網(wǎng)頁優(yōu)化不可或缺的環(huán)節(jié),除了圖片性能優(yōu)化外,響應(yīng)式圖片無疑帶來更好的用戶體驗(yàn)。
viewport
,可以通過設(shè)置元素的最大寬度進(jìn)行限制,img { max-width: 100%;}復(fù)制代碼
類似的,相同的規(guī)則也應(yīng)該用于一些其他的嵌入式元素,比如 embed,object,video 等。srcset
和 sizes
屬性,對(duì)于兼容性不好的瀏覽器,會(huì)繼續(xù)使用默認(rèn) src
屬性中的圖片,所以我們可以放心大膽的使用。<!-- 響應(yīng)式圖片 --><img srcset="example-320w.jpg 320w, example-480w.jpg 480w, example-800w.jpg 800w" sizes="(max-width: 320px) 280px, (max-width: 480px) 440px, 800px" src="example-800w.jpg" alt="An example image">復(fù)制代碼
如果我們書寫了上面代碼中的圖片,瀏覽器會(huì)根據(jù)下面的順序加載圖片,srcset
中最接近這個(gè)尺寸的圖片并顯示HTML5
標(biāo)準(zhǔn)中的 picture
標(biāo)簽實(shí)現(xiàn)類似的效果,<picture> <source media="(max-width: 799px)" srcset="example-480w-portrait.jpg"> <source media="(min-width: 800px)" srcset="example-800w.jpg"> <img src="example-800w.jpg" alt="An example img"></picture>復(fù)制代碼
關(guān)鍵詞:布局,響應(yīng)
客戶&案例
營銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。