移動端高清屏 1px 解決方案
比如在移動端高清屏上設定1px尺寸的邊框效果,雖然程式碼正確,但是並不能讓人滿意。
首先看如下程式碼片段:
[CSS] 純文字檢視 複製程式碼div { width:5rem; height:2rem; border:1px solid red; }
上述程式碼實在太簡單了,設定div的長和寬,最後設定其邊框的尺寸1px。
雖然程式碼在語法上沒有任何問題,但是實際效果可能難以讓人滿意,甚至難過公司UI這一關。
丟擲的原因大致是"邊框太粗了",確實有點讓人迷惑,目的是設定邊框為1px,程式碼也是如此設定。
一.邊框過粗原因分析如下:
首先強調一點,上述程式碼設定邊框為1px在語法上沒有任何問題,在高清屏上顯示的確也是1px尺寸。
但是在web中存在多種畫素,具體可以參閱裝置畫素、獨立畫素和css畫素一章節。
程式碼中設定的是CSS畫素,但是在高清屏中,一個CSS畫素並不等於一個裝置畫素,這是原因所在。
當前的智慧手機絕大多數都是高清屏,1CSS畫素可能佔用4個物理畫素,或者更多。
簡單圖示如下:
上圖描述的是1CSS畫素佔用4個裝置畫素的體積,在實際專案中最好設定為1px裝置畫素。
二.解決方案如下:
既然知道了其中原理,那自然就可以給出相應的解決方案,方式有多種。
1.使用小數表示邊框:
比如可以設定邊框的CSS畫素值為0.5,確實是一種比較簡便的方式。
但是當前還存在一定的瀏覽器相容性問題,也許未來這一些都會發生變化。
程式碼片段你如下:
[CSS] 純文字檢視 複製程式碼.border { border: 1px solid #999 } @media screen and (-webkit-min-device-pixel-ratio: 2) { .border { border: 0.5px solid #999 } } @media screen and (-webkit-min-device-pixel-ratio: 3) { .border { border: 0.333333px solid #999 } }
上述程式碼簡單分析如下:
(1).上述程式碼採用媒體查詢方式,如果在非高清屏,則設定邊框為1px。
(2).如果是高清屏,且dpr等於2,那麼設定邊框為0.5px。
(3).如果是高清屏,且dpr等於3,那麼設定邊框為0.333333px。
上面是基本的數學問題,不再做進一步介紹,媒體查詢知識參閱CSS @media 媒體查詢一章節。
2.border-image屬性方式:
第一種方式具有一定的瀏覽器相容性,如果要求嚴格,可以採用下面方式。
會涉及到CSS3的border-image,具體可以參閱CSS border-image一章節。
採用如下圖片作為示範:
上述圖片簡單說明如下:
(1).圖片的長度和寬度都是6px。
(2).圖片具有黑色和透明兩部分(白色區域表示透明),黑色部分則是要我們真正要顯示的邊框。
下面是一段程式碼片段可以實現1px裝置畫素邊框效果:
[CSS] 純文字檢視 複製程式碼@media screen and (-webkit-min-device-pixel-ratio: 2){ .border{ border: 1px solid transparent; border-image: url(border.gif) 2 repeat; } }
上述程式碼分析如下:
(1).通過媒體查詢判斷當前螢幕是否是dpr等於2的高清螢幕。
(2).如果dpr等2,那麼首先設定元素的邊框為1px。
(3).最後通過border-image屬性將圖片由外向內切割2px,一半為黑,一半為透明。
(4).也就是將2px的圖片壓縮到1px的容器內,原來黑色部分為1px,經過壓縮之後變為0.5px。
3.flexible.js外掛:
此外掛首先會檢測當前螢幕的dpr,然後再進行相應的縮放,以此達到1px裝置畫素顯示效果。
在安卓機器上可能有一些問題,因為安卓機的一些關鍵屬性的返回值多種多樣。
關於此方案具體內容可以參閱rem移動端適配一章節。
4.通過CSS3縮放:
此種方式相當的簡單,程式碼片段如下:
上述程式碼簡單分析如下:
[CSS] 純文字檢視 複製程式碼.radius-border{ position: relative; } @media screen and (-webkit-min-device-pixel-ratio: 2){ .radius-border:before{ content: ""; pointer-events: none; /* 防止點選觸發 */ box-sizing: border-box; position: absolute; width: 200%; height: 200%; left: 0; top: 0; border-radius: 8px; border:1px solid #999; transform:scale(0.5); transform-origin: 0 0; } }
對上述程式碼片段分析如下:
(1).通過偽元素選擇器建立一個偽元素,邊框為1px,並且將尺寸設定為父元素的2倍。
(2).然後在通過transform:scale將元素縮小到百分之50,這樣就做到了將邊框設定為1裝置畫素的效果。
相關文章
- 移動端1px解決方案
- 解決移動端1px Border
- 移動端1px誤差的原因以及解決方案
- 移動 web 1px 邊框解決方案Web
- 7 種方案解決移動端1px邊框的問題
- 目前解決移動端1px邊框最好的方法
- 移動端滾動穿透解決方案穿透
- 移動端滾動穿透問題解決方案穿透
- 移動端適配問題解決方案
- 移動端滾動穿透問題完美解決方案穿透
- 移動端1px邊框問題
- 移動端事件穿透的原理與解決方案事件穿透
- 移動端canvas不支援rem的解決方案CanvasREM
- 移動端比1px還小的border
- 移動端實現1px的邊框
- 適配移動端的問題以及解決方案
- SVG圖片在移動端的應用解決方案SVG
- 1px邊框解決方案總結
- 移動端swiper嵌iframe無法滑動的解決方案
- 移動端常見相容性問題解決方案
- Vue.js 移動端適配之 vw 解決方案Vue.js
- 移動端深度編輯產品技術解決方案
- 支付寶移動端 Hybrid 解決方案探索與實踐
- 解決移動端滾動穿透穿透
- 移動端滾動穿透是什麼原因?有哪些解決方案?穿透
- 深入理解移動端適配與探究其解決方案
- 移動端H5頁面生成圖片解決方案H5
- vue移動端h5適配解決方案(rem or vw)VueH5REM
- 移動端web自適應適配佈局解決方案Web
- 點晴移動OA解決方案
- canvas 1px畫素模糊現象解決方案Canvas
- canvas 1px 畫素模糊現象解決方案Canvas
- 設計方案--移動端延遲300ms的原因以及解決方案
- 移動端短影片SDK,企業級影片編輯解決方案
- h5移動端常見的問題及解決方案H5
- 移動端頁面滾動--解決方法
- EMAS 移動 DevOps 解決方案 —— Mobile DevOpsdev
- 解決移動端複製問題