移動端佈局單位介紹之rem

来源:https://www.cnblogs.com/abc-x/archive/2020/07/29/13401283.html
-Advertisement-
Play Games

本文主要寫給剛接觸移動端開發的同鞋們。 首先先將幾個主要概念講一下; 什麼是移動端? 移動端故名思義是為移動終端,大名叫移動通信終端,是指可以在移動中使用的電腦設備。其實就是我們常說的手機。 什麼是佈局? 前端開發中佈局是將主要的html結構佈置好。 rem是什麼? rem是一種長度單位,是而且僅 ...


本文主要寫給剛接觸移動端開發的同鞋們。

首先先將幾個主要概念講一下;

什麼是移動端?

移動端故名思義是為移動終端,大名叫移動通信終端,是指可以在移動中使用的電腦設備。其實就是我們常說的手機。

什麼是佈局?

前端開發中佈局是將主要的html結構佈置好。

rem是什麼?

rem是一種長度單位,是而且僅是根據根元素html改變的長度單位。

Root em(REM)是CSS3中新定義的一種長度單位。和之前的em(根據父元素改變大小)單位相比在使用上具有明顯的優勢。著名的響應式web框架Fundation就是用REMs作為基本的長度單位。

接下來還有幾個重要的概念需要交代一下;

什麼是像素?

中文全稱為圖像元素。像素僅僅只是解析度的尺寸單位,而不是畫質。  

定義:是指在由一個數字序列表示的圖像中的一個最小單位,稱為像素。

物理像素:一個物理像素是顯示器(手機屏幕)上最小的物理顯示單位,在操作系統的調度下,每一個設備像素都有自己的顏色值和亮度值。

設備獨立像素:設備獨立像素(也叫密度無關像素),可以認為是電腦坐標系統中得一個點,這個點代表一個可以由程式使用的虛擬像素(比如: css像素),然後由相關係統轉換為物理像素。

設備像素比: 設備像素比(簡稱dpr)定義了物理像素和設備獨立像素的對應關係,設備像素比 = 物理像素 / 設備獨立像素;

在javascript中,可以通過window.devicePixelRatio獲取到當前設備的dpr。

在css中,可以通過-webkit-device-pixel-ratio,-webkit-min-device-pixel-ratio和 -webkit-max-device-pixel-ratio進行媒體查詢,對不同dpr的設備,做一些樣式適配(這裡只針對webkit內核的瀏覽器和webview)。

如果設備寬高是375X667 DPR為2的話,其物理像素就要相應的乘以2,也就是為750X1334;

這時候如果你設置的css像素為1px,那麼在此設備上顯示的就為2px。(這就是經典的移動端一像素問題,下麵有解決方案)這對於佈局來說會造成問題。所以我們要將它統一起來。這個統一也必須是動態的。那麼我們怎麼去動態改變呢?

答案是通過視口設置寬高縮放。

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

當然這是靜態設置的,一旦換個DPR不同的設備就又會造成多1像素的問題。那麼我們要怎麼設置不同DPR的不同縮放比呢。

我們目標是,DPR為2的時候,initial-scale=0.5 ,DPR為3的時候,initial-scale=0.33333333。

相信大家都知道javascript,通過javascript我們可以動態的設置初始縮放。

首先我們要獲取dpr,在javascript中是通過: window.devicePixelRatio;來獲取的。那麼我就開始動態設置吧。

移動端1px解決方法:

<script>
/* 此腳本寫在html的head標簽中 */
var pixel = 1/window.devicePixelRatio;
document.write('<meta name="viewport" content="width=device-width,initial-scale='+pixel+','+'minimum-scale='+pixel+','+'maximum-scale='+pixel+'">')
</script>

ok,到這我們就解決了1px的問題。

接下來我們就要解決佈局單位的問題了;

首先我們知道佈局單位有很多:

px:用這個佈局的話,寫出來的大小隻能和設計稿上的一樣了。一旦換個終端就GG了。所以這種單位不用考慮了。

