作為前端的你不能不知道的知識,總結各種畫素及聯絡和viewpor視口

furfurJiang發表於2020-04-04

本篇文章總結各種畫素及聯絡和viewport視口

首先我們來談談最基礎的物理畫素。

物理畫素(裝置畫素)

物理畫素是真實存在的畫素,顯示裝置中一個最微小的物理部件,即螢幕上可以顯示的最小顆粒,在同一個裝置上,它的物理畫素是固定的,即一個裝置的解析度是固定的。 所謂的一倍屏、二倍屏,指的是裝置以多少物理畫素來顯示一個CSS畫素,越多的物理畫素去顯示一個css畫素就會提高其清晰度。

可以通過以下程式碼獲得螢幕真實物理畫素

window.screen.width //獲得螢幕水平方向上的畫素數
window.screen.height //獲得螢幕垂直方向上的畫素數
複製程式碼

解析度:用畫素度量,表示螢幕水平和垂直方向的畫素數,解析度越高,畫素的數目越多,感應到的影像越精密

在web開發中,可以使用px(畫素)、em、pt(點),in(英寸),cm(釐米)等作為長度單位。我們可以將上述單位劃分為相對長度單位和絕對長度單位。

  • 相對長度單位:px、em
  • 絕對長度單位:in、cm、pt

可以從下圖看出,螢幕都是3.5英寸,但是螢幕解析度卻相差一倍,有此我們可以看出,英寸是絕對長度,畫素是一個相對長度,畫素沒有固定的長度 在這裡插入圖片描述 由此,我們引出畫素密度的概念

畫素密度

一開始畫素密度DPI是應用於印刷業用來表示印表機每英寸可以噴出的墨汁點數,現在計算機借鑑了其概念,而最小的單位是畫素,可以用PPI值來表示螢幕每英寸的畫素數量,通過下圖我們可以很直觀的看到,都是一英寸的情況下,其物理畫素數量上的區別。 由此我們可以看出,畫素密度越高,說明單位尺寸內所能容納的畫素數量越多,顯示出來的畫面越清晰。

而我們常說的視網膜螢幕(Retina),知道是有較高PPI(大於320)的螢幕 在這裡插入圖片描述 在這裡插入圖片描述

那麼如何計算畫素密度呢? 公式: 在這裡插入圖片描述 例如: iPhone3G/S的螢幕解析度是480x320px,而iPhone4/S的螢幕解析度是960x480px,螢幕尺寸都是3.5英寸,那麼我們可以通過勾股定理計算: 在這裡插入圖片描述由上圖可以看出,iPhone4/S的畫素密度是iPhone3G/S的兩倍

至此我們瞭解了畫素密度對顯示清晰程度的影響,但是這又出現一個問題,低解析度和高解析度的裝置共存,就會引發一個問題,對於同一張圖片,低畫素的可以填滿整個區域,高畫素的無法填滿。這裡我們就需要引入一個新的單位,叫裝置獨立畫素 在這裡插入圖片描述

CSS畫素

也稱為裝置獨立畫素、邏輯畫素、裝置無關畫素,IOS稱之為PT,Android稱之為DIP或DP,預設情況下在PC端等於一個物理畫素,通過瀏覽器的縮放,會出現大於小於等於的三種情況 在這裡插入圖片描述

裝置畫素比(Device Pixel Ratio, DPR)

一個裝置的物理畫素與邏輯畫素之比:裝置畫素比 (dpr)= 物理畫素(dp) / 裝置獨立畫素(dip)

可以通過以下程式碼獲得,裝置上物理畫素和裝置獨立畫素的比例

window.devicePixelRatio
複製程式碼

在Retina屏的iphone上,devicePixelRatio的值為2,也就是說1個css畫素相當於2個物理畫素。通常所說的二倍屏(retina)的dpr是2, 三倍屏是3。 可以通過獲取比例來進行相應處理。即可以通過獲取對應的比例來使圖片放大到對應的比例

但是這又引發一個問題,圖片放大,會降低精度。

由此我們引入二倍圖的概念,可以通過二倍圖或者三倍圖,將原圖片進行縮小,以保持其精度。

看完畫素這部分,我們再來看看移動端最重要的視口

視口(viewport)

PC端的viewport的大小取決於瀏覽器的大小,以CSS畫素為單位 可以通過以下程式碼獲得html元素的大小,即PC端viewport的寬高:

document.documentElement.clientWidth
document.documentElement.clientHeight
複製程式碼

提示:如果調整瀏覽器的寬度,viewport的寬高就會跟著改變

