好像面試問移動端適配還挺多的,在網上查找了不少資料(侵刪),總結一下:css
(1)經過媒體查詢的方式即CSS3的meida queries (2)以天貓首頁爲表明的 flex 彈性佈局 (3)以淘寶首頁爲表明的 rem+viewport縮放 (4)rem 方式
經過動態設置meta標籤的viewport讓css中的1px等於設備的1px。html
首先咱們必需要了解到viewport是什麼,viewport是用戶的網頁可視區域。手機瀏覽器就是頁面放在一個虛擬的「窗口」(viewport)中,一般這個虛擬的窗口比屏幕寬,這樣就不會破壞沒有針對手機瀏覽器優化的網頁的佈局(不會把每一個網頁擠到很小的窗口中)。用戶能夠經過平移和縮放來看網頁的不一樣部分。android
一般viewport是指視窗、視口,瀏覽器上(也多是一個app中的webview)用來顯示網頁的那部分區域。在移動端和pc端視口是不一樣的,pc端的視口是瀏覽器窗口區域,而在移動端有三個不一樣的視口概念:佈局視口、視覺視口、理想視口webpack
佈局視口:在瀏覽器窗口css的佈局區域,佈局視口的寬度限制css佈局的寬。爲了能在移動設備上正常顯示那些爲pc端瀏覽器設計的網站,移動設備上的瀏覽器都會把本身默認的viewport設爲980px或其餘值,通常都比移動端瀏覽器可視區域大不少,因此就會出現瀏覽器出現橫向滾動條的狀況ios
視覺視口:用戶經過屏幕看到的頁面區域,經過縮放查看顯示內容的區域,在移動端縮放不會改變佈局視口的寬度,當縮小的時候,屏幕覆蓋的css像素變多,視覺視口變大,當放大的時候,屏幕覆蓋的css像素變少,視覺視口變小。css3
理想視口:通常來說,這個視口其實不是真實存在的,它對設備來講是一個最理想佈局視口尺寸,在用戶不進行手動縮放的狀況下,能夠將頁面理想地展現。那麼所謂的理想寬度就是瀏覽器(屏幕)的寬度了。web
設置理想視口就在header中加入這樣一行代碼:面試
<meta name="viewport"content="width=device-width,user-scalable=no,initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0">
經過查詢設備的寬度來執行不一樣的 css 代碼,最終達到界面的配置chrome
@media screen and (max-width: 320px){....適配iphone4的css樣式}@media screen and (max-width: 375px){ ....適配iphone6/7/8的css樣式}@media screen and (max-width: 414px){....適配iphone6/7/8 plus的css樣式}......
優勢:小程序
缺點:
一般咱們拿到的設計圖寬度的是750也就是基於iphone6/7/8的設計圖,咱們若是要想讓1px像素等於設計圖的1px該怎麼作呢?
其實很簡單,直接讓根元素的font-size: 0.5px便可(由於是2倍圖,1px等於2實際像素,因此爲0.5px)。可是市面上的機型不必定都是750px的,這個時候咱們就要進行等比縮放了。
html.fontSize = clientWidth / 750
還有一個小問題,日常開發都是基於谷歌chorme開發的,chrome並不支持font-size小於12的字體。因此可讓font-size大於12,在以上基礎上將結果放大100倍,而後寫樣式的時候再除以100。嗯~看到這裏我以爲很繞啊,不過開始放在這裏了。
js僞代碼:
html.fontSize = clientWidth / 750 * 100
樣式:
.element {width: 0.1rem; /* 實際到6/7/8上就是10px */}
這種方式是給元素設置百分比,例如2個div想佔滿寬度100%,那麼一個div設置寬度爲50%,這樣不固定寬度,使得在不一樣的分辨率下都能達到適配。
各子元素或屬性的百分比設定計算:
1.子元素width、height的百分比:子元素的width或height中使用百分比,是相對於子元素的直接父元素
2.margin和padding的百分比:在垂直方向和水平方向都是相對於直接父親元素的width,而與父元素的height無關
3.border-radius的百分比:border-radius的百分比是相對於自身寬度,與父元素無關
優勢:
缺點:
小程序有個rpx能夠根據屏幕自適應。官方文檔的介紹:能夠根據屏幕寬度進行自適應。規定屏幕寬爲750rpx。如在 iPhone6 上,屏幕寬度爲375px,共有750個物理像素,則750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素,也就是說,它內部的實現原理其實和基於設計圖的rem佈局的原理差很少。
只不太小程序內部處理了一下,讓rpx直接可以根據屏幕寬度自適應,而不是像rem那樣依賴於根元素的font-size.
css3中引入與視口有關的新的單位vw和vh,vw表示相對於視口的寬度,vh表示相對於視口高度。
那麼問題來了,平時咱們拿到的設計圖都是基於px標記的,怎麼將px轉爲vw呢?
vw單位換算:視口寬度爲100vw佔滿整個視口區域,那麼1vw至關於佔整個視口寬度的1%,因此1px= 1/375*100 vw
全部的頁面元素均可以直接進行計算換算成vw單位,可是這樣計算和百分比方案計算比較相似,都會比較麻煩。
可是有一個比較厲害的插件—— postcss-px-to-viewport,能夠預處理css,將px單位轉換爲vw單位,可是須要進行一些相關的webpack配置。詳情可看上方連接官方配置解釋。
{loader: 'postcss-loader',options: { plugins: ()=>[require('autoprefixer')({ browsers: ['last 5 versions']}),require('postcss-px-to-viewport')({ viewportWidth: 375, viewportHeight: 1334, unitPrecision: 3, viewportUnit: 'vw', selectorBlackList: ['.ignore', '.hairlines'],minPixelValue: 1,mediaQuery: false})]}
優勢:
缺點: