在移動端開發時,常常會遇到在視網膜屏幕中元素邊框變粗的問題。本文將帶你探討邊框變粗問題的產生緣由及介紹目前市面上最好的解決方法。css
蘋果 iPhone4 首次提出了 Retina Display(視網膜屏幕)的概念,在 iPhone4 使用的視網膜屏幕中,把 2x2 個像素當 1 個物理像素使用,即便用 2x2 個像素顯示原來 1 個物理像素顯示的內容,從而讓 UI 顯示更精緻清晰,這 2x2 個像素叫作邏輯像素。像這種像素比(像素比(即dpr)= 物理像素 / 邏輯像素)爲 2 的視網膜屏幕也被稱爲二倍屏,目前市面上還有像素比更高的三倍屏、四倍屏。而 CSS 中 1px 指的是物理像素,所以,設置爲 1px 的邊框在 dpr = 2 的視網膜屏幕中實際佔用了 2 個邏輯像素的寬度,這就致使了界面邊框變粗的視覺體驗。html
經過設置元素的 box-sizing 爲 border-box,而後構建僞元素,再使用 CSS3 的 transform 縮放,這是目前市面上最受推崇的解決方法。這種方法能夠知足全部的場景,並且修改靈活,惟一的缺陷是,對於已使用僞元素的元素要多嵌套一個無用元素。具體的實現以下:git
.one-pixel-border { position: relative; box-sizing: border-box; } .one-pixel-border::before { display: block; content: ""; position: absolute; top: 50%; left: 50%; width: 200%; height: 200%; border: 1px solid red; transform: translate(-50%, -50%) scale(0.5, 0.5); }
這樣就能夠獲得 0.5px 的邊框。github
還能夠結合媒體查詢(@media)解決不一樣 dpr 值屏幕的邊框問題,以下:web
@media screen and (-webkit-min-device-pixel-ratio: 2), (min-resolution: 2dppx) { ... } @media screen and (-webkit-min-device-pixel-ratio: 3), (min-resolution: 3dppx) { ... }
注意:IOS 系統的 safari 瀏覽器不支持標準的 min-resolution,使用非標準的 min-device-pixel-ratio。npm
pixel-border.css是一個解決移動端 1px 邊框的通用 CSS 工具。使用 transform 的解決方法,僅有幾行的源碼,使用起來很是方便,是目前發現最好的解決方法。瀏覽器
npm安裝:工具
npm install pixel-border --save
yarn安裝:3d
yarn add pixel-border
瀏覽器安裝,建議安裝壓縮後的版本:code
<link rel="stylesheet" href="path/to/pixel-border.min.css"><link>
pixel-border 經過元素的 ::before 僞元素使用 transform 縮放爲元素設置邊框。所以,你可使用原生的 CSS 邊框屬性爲原素設置邊框,只須要在元素上添加一個 pixel-border 或 pixel-border="true" 的屬性,並設置元素的 border-style 值便可。以下會建立一個單像素邊框:
<div pixel-border style="border-style: solid;">單像素邊框</div>
注意:pixel-border已爲元素的邊框設置爲固定值 1px,所以不要爲元素再設置 border-width,而且元素的 box-sizing 值被設置爲 border-box,請不要重置爲其餘類型的值。
設置任意邊框:
設置元素某一邊的邊框時,只需爲元素設置 border-top-style、border-bottom-style、border-left-style、border-right-style 其中一項的值,並設置元素 border-color 的值便可。以下設置上邊邊框:
<style> .border-top { border-top-style: solid; border-top-color: red; } </style> <div class="border-top" pixel-border>上邊框</div>
設置圓角邊框:
當須要圓角邊框時,始終爲 border-radius 設置百分比值。以下:
<style> .border-radius { width: 100px; height: 100px; border-style: solid; border-color: red; border-radius: 10%; } </style> <div class="border-radius" pixel-border>圓角邊框</div>