分清像素和像素比 與 認識 1px 的問題

像數(shù)

為影像顯示的基本單位。 https://www.wikiwand.com/zh-sg/%E5%83%8F%E7%B4%A0

CSS像素(CSS pixels)

瀏覽器使用的抽象單位,用來精確度量網(wǎng)頁上的內(nèi)容。 eg:平時經(jīng)常寫的width:100px;height:100px; 都是與設備無關(guān)的。

設備獨立像素 (device - independent-pixels)

也可以稱為設備無關(guān)的邏輯像素

meta里面設置width=device-width,這個device-width就是設備獨立像素 。


在chrome里 看到的375*667 320*480等等都是設備獨立像素,它們在數(shù)值上與css數(shù)值是相等的

設備像素(device pixels )

也稱為物理像素,是顯示屏的最小物理單位,每一像素都包含自己的顏色、亮度。像素是沒有大小的、是一個抽象概念、是一個相對單位。

Device Pixel Ratio,設備像素比。

window.devicePixelRatio。 一般情況下: DPR = DP / DIP

以我手上的 pro6 為例:
window.devicePixelRatio // 3
screen.width, screen.height // 320 640

官網(wǎng)分辨率: 1920 x 1080

關(guān)于像素

有一個常見的錯誤理解:認為像素是一個寬高相等的小方塊,并且的像素都是“那么大”,但是不知道這個寬高的具體數(shù)字。分辨率:泛指量測或顯示系統(tǒng)對細節(jié)的分辨能力。以PC屏幕,手機屏幕為例,分辨率1920*1080 是指屏幕縱向能顯示1920個像素,橫向能顯示1080個像素 描述分辨率的單位有:dpi(點每英寸)、lpi(線每英寸)和ppi(像素 每英寸)。從技術(shù)角度說,“像素”只存在于電腦、手機顯示領域,而“點”只出現(xiàn)于打印或印刷領域。

ppi( pixel per inch)

顯示器的每英寸像素值,首先要確定屏幕的尺寸和分辨率。



以尺寸為4.7英寸、分辨率為1334*750的iphone6為例


邏輯像素(dp,pt)

為了抹去高密度分辨率屏幕(高清屏)所帶來的適配問題,iOS與Android兩個平臺分別提出了pt(point)與dp(device-independent pixel)兩個單位。他們的名稱不一樣,但是內(nèi)涵是一樣的。

視網(wǎng)膜屏

視網(wǎng)膜(Retina)屏幕是喬布斯的一個營銷術(shù)語。

Viewport

layout viewport 和 visual viewport。

Layout viewport - 渲染視圖,渲染頁面所需要的尺寸
Visual viewport - 視覺視圖,瀏覽器可視區(qū)域尺寸

CSS 的多種單位

參考

0.5px 的問題

首先自己確實對移動端不熟啊,很多東西都沒有認真研究過。那么下面說下 0.5px 的問題吧,網(wǎng)上文章太多,質(zhì)量良莠不齊。其實 0.5px 這個問題準確來說是講得 1px 的問題。

在熟悉了上面說的 設備像素和設備獨立像素后 來理解這個 1px 的問題就迎刃而解了。那么這個問題到底說的是什么呢?

喬布斯提出了 視網(wǎng)膜屏 這個概念,其實算是個營銷術(shù)語吧。其實對于 ppi 高于 300 的屏幕都可以說成是視網(wǎng)膜屏。就目前大多數(shù)手機而言, ppi 都很高, DPR 都是 >2 的。 那么就變成了多個物理像素來顯示一個邏輯像素。這就是大家說的 1px 變成了 2px 的問題。其實這里有個錯誤,應該是 1像素 成了 2像素, 因為這個指的是 物理像素。而邏輯像素上 1px 就是 1px ,并沒有變大。

那么我們現(xiàn)在需要 1個物理像素的border, 并且需要考慮圓角。

rem + viewport

// 美團為例: http://i.meituan.com/
// 正常情況:
<meta name="viewport" content="initial-scale=1, user-scalable=no">
html {
    font-size: 50px;
}

// 高 DPR: 
<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">
html {
    font-size: 100px;
}

baidu google 都是 initial-scale=1 , 即使是大網(wǎng)站,都有不同的設置和理解。

這個方法,也是目前我覺得最好的,沒有明顯的兼容性問題,完全不用考慮圓角等,而使用其他 hack 手段。

Box-shadow

效果還不錯

<div class="example--box-shadow"></div>
<div class="example--box-shadow-round"></div>
<div class="example--box-shadow-2"></div>


.example--box-shadow {
  box-shadow: 0 0.5px 0 #000;
}

.example--box-shadow-2 {
  box-shadow: 0 0.1px 0 #000;
}

.example--box-shadow-round {
  width: 200px;
  height: 100px;
  margin-left: 100px;
  border-radius: 10px;
  box-shadow: 0 0 0 0.5px #000;
}

iOS8 +

JS判斷UA,是否是ios8+,是的話則輸出類名hairlines,為了防止重繪,這段代碼加在head里即可。

if (/iP(hone|od|ad)/.test(navigator.userAgent)) {
    var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/),
        version = parseInt(v[1], 10);
    if(version >= 8){
        document.documentElement.classList.add('hairlines')
    }
}

是否支持0.5px邊框

JS判斷是否支持0.5px邊框,是的話,則輸出類名hairlines。

if (window.devicePixelRatio && devicePixelRatio >= 2) {
  var testElem = document.createElement('div');
  testElem.style.border = '.5px solid transparent';
  document.body.appendChild(testElem);
  if (testElem.offsetHeight == 1)
  {
    document.querySelector('html').classList.add('hairlines');
  }
  document.body.removeChild(testElem);
}

div {
  border: 1px solid #bbb;
}
 
.hairlines div {
  border-width: 0.5px;
}

radio 的媒體查詢

這個用于圖片等一些處理還不錯,畢竟 0.5 不是誰都有的(2333)

.css{
    background-image: url(img_1x.png); // 普通顯示屏(設備像素比例小于等于1.3)使用1倍的圖 
    border: 1px;
}
@media only screen and (-webkit-min-device-pixel-ratio:1.5){
.css{
    background-image: url(img_2x.png); // 高清顯示屏(設備像素比例大于等于1.5)使用2倍圖 
    border: 0.5px;
  }
}

其余

這幾個方法效果比較差,就不多說了。

  • transform: scale(0.5)
  • linear-gradient(to bottom, #000 0%, #000 51%, transparent 51%)
  • 圖片

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容