提到viewport移動端適配,那麼心中可能有幾個疑問?javascript
1.爲何要進行移動端的適配?css
2.viewport是什麼?html
3.如何進行移動端適配?java
一般咱們在pc上看到的頁面都是比較大的,在pc上訪問頁面是正常顯示的,默認是不會被縮放的,除非是手動進行了縮放,頁面纔會被放大比例或者是縮小比例顯示。可是在移動端是不同的,若是將一個pc端的頁面放到手機端進行訪問,那麼可能出現頁面擠到一塊兒、佈局錯亂或者出現橫向滾動條的狀況,咱們給用戶帶來很差的體驗。還有在屏幕尺寸大小不一樣的手機上進行訪問頁面時,頁面顯示的效果不能合理的展現,咱們指望的是在手機屏幕較大時顯示的內容比較大一些,手機屏幕小的時候頁面的內容也會縮小進行自適應。android
所以,移動端適配的目的是在不一樣尺寸的設備上,頁面達到合理的展現(自適應)或者說是可以保持統一效果。webpack
1.一般viewport是指視窗、視口,瀏覽器上(也多是一個app中的webview)用來顯示網頁的那部分區域。在移動端和pc端視口是不一樣的,pc端的視口是瀏覽器窗口區域,而在移動端有三個不一樣的視口概念:佈局視口、視覺視口、理想視口ios
佈局視口:在瀏覽器窗口css的佈局區域,佈局視口的寬度限制css佈局的寬。爲了能在移動設備上正常顯示那些爲pc端瀏覽器設計的網站,移動設備上的瀏覽器都會把本身默認的viewport設爲980px或其餘值,通常都比移動端瀏覽器可視區域大不少,因此就會出現瀏覽器出現橫向滾動條的狀況css3
視覺視口:用戶經過屏幕看到的頁面區域,經過縮放查看顯示內容的區域,在移動端縮放不會改變佈局視口的寬度,當縮小的時候,屏幕覆蓋的css像素變多,視覺視口變大,當放大的時候,屏幕覆蓋的css像素變少,視覺視口變小。web
理想視口:通常來說,這個視口其實不是真是存在的,它對設備來講是一個最理想佈局視口尺寸,在用戶不進行手動縮放的狀況下,能夠將頁面理想地展現。那麼所謂的理想寬度就是瀏覽器(屏幕)的寬度了。數組
爲了理解起來更清楚一點,在網上找了兩張比較易懂的圖片。若是對這三個視口的概念還不是很清楚,看看下面幾張圖可能就會一目瞭然:
佈局視口
視覺視口
2.那麼如何設置理想視口呢?很簡單,只須要在html的header中加入一段很重要的代碼
<meta name="viewport"content="width=device-width,user-scalable=no,initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0">
複製代碼
這行代碼你們應該都不陌生,或者說是知道加了這行代碼,而後頁面的寬度就會跟個人設備寬度一致。,實際上,它就是設置了理想視口,將佈局視口的寬度設置成了理想視口(瀏覽器/設備屏幕的寬度)。
上面說到的視口寬度等均是css像素,因此須要簡單瞭解一下幾個基本的概念:
css像素:代碼中使用的邏輯像素,衡量頁面上的內容大小
設備像素:即物理像素,控制設備顯示的單位,與設備、硬件有關
設備獨立像素:與設備無關的邏輯像素,不一樣於設備像素(物理像素),不是真實存在的。
設備像素比:定義設備像素與設備獨立像素比的關係window.devicePixelRatio)設備像素比=物理像素/設備獨立像素
分辨率:指的是屏幕上垂直和水平的總物理像素
3.在meta標籤中,除了viewport這個很重要的屬性,用來設置視口的一些行爲,還有幾個與其搭配一塊兒使用的屬性:
屬性 | 含義 | 取值 |
---|---|---|
width | 定義視口的寬度,單位爲像素 | 正整數或設備寬度device-width |
height | 定義視口的高度,單位爲像素 | 正整數或device-height |
initial-scale | 定義初始縮放值 | 整數或小數 |
minimum-scale | 定義縮小最小比例,它必須小於或等於maximum-scale設置 | 整數或小數 |
maximum-scale | 定義放大最大比例,它必須大於或等於minimum-scale設置 | 整數或小數 |
user-scalable | 定義是否容許用戶手動縮放頁面,默認值yes | yes/no |
(1)css3 媒體查詢:經過媒體查詢的方式,編寫適應不一樣分辨率設備的的css樣式
@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樣式
}
......
複製代碼
優勢:
方法簡單,只需修改css文件
調整屏幕寬度時不用刷新頁面就能夠響應頁面佈局
缺點:
代碼量大,不方便維護
不可以徹底適配全部的屏幕尺寸,須要編寫多套css樣式
(2)百分比佈局方案:給元素設置百分比,例如2個div想佔滿寬度100%,那麼一個div設置寬度爲50%,這樣不固定寬度,使得在不一樣的分辨率下都能達到適配
那麼須要清楚一個問題,各個子元素或屬性的百分比是根據誰來設定呢?
優勢:
缺點:
(3)rem方案:
控制font-size的js代碼
<script type="text/javascript">
(function() {
var deviceWidth = document.documentElement.clientWidth;
deviceWidth = deviceWidth < 320 ? 320 : deviceWidth > 640 ? 640 : deviceWidth;
document.documentElement.style.fontSize = deviceWidth / 7.5 + 'px';
})();
</script>
複製代碼
上面的js代碼中deviceWidth/7.5,表示font-size用deviceWidth/7.5的值來表示,1rem的值就是deviceWidth/7.5,當視口容器發生變化時就能夠動態設置font-size的大小,不論頁面寬度變大仍是縮小,視口寬度都會被等分爲7.5份,每一份就是1rem,從而1rem在不一樣的視覺容器中表示不一樣的大小,但在視口總寬度中的佔比是不變的,實現了等比適配。
這個7.5在這裏並非一個固定的值,也能夠設置爲其餘值,由於設計稿通常是根據iphone6/7/8的寬度來設計,通常爲375或者750,因此爲了方便計算,在這裏取7.5,可以被整除方便後面的計算。
元素的rem值計算
.div{
display: flex;
align-items: center;
justify-content: center;
width: 2rem;
height: 0.96rem;
background:#aaa;
font-size: 0.24rem;
}
複製代碼
假定一個div的寬度爲100px,那麼在計算時,根據設置的1rem = 50px,因此100px=2rem,其餘全部的屬性值均可以相似這樣計算。font-size通常狀況下仍是使用px,由於在rem中,只要使用了rem單位都會被轉換,那麼在轉換的時候,會出現不能被整除或者出現小數的狀況好比10.333333px,那麼在顯示時就可能出現一些誤差。並且若是指望在小屏幕下面顯示跟大屏幕同等量的字體,可是因爲rem的等比縮放,在小屏幕下就會存在小屏幕字體更小的狀況,因此對於字體的適配更好的作法就是使用px和媒體查詢來進行適配。
優勢:
缺點:
(4)vw、vh方案 css3中引入與視口有關的新的單位vw和vh,vw表示相對於視口的寬度,vh表示相對於視口高度
單位 | 含義 |
---|---|
vw | 相對於視口的寬度,視口寬度是100vw |
vh | 相對於視口的高度,視口寬度是100vh |
vmin | vw和vh中較小的值 |
vmax | vw和vh中較大的值 |
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
})
]
}
複製代碼
接下來是對postcss-px-to-viewport配置中的屬性的介紹:
單位 | 含義 |
---|---|
viewportWidth | 視口寬度(數字) |
viewportHeight | 視口高度(數字) |
unitPrecision | 設置的保留小數位數(數字) |
viewportUnit | 設置要轉換的單位(字符串) |
selectorBlackList | 不須要進行轉換的類名(數組) |
minPixelValue | 設置要替換的最小像素值(數字) |
mediaQuery | 容許在媒體查詢中轉換px(true/false) |
優勢:
缺點:
直接進行單位換算時百分比可能出現小數,計算不方便
兼容性- 大多數瀏覽器都支持、ie11不支持 少數低版本手機系統 ios八、android4.4如下不支持
最後,有一個問題,既然百分比和vw都是須要計算百分比,那麼兩個方案的不一樣之處?
單位 | 含義 |
---|---|
% | width、height等大部分相對於直接父元素、border-radius、translate、background-size等相對於自身 |
vw | 只相對於視口寬度 |
以上,若有錯漏,歡迎指正!
@Author:lj0214