px、物理像素、rem、rpx的關系

在開發中,我們常用的幾個尺寸的單位,就是px,rem,微信小程序中會用到rpx,可能你不理解它們的關系也能用起來,但想避過與單位有關的一些坑,你就得深入理解他們。

px和物理像素

顯示的原理就是把要顯示的數據寫入顯存區域,然后顯示設備讀取這些數據,驅動硬件就可以顯示了。顯示的數據是以像素為單位的,一個像素只能顯示一種顏色,但是根據顯示顏色的總數不同,每個像素占的位數也不同。如果我想顯示黑白,那一位就可以存儲了,但如果我想顯示16種顏色,就得4位來存儲一個顏色,這樣的一個存儲單位就叫做物理像素

我們寫樣式時一個像素記作1px,但是css的px和物理像素是一一對應的嗎,是同樣的概念么?在pc端是這樣的,因為屏幕足夠大,一個css像素用一個物理像素來顯示,完全可以,pc端默認情況下一個css像素就對應著一個物理像素,但是有沒有發現你把分辨率調小以后,顯示的內容變大了,但是顯示器的物理像素肯定不會變啊,這時候其實就是一個css像素對應著若干個物理像素了,這個是與用戶設置有關。

移動設備大小是有限的,而且分辨率不低,甚至比pc端更高,也就是可以顯示的物理像素更多,如果和pc端一樣,一個css的px和物理像素一一對應,可以想象,顯示的內容有多小。這樣肯定是不行的,解決這個問題,我們可以很自然的想到,那在移動設備上就別一一對應了,一個css的px對應多個物理像素吧,這樣就不至于顯示的內容過小了,實際上移動設備也是這么做的,你在開發時寫的px和最終渲染顯示的物理像素數不是一比一的,可能一個px對應2個物理像素,可能3個物理像素,設備顯示的物理像素數和你css的px數的比值就叫做設備像素比(device pixel radio),簡稱dpr。好了,這樣顯示內容過小的問題就解決了。

有了dpr之后,有一個問題就是同樣的一張圖片,我設了寬高的px數,那么在dpr為1的設備上,和dpr為2的設備上顯示的效果是一樣的,1個px在dpr為1的設備上會用1個物理像素來顯示,在dpr為2的設備上會用2*2個物理像素來顯示,這樣dpr高的優勢就體現不出來了,我設備比他的好,你給我的體驗是一樣的,可能有些用戶不爽,我們可以區分對待,對于高dpr的設備,用物理像素更多的高清圖片來替代,也就是2x圖,3x圖等等。

rem和rpx

rem

移動設備的寬度是各種各樣的,每個設備的dpr也不同,換句話說就是不同設備每一行的物理像素數不同,能顯示的css的px數也不同,如果我們寫死px的話,那么后果就是同樣的px,在不同設備中顯示的行數不同,這樣整個排版就亂了,想想有啥解決的思路沒?

分析一下造成顯示效果不同的原因就是設備寬度不同,你可能會問,那dpr呢,其實與dpr一點關系都沒有,想象一下2個寬度為1000個物理像素的設備,一個dpr為1,一個dpr為2,那么在我們看來不過一個是1000px,一個是500px而已,在這里我們感知不到dpr。那么設備寬度不同怎么做適配呢,其實很容易的會想到,每個設備每行顯示的px數不同,你寫死px數的話,那肯定顯示的效果不一樣,所以,不能寫死,要動態的計算。對,實際上也是這么解決的,那怎么計算呢,很簡單,你把一個設備的樣式寫好了,其他的根據設備的寬度(px數)的比,來動態計算就行了。

rem就是解決這個問題的,rem不是具體的px,rem具體顯示多少像素,是根據根元素的font-size來計算的,比如說你設置了1.2rem,根元素的font-size是100px,那么這個元素動態算出來的px數就是120px。不同寬度,設置不同px,這樣就可以適配所有寬度的設備了。看一下實際開發中我們動態計算根元素font-size的代碼:
先來個偽代碼:

   var  根元素fontsize =  實際設備寬度 / 開發時設備寬度  * 開發時根元素font-size

具體代碼是:(假設開發時我們適配的是iphone6,也就是375px的設備,我們開發時根元素font-size設為了100px)

   document.documentElement.style.fontSize =
 (document.documentElement.offsetWidth/375)*100 + 'px' ;

這樣就可以了,其實我們還可以再除以2,為什么呢,因為我們現在設計稿量出來的是物理像素,iphone6的dpr是2,我們要把量出來的數除以2,就是實際的px,然后再除以100,就是rem,既然每次都要這么做,為什么不在根元素這里把除以2給統一做了,只需要把量出的數只要除以100就是rem了。挺完美,現在基本也是用的這種方案。

其實除了根據設備寬度比例計算具體px還有一種思路,我們可以根據設備寬度不同,給不同元素設置不同的px不就行了,這也是一種思路,媒體查詢可以做到這個,也有些網站是這么做的,但是這樣不能兼顧所有的設備,因為你不可能設置很多套樣式,只會在關鍵的幾個設備寬,設置幾套,而動態計算的方式,可以適配所有的寬度。

rpx

微信小程序開發時用的是前端的技術,類似html的組件標簽,css,js,他面臨的問題和網頁一樣,就是不同寬度的設備的適配,解決思路當然也是一樣,但是有一點不同的是不能用rem,為什么呢,因為根本就沒有html元素啊,咋解決,很簡單,我不基于html的font-size了,我基于一個別的值就行了,你也不需要計算這個值,我給你計算了,這就是rpx。最終的效果就是,你開發時在iphon6的設計稿上量了多少px,就寫多少rpx就行了,完美適配,perfect!

一些坑

其實這個看似完美的方案也會帶來一些問題,比如說,我根據rem乘以根元素font-size算出的px值有小數,最終是零點幾px咋辦,不同瀏覽器對這個支持程度不同,有的只渲染出零點幾px對應的物理像素,有的干脆都顯示1px,后果就是,同樣的rem值,在不同dpr的設備上寬度不同,最常見的就是邊框,有的設備上顯得特寬,特別扭,也就是經典的1px邊框問題。這個問題的解決方案也有很多,可以通過設置1px,然后根據不同dpr,設置不同的縮放來做,當然也有其他的方案。我這里只是想說rem帶來的一些問題。

像素比和寬度比

像素比:dpr是設備像素比,也就是css的設備無關像素px和物理像素的比
寬度比:開發適配的設備的寬度(現在一般是iphone6),和實際的設備的寬度的比
總的來說,可以一句話來總結,像素比實現高清,寬度比實現適配

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容

  • 剛開始做移動端web開發的同學應該都碰到過頁面適配問題,為什么我在開發手機上調試好的頁面在其他手機會有這樣或那樣的...
    留七七閱讀 19,457評論 5 80
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,779評論 1 92
  • 一、meta標簽的效果 移動端頁面一般會在head頭部添加如下meta標簽。 該meta標簽是否添加對頁面渲染的影...
    nimw閱讀 3,604評論 0 5
  • 一,flexible.js 的使用方式: github地址:https://github.com/amfe/lib...
    愿你如夏日清涼的風閱讀 130,130評論 5 117
  • 就愛閱讀的人來說,相信不少人對張鳴這個名字不陌生。他是人民大學的教授,為人正直,還夾雜著些許的古板。他文筆雋永,思...
    微言微評閱讀 280評論 0 0