下面開始討論iPhone6/iPhone6 Plus的設備屏寬,這裏說的設備屏幕寬度專指設備物理顯示尺寸(device-width),咱們知道蘋果從iPhone4開始引進了Retina屏幕,一個CSS像素能夠表示多個物理像素(固然,在頁面縮放到其餘比例時候,也能夠作到CSS 的1px表示多個device pixels,只不過致使的是清晰度的不一樣)。首先要明確,咱們前端開發中的CSS pixels和設備分辨率所講的resolution pixels 無關。因爲咱們大部分移動設備默認的viewport都是980px,多數狀況下要大於device-width。因此爲了閱讀方便,咱們通常都要在移動端重置viewport,讓width=device-width。再這樣能夠作到按頁面寬度100%充滿屏幕,水平不出現滾動條,使得閱讀瀏覽體驗更佳。補充一下,經過JavaScript獲取viewport的方式:document.documentElement.clientWidth,獲取device-width的方式window.innerWidth。今天要說的就是設備屏寬device-width問題。 css
iPhone6設備屏幕寬度是375px,iPhone 6Plus設備屏幕寬度414px,這是咱們前端開發人員一貫堅信的「真理」。可今天我要質疑這個已成的定論。 前端
去年iPhone6/iPhone 6+剛上市時,用js檢測過iPhone6與iPhone 6 Plus的屏幕寬度,獲得的結果都是iPhone6屏幕寬度375像素,iPhone6 Plus屏寬414像素(默認標準模式)。後來就一直堅信這一結論,直到今天,項目在Chrome下模擬iPhone6 Plus的效果,調試完成後,用真機測試居然不認識@media only screen and (min-device-width: 414px) and(-webkit-min-device-pixel-ratio: 3)這個媒體查詢,這已經不是第一次遇到這種狀況了,以爲有必要刨根問底,把「肇事者」揪出來,因而開始不停的測試,查找緣由所在。 web
首先查找CSS代碼的問題,查了reset樣式,也進行了CSS validate,沒有收穫。 測試
既然CSS Media Query媒體查詢代碼並沒生效,隱隱約約開始懷疑曾經本身親自證明的結論,也就是咱們一直認爲的:iPhone6設備屏幕寬度是375px,iPhone 6 Plus設備屏幕寬度414px。 網站
懷疑歸懷疑,可是本身也不相信會推翻原有結論。並且,常常在國外的技術網站和Stack Overflow遊蕩,從未遇到過例外啊!只是不放心,爲圖個心安,因而帶着覈實狀況的內心繼續用JS代碼來探測設備的寬度。 spa
JavaScript代碼只須要兩句: .net
alert(window.innerWidth); 調試
alert(window.devicePixelRatio); code
一個檢測屏幕寬度,第二句檢測設備像素比。 ip
借來了許多同事的iPhone6和iPhone6 Plus,看到測試結果差點把我驚呆了。有的設備寬度是320,有的是375,有的414,亂了。。。
後來發現從iPhone6開始,系統設置提供了「顯示模式」設置。
「顯示模式」分爲「標準」和「放大」兩種選擇:若是想讓iPhone 6/6 Plus 桌面應用圖標顯示效果變得更小,能夠設置爲「標準」模式。想要大圖標的顯示效果,則能夠設爲「放大」模式。
設置操做步驟爲:
1. 點擊桌面的設置(Settings)
2. 下滑找到「顯示與亮度」項。
3. 點擊「顯示模式」。
4. 在「標準」與「放大」兩者之中選擇一個,點擊右上角「設定」。
5. 最後再點擊底部彈出的「使用xx模式」選項進行確認,手機重啓。
經過切換兩種顯示模式,用JS獲取到如下數據:
iPhone6 Plus第一個設備(白):
iPhone6 Plus在標準模式: 屏幕寬度414px,像素比爲3. (iOS 8.1.3 (12B466))
iPhone6 Plus在放大模式: 屏幕寬度375px,像素比爲3. (iOS 8.1.3 (12B466))
標準模式屏寬414,放大模式屏寬375.
iPhone6 Plus第二個設備(銀):
iPhone6 Plus在標準模式: 屏幕寬度414px,像素比爲3. (iOS 8.2 (12D508))
iPhone6 Plus在放大模式: 屏幕寬度375px,像素比爲3. (iOS 8.2 (12D508))
標準模式屏寬414,放大模式屏寬375.
iPhone6 Plus第三個設備(白):
iPhone6 Plus在標準模式: 屏幕寬度414px,像素比爲3. (8.1.1 (12B436))
iPhone6 Plus在放大模式: 屏幕寬度375px,像素比爲3. (8.1.1 (12B436))
標準模式屏寬414,放大模式屏寬375.
iPhone6第一個設備(白)
iPhone6 在標準模式: 屏幕寬度320px,像素比爲2. (iOS 8.2 (12D508))
iPhone6 在放大模式: 屏幕寬度320px,像素比爲2. (iOS 8.2 (12D508))
標準模式和放大模式屏寬均爲320.
iPhone6第二個設備(白)
iPhone6 在標準模式: 屏幕寬度375px,像素比爲2. (iOS 8.1.3 (12B466))
iPhone6 在放大模式: 屏幕寬度320px,像素比爲2. (iOS 8.1.3 (12B466))
標準模式屏寬375,放大模式屏寬320.
iPhone6第三個設備(銀)
iPhone6 在標準模式: 屏幕寬度375px,像素比爲2. (iOS 8.2 (12D508))
iPhone6 在放大模式: 屏幕寬度320px,像素比爲2. (iOS 8.2 (12D508))
標準模式屏寬375,放大模式屏寬320.
iPhone6第四個設備(白)
iPhone6 在標準模式: 屏幕寬度375px,像素比爲2. (iOS 8.1 (12B411))
iPhone6 在放大模式: 屏幕寬度320px,像素比爲2. (iOS 8.1 (12B411))
標準模式屏寬375,放大模式屏寬320.
經過觀察咱們能夠發現,iPhone6 Plus在放大模式的屏寬等於iPhone6標準模式屏寬,大部分iPhone6在放大模式的屏寬等於iPhone5/5s的屏寬,這意味着,iPhone6 Plus在放大模式下的顯示內容是和iPhone6的標準模式同樣的,iPhone6放大模式的內容和iPhone5s的顯示內容是接近的。但也有例外,某些iPhone6不管何種顯示模式屏寬都是320px。不管在初始設置的時候你選擇了哪一個顯示模式,以後你都是能夠進行改變並切換的。
這就引出一個問題,咱們在對iPhone設備適配時候,又多出幾種狀況。iPhone系列設備媒體查詢:
@media only screen and (min-device-width: 320px){ //針對iPhone 3 } @media only screen and (min-device-width: 320px)and (-webkit-min-device-pixel-ratio: 2) { //針對iPhone 4, 5c,5s, 全部iPhone6的放大模式,個別iPhone6的標準模式 } @media only screen and (min-device-width: 375px)and (-webkit-min-device-pixel-ratio: 2) { //針對大多數iPhone6的標準模式 } @media only screen and (min-device-width: 375px)and (-webkit-min-device-pixel-ratio: 3) { //針對全部iPhone6+的放大模式 } @media only screen and (min-device-width:412px) and (-webkit-min-device-pixel-ratio: 3) { //針對全部iPhone6+的標準模式,414px寫爲412px是因爲三星Nexus 6爲412px,可一併處理 }