用rem實現WebApp自適應的優劣分析

来源:http://www.cnblogs.com/qieguo/archive/2016/04/13/5386565.html
-Advertisement-
Play Games

關於rem實現屏幕自適應佈局的討論還是比較多的,剛好我也看到使用rem實現自適應的web app,所以也來湊下熱鬧。 說起rem,免不了要聯繫到em、px,這裡簡單提提他們的定義和特點。 1. px:像素(Pixel),相對長度單位。像素px是相對於顯示器屏幕解析度而言的,手機上的100px和電腦上 ...


關於rem實現屏幕自適應佈局的討論還是比較多的,剛好我也看到使用rem實現自適應的web app,所以也來湊下熱鬧。

說起rem,免不了要聯繫到em、px,這裡簡單提提他們的定義和特點。

1. px:像素(Pixel),相對長度單位。像素px是相對於顯示器屏幕解析度而言的,手機上的100px和電腦上的100px其實絕對長度是不一樣的,肉眼就能看出來,嚴謹的你可以用尺子量一下,這就是因為他們的解析度不同。還有相當多的人認為px是絕對單位,這裡告訴大家不要人與亦雲,多思考。

2. em:相對於當前對象內文本的字體尺寸,會繼承父級的字體尺寸。也就是說 1em=1*父級元素的font-size。明顯,在多層嵌套的結構下使用em的話,由於層層繼承的緣故,要確定最終呈現出來的尺寸會非常麻煩,過於混亂。

3. rem:相對於html根元素文本的字體尺寸,與中間層字體尺寸無關。也就是說 1rem=1*html元素的font-size。rem就相當於是一個全局縮放因數,改變它一個就可以縮放所有以它為單位的元素,只要將它與屏幕解析度關聯起來,就可以完成屏幕自適應展現。

關於rem實現自適應的具體解釋可以看看isux組的這篇文章:https://isux.tencent.com/web-app-rem.html,裡面實現自適應有兩個途徑,分別是media查詢和js動態計算。提問區裡面說到如果只是在頁面底部用js動態計算的話,頁面元素尺寸改變時會有一定的閃爍現象。建議是先在css里根據屏幕用@media初始化一遍html 的font-size,然後再用js計算。提問區裡面還有人問js代碼的,這樣的問題博主都沒興趣回答了,我貼一份吧。

 1 <script>
 2         (function (doc, win) {
 3           var docEl = doc.documentElement,
 4             resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
 5             recalc = function () {
 6               var clientWidth = docEl.clientWidth;
 7               if (!clientWidth) return;
 8               docEl.style.fontSize = 20 * (clientWidth / 320) + 'px';
 9             };
10 
11           if (!doc.addEventListener) return;
12           win.addEventListener(resizeEvt, recalc, false);
13           doc.addEventListener('DOMContentLoaded', recalc, false);
14         })(document, window);
15 </script>
View Code

rem的優勢                                                                                

使用rem的優勢非常明顯了,尤其是在現在屏幕解析度千差萬別的時代,只要將rem與屏幕解析度關聯起來就可以實現頁面的整體縮放,所以設備上的展現都統一起來了。而且現在瀏覽器基本都已經支持rem了,相容性也非常的好。在上文提問區中還有一些人說“QQX5內核瀏覽器不支持rem單位,在大部分android 機上的微信頁面不起作用”,我表示沒這樣的事,還是那句話,多思考多驗證。

rem的劣勢                                                                                           

其實rem的優勢也正是他的缺點,rem的屏幕自適應與當前兩大平臺的設計哲學不一致!從用戶體驗上來看,文字閱讀的舒適度跟媒體介質大小是沒關係的。簡單的來說,你本來喜歡麻將那麼大的紅燒肉,一口一塊爽爆了,但是服務員換了個大盤子,就給你上了砂鍋那麼大的一整塊肉。因為盤子大了肉也要成比例放大~~

   VS    

