提及移動端頁面也是老生常談了,最近正好在作金融商城移動端的開發,正好梳理下這一塊的知識點,提煉和總結。css
一 什麼是移動端頁面html
首先前端
不扯那些長篇大論,常見的移動端頁面主要就三種,即H5頁面、手機頁面、以及webview頁面。ios
移動端的興起,訪問的流量很大一部分都來自於手機,而一般當手機訪問頁面的時候,每臺設備的分辨率、型號、屏幕尺寸都不一致,致使移動端的兼容適配成爲一個很難忽視的問題。css3
爲了讓設計稿在大部分設備上都能有相對滿意的效果,尤爲是在移動端,顯然在pc端的px計算像素的方式已經不適用。web
二 幾個名詞bootstrap
1 viewportapi
如今開發的頁面主要集中在H5頁面這個方向,而說到移動端頁面,就必需要提到viewport.瀏覽器
先說用到哪,再說是什麼、爲何這麼用。安全
隨便打開一個線上的H5的頁面,你都會在head裏發現這個標籤<meata name="viewport" content="initial-scale=..., maximun-sacle=..., minimun-scale=..., user-scalable=no">
金融商城H5端
淘寶移動端
全部的移動端頁面都用到了這個屬性,那麼這個屬性的定義是什麼?
咱們知道手機的分辨率各有各的不一樣,很難作到一套代碼,全部的機型都適配,再加上一些歷史的緣由,瀏覽器對移動端的屬性支持力度不一樣。因此須要一個折中的方法作到絕大多數設備都能適用。
2. 物理像素(physical pixel)
一個物理像素是顯示器(手機屏幕)上最小的物理顯示單元,在操做系統的調度下,每個設備像素都有本身的顏色值和亮度值。
3. 設備獨立像素(density-independent pixel)
設備獨立像素(也叫密度無關像素),能夠認爲是計算機座標系統中得一個點,這個點表明一個能夠由程序使用的虛擬像素(好比: css像素),而後由相關係統轉換爲物理像素。
因此說,物理像素和設備獨立像素之間存在着必定的對應關係,這就是接下來要說的設備像素比。
4.設備像素比(device pixel ratio)
設備像素比(簡稱dpr)定義了物理像素和設備獨立像素的對應關係,它的值能夠按以下的公式的獲得:
設備像素比 = 物理像素 / 設備獨立像素 // 在某一方向上,x方向或者y方向
5.rem
rem 是一個css單位,rem(font size of the root element)是指相對於根元素的字體大小的單位。簡單的說它就是一個相對單位。看到rem你們必定會想起em單位,em(font size of the element)是指相對於父元素的字體大小的單位。它們之間其實很類似,只不過一個計算的規則是依賴根元素一個是依賴父元素計算。(這裏的根元素指的是html)
三 幾種解決方案
3.1 經過css3 的media queries,即媒體查詢
這是一個pc的主頁網站,pc和移動端作的統一適配
通常早期手機機型很少的時候採用的方案,原理是經過css3的media queries 的方式查詢設備寬度,來執行不一樣的css代碼。
這是一段css代碼,在不一樣的屏幕寬度下設置不一樣的font-szie.
media query
對移動和PC維護同一套代碼的時候,基於bootstrap,適用於一些比較穩定的主站
3.2 flex彈性佈局
覺得天貓h5首頁爲例
flex 的原理不在贅述,簡單的說就是把父元素下的盒子分紅了幾份,不管屏幕大小,實現等比例的伸縮的一種css3的全新佈局方式。
3.3 rem + viewport 縮放 (目前金融商城採用的解決方案)
最開始的時候,不少採用的是媒體查詢,可是隨着機型的愈來愈多,媒體查詢的方式愈來愈不適用。
rem上邊咱們已經介紹過,那麼看看具體怎麼用,這是一個簡單的button,當頁面根元素的font-size改變,頁面總體都會跟着改變,至關於根元素是一個基準或者係數
也很像viewport的這種縮放的方式。
既然描述的聽上去很完美,在不一樣機型上,直接改變根元素的font-size值或者viewport的縮放比例就能夠了,的確以前也有單獨用rem或者單獨用viewport作適配的。
可是,最後老生長談的仍是回到了兼容性這個點上,純rem的方式在背景和字體上會存在一些問題,畢竟是基於根元素計算來的,而不是真正的縮放。而viewport的方式在某些
瀏覽器的webview是有兼容性問題的,並且還存在一像素沒法渲染的問題。
因此折中的咱們採起了rem+viewport縮放的並行方案,根據屏幕的尺寸,動態計算rem的根元素和viewport的縮放比例。
具體代碼的實現:(因爲內網安全紅線,代碼示例的部分就省去了)
主要的代碼邏輯:
setViewport部分,主要就是對ios和安卓作了機型的區分,和對是否第一次設置viewport作了判斷。
setRem部分,主要就是根據屏幕的實際寬度設置根元素的font-size
在init函數裏針對一些狀況作了單獨的處理
考慮了屏幕發生旋轉、頁面load的時候,從新計算rem
四 總結
佈局方式和屏幕適配原本就是前端的一個比較頭疼的問題,在平常的開發中花費掉了開發者大量的精力和時間,尤爲是處理一些兼容性的問題。
而適配屏幕的方式也在一直進化和改變,確定會有新的適配方案來代替如今的方案。
須要勤加總結和學習新的知識,保持本身的更新和迭代。