說到移動端適配,首先我們需要先搞清楚一些基礎知識,所以本文路線是先了解畫素,dpr,視口等基礎知識,然後再整理出移動端適配方案。
畫素其實分為兩種,分別是物理畫素和css畫素
物理畫素(裝置畫素)
物理畫素,顧名思義,顯示屏是由乙個個物理畫素點組成的,通過控制每個畫素點的顏色,使螢幕顯示出不同的影象,螢幕從工廠出來那天起,它上面的物理畫素點就固定不變了,單位pt。
通常我們看一些電子裝置的引數,比如解析度用的就是物理畫素。它配合螢幕尺寸(注意:螢幕尺寸通常是說螢幕的對角線長度),可以計算出ppi(每英吋畫素取值),即每一英吋物理畫素數量。ppi越高,說明螢幕能提供更多細節。
css畫素
css和js使用的抽象單位,瀏覽器內的一切長度都是以css畫素為單位的,css畫素的單位是px。
物理畫素和css畫素之間的關係(***x,dpr)
在非高清屏及未縮放的狀態下,乙個css畫素等於乙個物理畫素,而在一些ppi非常高的螢幕(例如蘋果的視網膜螢幕)上,如果還讓乙個css畫素等於乙個物理畫素,就會導致網頁上的元素變得非常小,因此高ppi屏下,通常乙個css畫素等於兩個甚至三個物理畫素(由瀏覽器廠商決定,不同瀏覽器設定的值可能不同)。如果乙個css畫素占用n個物理畫素,那麼我們就說此時的***x(dots per px)為n。
所以,我們可以用***x描述物理畫素和css畫素之間的關係。***x除了和ppi有關,也和當前縮放狀態有關,舉個例子,在非高清屏下,如果沒縮放,乙個css畫素占用乙個物理畫素,此時是1***x,但如果將頁面放大到200%,此時乙個css畫素等於兩個物理畫素,即2***x。
dpr(裝置畫素比,devicepixelratio)描述的是未縮放狀態下,物理畫素和css畫素的初始比例關係,計算方法如下圖。
dpr由瀏覽器廠商決定,我們無法修改,但可以通過window.devicepixelratio讀取dpr。
可能有人疑問dpr和***x到底啥關係,我們可以認為dpr描述的是未縮放狀態,而***x可以描述任意時刻的狀態,未縮放狀態下的***x和dpr相等,當有縮放操作時,此時的物理畫素和css畫素的比例關係就只能用***x描述了。
視口也叫作初始包含塊,之所以叫這個名字,是因為它包含了元素,它的寬度是所有css百分比寬度推算的根源。
在桌面瀏覽器,視口的寬度等同於瀏覽器視窗的寬度,高度即為瀏覽器視窗的高度。但移動端就有點複雜了,移動端的視口分為布局視口和視覺視口。
布局視口(layout viewport)
說布局視口之前,我們先說一下桌面端的頁面放到移動端瀏覽器後出現的問題:由於早期的頁面很多採用固定寬度的布局,導致放在移動端的小視窗下出現橫向的滾動條,不便於使用者檢視,所以瀏覽器廠商研究出了布局視口。布局視口的寬度一般在768px~1024px(由瀏覽器廠商設定),常見寬度980px,雖然設定了很大的寬度,但在沒有手動設定寬度的情況下,布局視口仍會容納在一屏裡(說白了,就是把980px的東西裝在320px的螢幕裡),這樣,瀏覽器會避免出現橫向滾動條。
設定布局視口寬度:"viewport" content="width=640">
獲取布局視口寬度:document.documentelement.clientwidth
布局視口除了和meta設定的width有關,還和scale有關,scale後面會說。
視覺視口(visual viewport)
使用者正在看到的網頁的區域,大小是螢幕中css畫素的數量。
獲取視口寬度:window.innerwidth/height
初始狀態下,一般視覺視口會等於布局視口。
理想視口
當布局視口的寬度達到理想狀態時,就是理想視口,理想視口中的頁面有最理想的寬度,使用者進入頁面不用縮放。
實現方法:
name="viewport"
content="width=device-width">(即設定布局視口寬度為裝置寬度)
原理:可以理解為修改***x,舉個例子,假設一螢幕dpr為2,即1px對應2pt,如果這個時候,我們設定scale=0.5,那麼***x就會從2變成1,即1px對應1pt。所以,通過縮放我們可以調整自己所能控制的最小物理畫素粒度。
縮放會影響布局視口的大小,因為瀏覽器會盡量讓布局視口鋪滿螢幕,所以當我們設定scale=0.5時,布局視口的寬度會自動變為原來的兩倍。
具體如下圖所示。
name="viewport"
content="width=device-width,initial-scale=1.0">
console.log(document.documentelement.clientwidth); //結果為375
script>
name="viewport"
content="width=device-width,initial-scale=0.5">
console.log(document.documentelement.clientwidth); //結果為750
script>
可能有人會問,scale的初始值是多少?其實這取決於viewport的寬度,因為瀏覽器會盡量讓布局視口鋪滿全屏,所以瀏覽器會根據布局視口的大小動態調整scale的初始值大小,從而使布局視口鋪滿全屏。
使用縮放的好處:對於dpr為2或更高的螢幕,如果不做縮放操作,我們所能控制的最小物理畫素粒度是2pt或更多物理畫素,這樣帶來了兩個問題。
解決這兩個問題的方法就是縮放,我們把scale設定為1/dpr。
meta.setattribute('content', 'initial-scale=' + 1/dpr + ', maximum-scale=' + 1/dpr + ', minimum-scale=' + 1/dpr + ', user-scalable=no');
這樣1px就對應1pt,我們就可以解決1px border問題和的高畫質問題了。
固定高度,寬度自適應
即垂直方向使用固定大小,水平方向使用百分比,flex。
name="viewport"
content="width=device-width,initial-scale=1">
適合場景:比較適合列表式的結構。
固定寬度,viewport縮放
開發頁面時完全按照和設計圖1:1的比例開發,設計圖,頁面,視口寬度使用同乙個寬度,單位使用px即可,由於瀏覽器會盡量將布局視口鋪滿全屏,所以瀏覽器會自動幫助我們縮放。舉個例子,假設設計圖是640px寬,那我們這樣設定。
name="viewport"
content="width=640">
這個時候會發現,瀏覽器會幫助我們將頁面鋪滿全屏,而且這是絕對的等比例縮放。、文字等等所有元素都被縮放在手機螢幕中。
rem做寬度,viewport縮放
根據螢幕寬度設定rem值,需要適配的元素都使用rem為單位,不需要適配的元素還是使用 px 為單位。
總共分兩步:
第二步是對頁面適配的優化,修改scale是為了解決前面說到的1px border問題。
**的flexible使用的就是這種方案,而且它加了data-dpr屬性,這樣我們就可以根據不同的dpr設定不同的樣式。
方案一比較適合列表這種比較固定的結構,方案二適合的場景比較多,而且實現簡單,但需要注意它會將頁面的所有元素都縮放,方案三適合的場景是頁面內有些元素需要適配,有些元素不需要適配。總體來講,方案二和方案三是比較常用的方式。
移動端適配 適配方案總結
通過特定的限制,控制不同樣式的呈現 限制條件最終返回true false,為真,應用其樣式 12 stylesheet media max width 800px href example.css 34 5操作邏輯 only,and,not 你可以使用邏輯操作符,包括not and和only等,構建...
螢幕適配基礎(慕課)
螢幕尺寸 螢幕對角線長度 單位英吋 螢幕解析度 單位px 1920 1080 螢幕畫素密度 每英吋上的畫素點個數 單位dpi nexus 5 螢幕4.95inch 1920 1080 dpi 445 1920 2 1080 2 開根號 4.95 445 px構成影象的最小單位 dp dip 密度無關...
移動端適配
js適配方案 function resizefun else body removeclass hightscreen shortscreen portrait var ratio window width window height if screenstate portrait else if ...