移動端屏幕適配兩三點

来源:http://www.cnblogs.com/iovec/archive/2017/10/20/7700733.html
-Advertisement-
Play Games

移動端前端開發較PC端開發最大的不同之一就是需要適配各種大小不同的屏幕尺寸,如何實現辛苦編寫的 H5 頁面在各個機型屏幕上都能得到最佳展示?設計師設計的視覺稿為什麼都是2倍稿? ...


移動端 H5 頁面不可遺忘的 meta 標簽 viewport

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />

這行代碼的作用是設置視口的寬度(其實就是頁面的寬度)等於設備寬度,頁面不縮放並且也不允許用戶進行縮放。

把一個普通的PC端頁面(未加入上面 meta 標簽的)直接放在手機端訪問是可以展示完全的,但是頁面明顯經過縮放。可以用 alert(document.body.clientHeight) 獲取一下頁面寬度,你會發現,大部分頁面的寬度都是980px。再用alert(window.innerWidth)獲取一下設備寬度,很明顯,手機端自動將980px的頁面縮放到了window.innerWidth的寬度才得以完全展示。但這不是我們想要的效果,我們想要的是未經縮放,以最佳樣式展現的Web頁面。每一個移動端頁面都應該首先加入上面這行 meta 標簽,這樣才能確保頁面得到了最佳的展現形式。


CSS 屏幕適配之媒體查詢(media query)

PC 端常用的CSS測量單位是 px,而移動端常用的卻是 rem。這樣做的原因仍然是為了適配多種屏幕尺寸。怎麼適配呢?首先需要弄清楚rem單位,rem是相對於DOM根元素(也就是)的字體大小的度量單位。比如說我們設置了 html{ font-size: 16px },然後給具體的DOM設置 p{ font-size: 2rem; height: 4rem; },其實就相當於設置了 p{ font-size: 2*16px; height: 4*16px; },也就是 1rem = 1*(html的fontSize)2.5rem=2.5*(html的fontSize)。這樣就很清楚了,我們只需要控制不同屏幕尺寸下 html 的 fontSize,頁面上所有使用 rem 度量的DOM的尺寸都會相應改變。比如以下適配代碼:

html{font-size: 18px}
@media only screen and (min-width:360px){html{font-size: 20px!important}}
@media only screen and (min-width:375px){html{font-size: 21px!important}}
@media only screen and (min-width:400px){html{font-size: 22px!important}}
@media only screen and (min-width:414px){html{font-size: 23px!important}}
@media only screen and (min-width:480px){html{font-size: 24px!important}}
@media only screen and (min-width:540px){html{font-size: 26px!important}}
@media only screen and (min-width:640px){html{font-size: 28px!important}}
@media only screen and (min-width:768px){html{font-size: 32px!important}}
@media only screen and (min-width:960px){html{font-size: 36px!important}}
@media only screen and (min-width:1024px){html{font-size: 46px!important}}

上面一塊代碼的意思就是:

  1. 屏幕尺寸小於360px時,html 的 fontSize 就是18px;
  2. 當屏幕尺寸位於區間 [360px, 375px] 時,html 的 fontSize 就是 20px;
  3. 當屏幕尺寸位於區間 [375px, 400px] 時,html 的 fontSize 就是 21px;
  4. 以此類推,如果屏幕尺寸大於 1024px 的話,html 的 fontSize 都是46px。

上面CSS媒體查詢是一個區間一個區間地進行適配的,當然也可以使用 JS 進行更精細的適配,但歸根結底無非都是通過改變viewport的scale值和根節點html的fontSize值進行整體調整的。


設計師出 2 倍視覺稿,前端還原成 1 倍頁面,是在瞎折騰?

這樣做當然是有原因的,在解釋這個問題之前,先介紹一些像素小知識。

  1. 物理像素(也叫設備像素)
    物理像素是顯示器上最小的顯示單元,電腦、電視、手機、平板這些電子設備的屏幕都是由一個個物理像素點組成的,連點成線,線再成面。在系統的調度下,每一個物理像素可以且僅可以顯示單獨的顏色值和亮度值
    比如 iPhone5 的屏幕有 640x1136 個物理像素,註意到了嗎,物理像素的總量其實就是所謂的解析度。解析度越高,物理像素點就越多,屏幕上能表現的顏色值就越多,畫面就越細膩。

  2. 設備獨立像素(也叫CSS像素,邏輯像素)
    設備獨立像素的學術解釋就是電腦坐標系統中的一個點,這個點代表一個可以由程式使用並控制的虛擬像素,然後由底層系統的程式轉換為物理像素。怪不得都不喜歡去看這些學術性的解釋,真的是佶屈聱牙,抽象難懂。
    其實在我看來,設備獨立像素就是UI設計師設計工具(如Photoshop)中的像素,而UI設計師通常就在電腦上進行設計作業的,所以設備獨立像素其實就是電腦屏幕上的物理像素。每一個設備獨立像素可以表示一個或多個顏色值和亮度值
    iPhone5 屏幕的設備獨立像素數量是 320x568,為什麼這麼說呢,因為在普通電腦屏幕上,1 個設備獨立像素是對應著 1 個物理像素的,你把 iPhone5 的屏幕貼在電腦屏幕上,那一塊和iPhone5屏幕等大的電腦屏幕區域物理像素數量是多少,沒錯正好是320x568。嘿嘿,明白了吧,設備獨立像素是設計師和前端工程師進行作業時的測量單位。

  3. 設備像素比(Device Pixel Ratio)
    DPR 的計算公式如下:

    設備像素比 = 設備像素/設備獨立像素        // 在某一方向上,x方向或y方向

    DPR 的意義就是用來表示設備會分配多少個物理像素來展示1個設備獨立像素,一般是DPRxDPR個。比如由公式可計算出 iPhone5 的 DPR 為 2,那麼 iPhone5 就會分配 2x2=4 個物理像素來展示1個設備獨立像素。

