關(guān)于移動端開發(fā) 1px 線的一些理解和解決辦法

1px線變粗的原因

在做移動端項目時捌斧,常常是根據(jù)設(shè)計圖設(shè)置元素節(jié)點的大小和樣式,但是有時候根據(jù)設(shè)計圖寫出來的樣式還是不如人意,雖然表面上看起來和設(shè)計稿是一樣的,可是就是沒設(shè)計稿那種感覺捎稚,而且莫名還有一種山寨的氣息,UI審查的時候也常常會覺得分割線或則邊框線太粗了求橄,要更細一點今野,但是一看代碼,已經(jīng)是1px了罐农,為什么看著還是那么粗呢条霜?

要知道問題的原因首先要了解一下幾個概念:

(1)物理像素(physical pixel)

一個物理像素是顯示器(手機屏幕)上最小的物理顯示單元(像素顆粒),在操作系統(tǒng)的調(diào)度下涵亏,每一個設(shè)備像素都有自己的顏色值和亮度值宰睡。 如:iPhone6上就有750*1334個物理像素顆粒。

(2)設(shè)備獨立像素(density-independent pixel)

設(shè)備獨立像素(也叫密度無關(guān)像素)气筋,可以認為是計算機坐標系統(tǒng)中得一個點夹厌,這個點代表一個可以由程序使用的虛擬像素(比如:css像素),有時我們也說成是邏輯像素裆悄。然后由相關(guān)系統(tǒng)轉(zhuǎn)換為物理像素。所以說臂聋,物理像素和設(shè)備獨立像素之間存在著一定的對應(yīng)關(guān)系光稼,這就是接下來要說的設(shè)備像素比。

(3)設(shè)備像素比(device pixel ratio )簡稱dpr

設(shè)備像素比(簡稱dpr)定義了物理像素和設(shè)備獨立像素的對應(yīng)關(guān)系孩等。它的值可以按如下的公式的得到:

設(shè)備像素比(dpr)=物理像素/邏輯像素(px) // 在某一方向上艾君,x方向或者y方向,下圖dpr=2

知道了設(shè)備像素比肄方,我們就大概知道了1px線變粗的原因冰垄。簡單來說就是手機屏幕分辨率越來越高了,同樣大小的一個手機权她,它的實際物理像素數(shù)更多了虹茶。因為不同的移動設(shè)備有不同的像素密度,所以我們所寫的1px在不同的移動設(shè)備上等于這個移動設(shè)備的1px∮缫現(xiàn)在做移動端開發(fā)時一般都要加上一句話:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

這句話定義了本頁面的viewport的寬度為設(shè)備寬度蝴罪,初始縮放值和最大縮放值都為1,并禁止了用戶縮放步清。

viewport的設(shè)置和屏幕物理分辨率是按比例而不是相同的要门,移動端window對象有個devicePixelRatio屬性虏肾,它表示設(shè)備物理像素和css像素的比例,在retina屏的iphone手機上欢搜,這個值為2或3, css里寫的1px長度映射到物理像素上就有2px或3px封豪。通過設(shè)置viewport,可以改變css中的1px用多少物理像素來渲染炒瘟,設(shè)置了不同的viewport吹埠,當然1px的線條看起來粗細不一致。

1px線變粗的解決方法

偽類 + scale

這種方法的原理就是把原來元素的border去掉藻雌,然后用 :before 或者 :after 重做 border ,原先的元素相對定位做个,新做的 border 絕對,定位使用 transform 的 scale 把線條高度縮小一半,新邊框就相當于0.5px了省骂。代碼如下:

.scale{
  position: relative;
  border:none;
}

.scale:after{
  content: '';
  position: absolute;
  bottom: 0;
  background: #000;
  width: 100%;
  height: 1px;
  -webkit-transform: scaleY(0.5);
  transform: scaleY(0.5);
  -webkit-transform-origin: 0 0;
  transform-origin: 0 0;
}