視口這個概念更多的應用於移動端

(1)layout viewport(佈局視口)

指的是我們可以進行網頁佈局區域的大小,以CSS畫素做計量單位。移動裝置預設會設定一個較大的viewport(如IOS一般預設是980px),layout viewport 的寬度是大於瀏覽器可視區域的寬度的。

layout viewport的寬度可以通過 document.documentElement.clientWidth來獲取。

document.documentElement.clientWidth
document.documentElement.clientHeight
複製程式碼

在這裡插入圖片描述在這裡插入圖片描述

(2)visual viewport (視覺視口)

即裝置的畫素解析度,以iphone8為例,解析度為750*1334畫素 visual viewport的寬度可以通過window.innerWidth來獲取。

window.innerWidth
window.innerHeight
複製程式碼

這裡簡單看一下佈局視口和視覺視口的區別: 在這裡插入圖片描述

(3)ideal viewport(理想視口)

ideal viewport是一個能完美適配移動裝置的viewport。無論是在何種密度螢幕,何種解析度下,顯示出來的大小都差不多。ideal viewport並沒有一個固定的尺寸,不同的裝置有不同的ideal viewport。理想視口與裝置的寬度一致,例如iphone8的理想視口是375px

ideal viewport 的意義在於,無論在何種解析度的螢幕下,針對ideal viewport 而設計的網站,不需要縮放和橫向滾動條都可以完美地呈現給使用者。

window.screen.width
window.screen.Height
複製程式碼

翻轉螢幕

當你拿著手機螢幕進行翻轉的時候:

如果visual viewport 的寬度 > layout viewport 的寬度,那麼viewport需要zoom in(放大,拉近),以適應visual viewport的寬度

如果visual viewport 的寬度 < layout viewport的寬度,那麼viewport需要zoom out(縮小,拉遠),以適應visual viewport的寬度

<meta name="viewportcontent="width:device-width">
複製程式碼

device-width會將手機橫向物理畫素/轉化系統作為其值,並重置相應的layout viewport的值,並適應visual viewport。

meta標籤作用

利用meta標籤對viewport進行控制

<meta name="viewportcontent="width=device-widthinitial-scale=1.0maximum-scale=1.0user-scalable=0">
複製程式碼

在蘋果的規範中,meta viewport 有6個屬性如下:

引數 含義
width 設定layout viewport 的寬度,為一個正整數,也可為字串"width-device",一般為字串"width-device"
initial-scale 設定頁面的初始縮放值,為一個數字,可以帶小數,一般為1.0
minimum-scale 允許使用者的最小縮放值,為一個數字,可以帶小數,一般為1.0
maximum-scale 允許使用者的最大縮放值,為一個數字,可以帶小數,一般為1.0
user-scalable 是否允許使用者進行縮放,值為"no"或"yes", no 或0代表不允許,yes或0代表允許
height 設定layout viewport 的高度,這個屬性對我們並不重要,很少使用

由於initial-scale = ideal viewport /layout viewport 也就相當於設定width=device-wdith,但是為了解決一些相容性問題比如iphone、ipad以及IE 會橫豎屏不分,會選擇將兩個屬性都寫上

最後總結

物理畫素是真實存在的,但是沒有固定的長度,在螢幕大小相同情況下,螢幕的物理畫素越多,圖片越清晰,也就是畫素密度越高,圖片越清晰; 為了解決不同螢幕的解析度高低問題導致的圖片大小不同,引入了CSS畫素,由此推算除裝置畫素比,也就是物理畫素與CSS畫素的關係,當裝置畫素比為2時,二倍屏下的1個css畫素相當於2個物理畫素,那麼我們就採用二倍圖並縮小一倍的方式來保證圖片精度及大小。

視口的話分為三種layout viewportvisual viewportideal viewport,deal viewport是一個能完美適配移動裝置的viewport。

meta標籤推薦寫法:

<meta name="viewportcontent="width=device-widthinitial-scale=1.0maximum-scale=1.0user-scalable=0">
複製程式碼

本篇文章參考資料: https://www.cnblogs.com/jianxian/p/11178378.html https://blog.csdn.net/zhouziyu2011/article/details/60570547 https://www.cnblogs.com/2050/p/3877280.html https://blog.csdn.net/weixin_34348174/article/details/87962105 https://segmentfault.com/a/1190000006068808 https://segmentfault.com/a/1190000011586301

有用的話點贊謝謝

歡迎大家關注我的公眾號哦
歡迎大家關注我的公眾號哦

相關文章