無論盤子大小,你都希望能一口吃下那塊肉,文字閱讀也是一樣。字體根據媒介縮放是因為屏幕太小的時候,為了呈現更多的內容,因為頻繁翻頁的用戶體驗也是很差的。另外,圖片視頻的尺寸不應該隨意縮放,如果圖片視頻的寬高都用rem關聯起來, 這樣雖然是等比縮放了,但是有時候我們並不想圖片被放大。你看下圖,對吧。

   VS    

還有就是圖片像素不高的時候,小屏到大屏的放大會讓圖片變模糊,這樣還不如小尺寸看著順眼。

關於優劣勢的討論可以看知乎上的討論,我也引用了大神們的觀點,標明一下出處哈。http://www.zhihu.com/question/21504656?

總體上來說,使用rem的優勢遠遠大於劣勢,對於上文提到的問題點,使用px+rem的方式還是可以得到很好的用戶體驗的。一般rem用於需要跟隨屏幕變化的尺寸(這不是廢話嗎?),px用於字型大小,細邊框等不應該隨屏幕變化的元素上。在web APP中,rem的使用肯定會越來越普遍的,大家就慢慢探索吧。還是那句話,多思考,多從用戶的角度思考問題,這才是前端思維。

PS:關於rem的一些小問題

1)html的font-size設置到12px以下還是會按照12px=1rem來計算,這樣所有使用了rem單位的尺寸都是錯的。原因看2)。話說,直接設置為100px不好麽?body再設置要用的字型大小不就好了?

2)百度谷歌出來的結果裡面,html{font-size:62.5%}的設置一大堆,不推薦使用這種方式,多此一舉,簡直愚蠢!這裡利用了瀏覽器預設字型大小16px,16*62.5=10px,為何不直接設置為10px呢?但是設置為10px也是不好的,子元素繼承了10px的字體大小也是沒用的,因為chrome瀏覽器預設最小字體是12px。當然你有一萬種改預設設置的辦法,把字體設置到1px大小都可以。看看上文說的閱讀體驗,你確定要把字體設得那麼小,讓你的用戶都眯成了鬥雞眼?

問題暫時發現就這2個,如果你發現有其他問題,可以發在討論區,咱們聊聊。

總結就到這裡了,聽說放點美圖可以拉高文字質量呢,都是自拍哦~~

秋日荒川

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.事件流 瀏覽器開發團隊遇到一個很有意思問題:頁面的那一部分會擁有特定的事件? 對於理解這個問題您可以想象畫在一張紙上的一組同心圓,如果你把手指放在圓心上,那麼你的手指指向的其實不是一個圓,而是紙上所有的圓。放到實際頁面中就是,你點擊一個按鈕,而是紙上所有的圓。 <慄子:現實生活中的聲波、水波> ...
  • File—>Save With Encoding—>UTF-8 with BOM ...
  • 今天,我在刷面試題的時候,突然想到一道題:如何將一個頁面平均分成四個部分(div)呢?其實難度也不大,於是直接上代碼 效果圖如上。從代碼上看,就是先確定一個占滿全屏的div,並設置其position:absolute,而它的四個子div由於左浮動便自動浮動到相應的位置。除了這種方法,當然還有其他的方 ...
  • eval學習 ...
  • 自己寫的一個簡陋的貪吃蛇游戲,源代碼如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>貪吃蛇小游戲</title> 6 <style> 7 *{margin:0; padding:0 ...
  • 下麵來解釋下這幾個插件 (0)Context : 管理這些亂七八糟的擴展程式,插件用的時候,點開,不用的時候,關閉,這樣可以降低游覽器的負荷 (1)AngularJS Batarang : 測試angular用的,打開控制台以後會出現angularJS的選項 (2)Duitang : 堆糖網站收集圖 ...
  • 我把在網上看到感興趣WEB頁面,搜集了下,大家如果感興趣,歡迎Star, 一起多多交流。 先貼出地址:http://yunkaiyueming.github.io/ 下麵列出自己搜藏的有趣的網頁: 1. Rose 真浪漫 這是一個用js繪製出的一朵Rose(趕快get),重要部分的代碼: <scri ...
  • ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...