使用flexible.js

前面已經(jīng)說過1px變粗的原因就在于一刀切的設(shè)置viewport寬度涨缚,如果能把viewport寬度設(shè)置為實際的設(shè)備物理寬度脓魏,css里的1px不就等于實際1px長了么。 flexible.js的原理就是這樣拄丰,先獲取設(shè)備縮放比devicePixelRatio奄侠,然后根據(jù)縮放比來動態(tài)設(shè)定viewport的值闷盔,這樣導(dǎo)致的結(jié)果就是無論是哪個設(shè)備牡整,1px所表示的永遠是1個設(shè)備像素迫摔,即該設(shè)備的最小像素沪摄。

//devicePixelRatio=2時凹炸,輸出meta如下
<meta name=="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

//devicePixelRatio=3時变骡,輸出meta如下
<meta name="viewport" content="initial-scale=0.3333333333333333, maximum-scale=0.3333333333333333, minimum-scale=0.3333333333333333, user-scalable=no">

使用meta viewport控制

原理如上塌碌。代碼如下

//1px像素線條
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=0">

//0.5像素線條
<meta name="viewport" content="width=device-width,initial-scale=0.5,user-scalable=0">

使用box-shadow模擬邊框

利用css 對陰影處理的方式實現(xiàn)0.5px的效果。代碼如下:

.box-shadow-1px {
  box-shadow: inset 0px -1px 1px-1px #c8c7cc;
}

使用border-image

首先需要自己制作一個0.5像素的線條作為線條背景圖片旬盯。台妆。代碼如下:

p{
    border-width: 0 0 1px 0;
    border-image: imageUrl  2 0 round;
}

利用背景漸變linear-gradient

利用linear-gradient利用背景圖片漸變翎猛,從有色到透明,默認方向從上到下接剩,從0deg到50%的地方顏色是邊框顏色切厘,然后下邊一半顏色就是透明了。然后設(shè)置背景寬度100%懊缺,高度是1px疫稿,再去掉repeat,所以有顏色的就是0.5px的邊框鹃两。代碼如下:

.bg_border {
    background-image: linear-gradient(0deg, black  50%,transparent  50%);
    background-size: 100% 1px ;
    background-repeat:  no -repeat;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遗座,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俊扳,更是在濱河造成了極大的恐慌途蒋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拣度,死亡現(xiàn)場離奇詭異碎绎,居然都是意外死亡,警方通過查閱死者的電腦和手機抗果,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門筋帖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冤馏,你說我怎么就攤上這事感挥。” “怎么了背率?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵栖秕,是天一觀的道長。 經(jīng)常有香客問我涕刚,道長嗡综,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任杜漠,我火速辦了婚禮极景,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驾茴。我一直安慰自己盼樟,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布锈至。 她就那樣靜靜地躺著晨缴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峡捡。 梳的紋絲不亂的頭發(fā)上击碗,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天筑悴,我揣著相機與錄音,去河邊找鬼延都。 笑死雷猪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的晰房。 我是一名探鬼主播求摇,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼殊者!你這毒婦竟也來了与境?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猖吴,失蹤者是張志新(化名)和其女友劉穎摔刁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體海蔽,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡共屈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了党窜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拗引。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幌衣,靈堂內(nèi)的尸體忽然破棺而出矾削,到底是詐尸還是另有隱情,我是刑警寧澤豁护,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布哼凯,位于F島的核電站,受9級特大地震影響楚里,放射性物質(zhì)發(fā)生泄漏断部。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一班缎、第九天 我趴在偏房一處隱蔽的房頂上張望蝴光。 院中可真熱鬧,春花似錦吝梅、人聲如沸虱疏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至对粪,卻和暖如春右冻,著一層夾襖步出監(jiān)牢的瞬間装蓬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工纱扭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牍帚,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓乳蛾,卻偏偏與公主長得像暗赶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肃叶,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容