%;百分比佈局還是可以使用的,但如果是高度不確定的話就不適合了。

em:相對於父級,是個相對元素,一旦你要設置字體大小而又寬高不能統一,麻煩就來了。

rem:也是個相對元素,不過它只相對於根元素也就是html,用這個作為佈局單位能做到適配各種終端,當然前提是動態改變了根元素的font-size.

所以如果你要做的適配大部分的手機終端,那麼rem是個佈局的好單位。前提是動態設置了html的font-size大小。讓他隨設備的改變而改變.

那我們要怎麼動態改變呢,首先我們要獲取當前設備的寬度,用它去除以一個常數,這樣我們設置出來的font大小就是相對來說不變的。

獲取寬度可以通過javascript:getBoundingClientRect().width;

<script type="text/javascript">
    var html = document.querySelector('html');
    var width = html.getBoundingClientRect().width;
    html.style.fontSize = width/16 + 'px';
</script>

進行佈局的話建議用less去寫,因為less中可以用變數,這樣我們可以省去頻繁用計算器的時間了。


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

-Advertisement-
Play Games
更多相關文章
  • redis 為了速度,預設沒有開啟密碼口令驗證,為了安全,可以選擇開啟。 在 redis 的配置文件 redis.conf 的 requirepass 後設置密碼,示例設置為itbsl: 在修改完成後保存並重啟redis即可生效了,如果redis設置了口令,PHP連接redis也得設置auth了 $ ...
  • 本文更新於2020-05-03,使用MySQL 5.7,操作系統為Deepin 15.4。 MySQL的備份分為邏輯備份和物理備份,物理備份分為冷備份和熱備份。恢復分為完全恢復和不完全恢復,不完全恢復又分為基於時間點的恢復和基於位置的恢復。 邏輯備份和恢復 使用mysqldump進行邏輯備份,如my ...
  • 一般這個錯誤是由密碼錯誤引起,解決的辦法自然就是重置密碼。 假設我們使用的是root賬戶。 1.重置密碼的第一步就是跳過MySQL的密碼認證過程,方法如下: root 00:22:26~$ vim /etc/my.cnf (註:windows下修改的是my.ini) 2.在文檔內搜索mysqld定位 ...
  • Windows下mysql忘記密碼怎麼辦? 時隔半個月,我終於又開始操刀mysql,但是不小心砍到了我的腦子,密碼什麼的我全都忘了,結果,你懂的。。。所以,今天我就總結了一下網上的解決方法以及我自己的解決方法的一些心得。 方法一:免密碼進入mysql再修改密碼 步驟一:找到mysql安裝目錄下的配置 ...
  • 提到事務,相信大家都不陌生,事務的ACID四大特性,也是面試時經常問的,不過一般情況下,我們可能想到的是傳統關係型資料庫的事務,其實,Redis也是提供了事務機制的,本篇博客就來講解下Redis的事務機制。 1. 事務演示 Redis的事務提供了一種將多個命令請求打包,然後一次性、按順序性地執行多個 ...
  • 官方文檔https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_eight.htm#i1037226set autotrace off表示關閉,是預設的(set autot off)set autotrace on表示顯示結果、執行計劃、統... ...
  • why do it 如果你的App中包含或涉及到第三方登錄(例如:QQ登陸、微信登陸等),就必須接入蘋果登陸,如果不適配蘋果推出的Sign In With Apple審核將會被拒絕。 what is Sign In With Apple 其實和平時的一些第三方登陸一樣,通過授權,可以拿到用戶名,郵箱 ...
  • hi,我是老朋友,最近迷戀上了海外版本的抖音,也就是tiktok,然後想把某個老外的所有視頻保存下來,tiktok軟體里不支持,所以就網上搜尋了一番,發現一個不錯的線上工具。支持解析任何主播主頁的作品、喜歡視頻支持Tiktok 作品、喜歡批量下載。可以把Tiktok國際版抖音視頻批量去水印解析下載到 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...