前言手機市場日漸豐富的同時,給我們前端開發(fā)人員帶來的 “網(wǎng)頁內(nèi)容自適應屏幕尺寸進行顯示的問題” 也日漸凸顯出來,,接下來我們就要細說移動端適配的前世今生及方案,。 一、為什么要移動端適配,?
既然要了解前世今生,我們就從幾個概念說起,,先上一張圖,。 下面我們一個個解析 1.1 屏幕尺寸
如圖所示兩個對角線的長度就是這個屏幕的尺寸 1.2 像素我們看到上圖 320x480 叫分辨率,,而這個所謂的分辨率說白了就是橫向320個像素縱向480個像素組成 1.2.1 什么叫像素呢?
1.2.2 什么叫分辨率呢?
知道什么叫做分辨率后,有人就會奇怪,,我記得蘋果的蘋果官網(wǎng)上的蘋果 6 的分辨率為 750x1334 啊,,但是設(shè)計稿上蘋果 6 的分辨率為 375x667 啊,而且各個設(shè)備的分辨率都比實際分辨率小很多,,這就牽扯到一些歷史原因了 1.2.3 設(shè)備物理分辨率(設(shè)備像素)相信我們所有前端開發(fā)者,,都是見證了手機這個移動設(shè)備發(fā)展的過程。從藍屏手機,,到彩屏手機,,到諾基亞研發(fā)出來觸屏手機,再到智能手機一步步發(fā)展下來,,我們的我們的手越來越清晰,,越來越大,所以我們的屏幕發(fā)展也越來越迅速,。 上圖可以清楚的看到,,不同分辨率所帶來的的差距 從最初的顆粒感相當大的屏幕,,到 720p 再到 1080p,甚至于現(xiàn)在各家旗艦手機的 2k 屏幕,,我們的物理分辨率在變得原來越大,。這樣就暴露出來一個問題,我們?nèi)绻謾C分辨率翻倍,,我們的圖像不就要被縮小一倍,,我們難道要在每個設(shè)備上就出個設(shè)計稿,每個設(shè)備的分辨不盡相同啊,,其實你擔憂的問題,,我們的喬幫主在很多年前就想到了。這就是我們的邏輯分辨率 1.2.4 邏輯分辨率(設(shè)備獨立像素)如下圖所示,,雖然設(shè)備物理分辨不同,,但是他的這個邏輯分辨率卻都差不多,這就要感謝喬幫主了,。 喬布斯在 iPhone4 的發(fā)布會上首次提出了 Retina Display(視網(wǎng)膜屏幕)的概念,,在 iPhone4 使用的視網(wǎng)膜屏幕中,把 2x2 個像素當 1 個像素使用,,這樣讓屏幕看起來更精致,,但是元素的大小卻不會改變。從此以后高分辨率的設(shè)備,,多了一個邏輯像素,。這些設(shè)備邏輯像素的差別雖然不會跨度很大,但是仍然有點差別,,于是便誕生了移動端頁面需要適配這個問題,,既然邏輯像素由物理像素得來,那他們就會有一個像素比值,。 1.2.5 設(shè)備像素比設(shè)備像素比 device pixel ratio 簡稱 dpr,,即物理像素和設(shè)備獨立像素的比值。為什么要知道設(shè)備像素比呢,?因為這個像素比會產(chǎn)生一個非常經(jīng)典的問題,,1 像素邊框的問題。
核心思路,,就是在 web 中,,瀏覽器為我們提供了 window.devicePixelRatio 來幫助我們獲取 dpr。在 css 中,,可以使用媒體查詢 min-device-pixel-ratio,,區(qū)分 dpr:我們根據(jù)這個像素比,來算出他對應應該有的大小,,但是暴露個非常大的兼容問題,。
至于其他解決一像素邊框問題網(wǎng)上有一堆答案,在這里我推薦一種非常好用,,并且沒有副作用的解決方案,。 transform: scale(0.5) 方案 div { css 根據(jù)設(shè)備像素比媒體查詢后的解決方案
如此,完美的解決一像素看著粗的問題,。
二,、如何適配2.1 viewport
那么在移動端如何配置視口呢?簡單的一個 meta 標簽即可,! <meta name='viewport' content='width=device-width; initial-scale=1; maximum-scale=1; minimum-scale=1; user-scalable=no;'> 他們分別什么含義呢,? 我們在移動端視口要想視覺效果和體驗好,那么我們的視口寬度必須無限接近理想視口,。 理想視口:一般來講,,這個視口其實不是真是存在的,它對設(shè)備來說是一個最理想布局視口尺寸,,在用戶不進行手動縮放的情況下,,可以將頁面理想地展示。那么所謂的理想寬度就是瀏覽器(屏幕)的寬度了,。 于是上述的 meta 設(shè)置,,就是我們的理想設(shè)置,他規(guī)定了我們的視口寬度為屏幕寬度,,初始縮放比例為 1,,就是初始時候我們的視覺視口就是理想視口! 其中 user-scalable 設(shè)置為 no 可以解決移動端點擊事件延遲問題(拓展) 2.2 適配方法2.2.1 rem 適配
舉個例子:
rem 的布局,,不得不提 flexible,flexible 方案是阿里早期開源的一個移動端適配解決方案,,引用 flexible 后,,我們在頁面上統(tǒng)一使用 rem 來布局,。 他的原理非常簡單 // set 1rem = viewWidth / 10 rem 是相對于 html 節(jié)點的 font-size 來做計算的,。所以在頁面初始話的時候給根元素設(shè)置一個 font-size,,接下來的元素就根據(jù) rem 來布局,這樣就可以保證在頁面大小變化時,布局可以自適應。 如此我們只需要給設(shè)計稿的 px 轉(zhuǎn)換成對應的 rem 單位即可。 當然,,這個方案只是個過渡方案,為什么說是過渡方案 因為當年 viewport 在低版本安卓設(shè)備上還有兼容問題,,而 vw,,vh 還沒能實現(xiàn)所有瀏覽器兼容,所以 flexible 方案用 rem 來模擬 vmin 來實現(xiàn)在不同設(shè)備等比縮放的“過度”方案,,之所以說是過度方案,,是因為這個他這個根據(jù)設(shè)備大小去判斷頁面的方案是根據(jù)屏幕大小去百分百還原設(shè)計稿,從而讓人看到的大小效果是一樣的,,但是 蘋果 5 和蘋果 6p 雖然看到的設(shè)計稿還原是一樣的,,但是他在一個合適距離上看到的效果能一樣嗎,本質(zhì)上,,用戶使用更大的屏幕,,是想看到更多的內(nèi)容,而不是更大的字,。 so,,這個用縮放來解決問題的方案是個過渡方案,注定被時代所淘汰,。 2.2.2 vw,,vh 布局
vh 和 vw 方案和 rem 類似也是相當麻煩需要做單位轉(zhuǎn)化,,而且 px 轉(zhuǎn)換成 vw 不一定能完全整除,因此有一定的像素差,。 不過在工程化的今天,,webpack 解析 css 的時候用 postcss-loader 有個 postcss-px-to-viewport 能自動實現(xiàn) px 到 vw 的轉(zhuǎn)化
2.2.3 px 為主,vx 和 vxxx(vw/vh/vmax/vmin)為輔,,搭配一些 flex(推薦)之所以推薦使用此種方案,,是由于我們要去考慮用戶的需求,用戶之所以去買大屏手機,,不是為了看到更大的字,,而是為了看到更多的內(nèi)容,這樣直接使用 px 是最明智的方案,,使用 vw,rem 等布局手段無可厚非,但是,,flex 這種彈性布局大行其道的今天,,如果如果還用這種傳統(tǒng)的思維去想問題顯然是有兩個原因(個人認為 px 是最好的,可能有大佬,,能用 vw,,或者 rem 寫出精妙的布局,也說不準),。
2.3 移動端適配流程1. 在 head 設(shè)置 width=device-width 的 viewport‘ 2. 在 css 中使用 px 3. 在適當?shù)膱鼍笆褂?flex 布局,,或者配合 vw 進行自適應 4. 在跨設(shè)備類型的時候(pc <-> 手機 <-> 平板)使用媒體查詢 5. 在跨設(shè)備類型如果交互差異太大的情況,,考慮分開項目開發(fā) 寫在最后疫情期間有了跳槽的想法,問到移動端布局方面,,雖然勉強能回答上來,,但是總是支支吾吾,不是很了解,,故而,,發(fā)下宏愿,梳理移動端適配,,幫助后來人后來者居上,! 參考資料鏈接: https://github.com/w3c/csswg-drafts/issues/3720 點個在看鼓勵下吧 |
|
來自: 黃爸爸好 > 《移動開發(fā)》