其實現在市面上的很多機型 DPR 都是 2,也因此UI設計師為移動端所做的設計圖通常是 2 倍圖。為什麼這樣做呢,拿iPhone5來說吧,如果設計圖尺寸是320x568也就是等於設備的邏輯像素數量,當然是可以的,但這樣就浪費了硬體優勢了,因為設計圖上的1個CSS像素映射到手機屏幕上,手機屏幕會分配4個物理像素來展示它,很顯然,4個物理像素的顏色值和亮度值都一樣。而如果設計成2倍圖,那就是等於設備的物理像素數量了,設計師可以盡情發揮,設計更細膩的畫面,手機屏幕也可以充分發揮出高解析度的優勢。設計成2倍圖會出現一個問題,比如本來一張圖片是希望它在手機上呈現為 100x100(CSS像素)的尺寸,結果設計師把它設計成200x200(CSS像素)的,如果直接放在手機上,也會呈現 200x200(CSS像素)的,而不是100x100(CSS像素),就會顯得非常大,這時候就輪到前端工程師隆重登場了,前端在還原設計圖時所有尺寸都應該減半,也就是還原成1倍頁面。比如設計圖上的200x200(CSS像素)的尺寸,在頁面上對應地寫成100x100(CSS像素),這樣它在頁面上就會占據100x100個CSS像素了,手機系統會分配100x100x4個物理像素去展示這100x100個CSS像素,這樣就可以充分展現設計圖中的色彩信息了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.- DRY: Don’t repeat yourself. DRY 是一個最簡單的法則,也是最容易被理解的。但它也可能是最難被應用的(因為要做到這樣,我們需要在泛型設計上做相當的努力,這並不是一件容易的事)。它意味著,當我們在兩個或多個地方的時候發現一些相似的代碼的時候,我們需要把他們的共性抽象 ...
  • 這幾天在知乎看到了許多關於濫用三層的討論,很多觀點都暗指三層架構這東西太Low了。Low嗎?其實不然。我們覺得三層Low主要是因為三層太簡單了,人們往往不理解三層的思想和目的,濫用三層,加之一些劣質程式員為其加上些自認牛逼的更改搞個五六七八層,代碼寫得又爛,結果看起來就很Low,於是人們就把鍋扣到三 ...
  • 進入工作室也有一段時間了,期間也進行過多次授課,使我對c#這門新的編程語言有了一定的理解。 c#是一種純面向對象的程式設計語言,設計一個程式就是設計一個或多個類,這與之前我所學習的c和c++有些不一樣,它們都是通過函數來實驗目標,而c#是通過方法來完成的。c#中的方法是在類或結構中定義的,有點類似於 ...
  • dubbo支持多種遠程調用方式,例如dubbo RPC(二進位序列化 + tcp協議)、http invoker(二進位序列化 + http協議,至少在開源版本沒發現對文本序列化的支持)、hessian(二進位序列化 + http協議)、WebServices (文本序列化 + http協議)等等,... ...
  • 什麼是狀態者模式? 每個對象都有其對應的狀態,而每個狀態又對應一些相應的行為,如果某個對象有多個狀態時,那麼就會對應很多的行為。那麼對這些狀態的判斷和根據狀態完成的行為,就會導致多重條件語句,並且如果添加一種新的狀態時,需要更改之前現有的代碼。這樣的設計顯然違背了開閉原則。狀態模式正是用來解決這樣的 ...
  • mybatis實際上是一個更多關註sql語句的框架,他的出現是想讓開發者更簡單的去操作資料庫。 與hibernate相比較,hibernate更多的是去sql化,雖然hibernate也可以本地sql執行,hibernate更多的是關註與hql的編寫和對象映射的配置, 只要配置完了,hibernat ...
  • { let list = new Set(); list.add(5); list.add(7); console.log('size', list, list.size); //{5, 7} 2 } { let arr = [1, 2, 3, 4, 5]; let list = new Set(a... ...
  • 這個問題是我在公司需求的時候遇到的,QQ推廣工具網站獲取的鏈接在蘋果自帶瀏覽器沒法打開到聊天界面,是因為safair在打開到app store的時候把參數給丟了,app store再打開到QQ的時候就無法打開到鏈接所屬人的聊天界面。 在瀏覽器中可以通過JS代碼打開QQ並彈出聊天界面,一般作為客服QQ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...