移動(dòng)端適配1px的問題

解決移動(dòng)端1px在一些屏幕會(huì)變粗的原因
一绑警、起因
為什么移動(dòng)端css里面寫了1px, 實(shí)際看起來比1px粗. 其實(shí)原因很好理解:這2個(gè)’px’ 的含義是不一樣的. 移動(dòng)端 html 的 header 總會(huì)有一句
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
這句話定義了本頁面的 viewport 的寬度為設(shè)備寬度,初始縮放值和最大縮放值都為1,并禁止了用戶縮放. viewport 通俗的講是瀏覽器上可用來顯示頁面的區(qū)域, 這個(gè)區(qū)域是可能比屏幕大的场靴。

首先跌宛,我們了解devicePixelRatio這個(gè)東西

在window對(duì)象中有一個(gè)devicePixelRatio屬性,他可以反應(yīng)css中的像素與設(shè)備的像素比缠局。然而1px在不同的移動(dòng)設(shè)備上都等于這個(gè)移動(dòng)設(shè)備的1px拙毫,這是因?yàn)椴煌囊苿?dòng)設(shè)備有不同的像素密度。有關(guān)這個(gè)屬性迟杂,它的官方的定義為:設(shè)備物理像素和設(shè)備獨(dú)立像素的比例刽沾,也就是

devicePixelRatio = 物理像素 / 獨(dú)立像素 1px變粗的原因:
viewport的設(shè)置和屏幕物理分辨率是按比例而不是相同的. 移動(dòng)端window對(duì)象有個(gè)devicePixelRatio屬性,
它表示設(shè)備物理像素和css像素的比例, 在retina屏的iphone手機(jī)上, 這個(gè)值為2或3,
css里寫的1px長(zhǎng)度映射到物理像素上就有2px或3px那么長(zhǎng)

二、終極解決方案
1.用小數(shù)來寫px值 (不推薦)
IOS8下已經(jīng)支持帶小數(shù)的px值, media query 對(duì)應(yīng) devicePixelRatio 有個(gè)查詢值 -webkit-min-device-pixel-ratio, css可以寫成這樣
通過-webkit-min-device-pixel-ratio設(shè)置排拷。

.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 }
}

如果使用less/sass的話只是加了1句mixin
缺點(diǎn): 安卓與低版本IOS不適用, 這個(gè)或許是未來的標(biāo)準(zhǔn)寫法, 現(xiàn)在不做指望

2侧漓、flexible.js
這是淘寶移動(dòng)端采取的方案, github的地址:https://github.com/amfe/lib-flexible. 前面已經(jīng)說過1px變粗的原因就在于一刀切的設(shè)置 viewport 寬度, 如果能把 viewport 寬度設(shè)置為實(shí)際的設(shè)備物理寬度, css 里的 1px 不就等于實(shí)際 1px 長(zhǎng)了么. flexible.js 就是這樣干的.
<meta name=”viewport”>里面的 scale 值指的是對(duì) ideal viewport 的縮放, flexible.js 檢測(cè)到 IOS 機(jī)型, 會(huì)算出 scale = 1/devicePixelRatio, 然后設(shè)置viewport

metaEl = doc.createElement('meta');
metaEl.setAttribute('name', 'viewport');
metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');

devicePixelRatio=2時(shí)輸出meta如下, 這樣viewport與ideal viewport的比是0.5, 也就與設(shè)備物理像素一致

<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

3、偽類+transform實(shí)現(xiàn)
對(duì)于解決1px邊框問題监氢,我個(gè)人覺得最完美的解決辦法還是偽類+transform比較好布蔗。
原理:是把原先元素的 border 去掉藤违,然后利用 :before 或者 :after 重做 border ,并 transform 的 scale 縮小一半纵揍,原先的元素相對(duì)定位顿乒,新做的 border 絕對(duì)定位。

參考 https://blog.csdn.net/weixin_43675871/article/details/84023447

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泽谨,一起剝皮案震驚了整個(gè)濱河市璧榄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吧雹,老刑警劉巖骨杂,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異雄卷,居然都是意外死亡搓蚪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門龙亲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陕凹,“玉大人,你說我怎么就攤上這事鳄炉《虐遥” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵拂盯,是天一觀的道長(zhǎng)佑女。 經(jīng)常有香客問我,道長(zhǎng)谈竿,這世上最難降的妖魔是什么团驱? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮空凸,結(jié)果婚禮上嚎花,老公的妹妹穿的比我還像新娘。我一直安慰自己呀洲,他們只是感情好紊选,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著道逗,像睡著了一般兵罢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滓窍,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天卖词,我揣著相機(jī)與錄音,去河邊找鬼吏夯。 笑死此蜈,一個(gè)胖子當(dāng)著我的面吹牛即横,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舶替,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼令境,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了顾瞪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤抛蚁,失蹤者是張志新(化名)和其女友劉穎陈醒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞧甩,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钉跷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肚逸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爷辙。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朦促,靈堂內(nèi)的尸體忽然破棺而出膝晾,到底是詐尸還是另有隱情,我是刑警寧澤务冕,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布血当,位于F島的核電站,受9級(jí)特大地震影響禀忆,放射性物質(zhì)發(fā)生泄漏臊旭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一箩退、第九天 我趴在偏房一處隱蔽的房頂上張望离熏。 院中可真熱鬧,春花似錦戴涝、人聲如沸滋戳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肌割。三九已至啤覆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間府喳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工蘑拯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钝满,地道東北人兜粘。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弯蚜,于是被迫代替她去往敵國和親孔轴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348