解決移動端 1px 問題-5種方法

本片文章主要解決了五種解決1px 的問題临庇,上代碼之前我們先了解一下 什么是:物理像素零截、設(shè)備獨(dú)立像素狠持、設(shè)備相續(xù)比 和 viewport!

物理像素瞻润、設(shè)備像素喘垂、和設(shè)備獨(dú)立像素

在css中我們一般使用px作為單位,需要注意的是绍撞,css樣式里面的px和物理像素并不是想等的正勒,css中的像素只是一個抽象的單位,在不痛的設(shè)備或不同的環(huán)境中傻铣,css中的1px所代表的物理像素是不痛的章贞,在pc端,css的1px一般的對應(yīng)著電腦屏幕的1個物理像素非洲,但在移動端鸭限,css的1px等于幾個物理像素。

物理像素

物理像素又稱為設(shè)備像素两踏,設(shè)備物理像素败京,它是顯示器最小的物理顯示單位,每個物理像素由顏色值和亮度值組成梦染,所謂的一倍屏赡麦,二倍屏,三倍屏帕识,指的是設(shè)備以多少物理像素來顯示一個css像素泛粹,也就是說,多倍屏以更多精細(xì)的物理像素點(diǎn)來顯示一個css像素點(diǎn)肮疗,在普通屏幕下1個css像素對應(yīng)1個物理像素晶姊,而在Retina屏幕下,1個css像素對應(yīng)的卻是4個物理像素

設(shè)備獨(dú)立像素(device-independent pixel)

設(shè)備獨(dú)立像素又被稱為CSS像素伪货,是我們寫CSS時(shí)所用的像素们衙,它是一個抽像的單位,主要使用在瀏覽器上超歌,用來精確度量Web頁面上的內(nèi)容砍艾。

設(shè)備像素比(device pixel ratio)

設(shè)備像素比簡稱為dpr,定義了物理像素和設(shè)備獨(dú)立像素的對應(yīng)關(guān)系:設(shè)備像素比 = 物理像素 / 設(shè)備獨(dú)立像素巍举。

CSS的1px等于幾個物理像素脆荷,除了和屏幕像素密度dpr有關(guān),還和用戶縮放有關(guān)系。例如蜓谋,當(dāng)用戶把頁面放大一倍梦皮,那么CSS中1px所代表的物理像素也會增加一倍;反之把頁面縮小一倍桃焕,CSS中1px所代表的物理像素也會減少一倍剑肯。關(guān)于這點(diǎn),在文章后面的1px細(xì)線問題部分還會講到

1px細(xì)線問題

在上文我們已經(jīng)知道观堂,CSS像素為1px寬的直線让网,對應(yīng)的物理像素是不同的,可能是2px或者3px,而設(shè)計(jì)師想要的1px寬的直線,其實(shí)就是1物理像素寬师痕。

對于CSS而言溃睹,可以認(rèn)為是border: 0.5px;,這是多倍屏下能顯示的最小單位胰坟。然而因篇,并不是所有手機(jī)瀏覽器都能識別border: 0.5px,有的系統(tǒng)里笔横,0.5px會被當(dāng)成為0px處理竞滓,那么如何1px細(xì)線問題呢?
1.使用border-image實(shí)現(xiàn)
根據(jù)需求選擇圖片吹缔,然后根據(jù)css的border-image屬性設(shè)置商佑。代碼如下:

div
{
    -moz-border-image:url(/i/border.png) 30 30 stretch; /* Old Firefox */
    -webkit-border-image:url(border.png) 30 30 stretch; /* Safari 5 */
    -o-border-image:url(border.png) 30 30 stretch; /* Opera */
    border-image:url(border.png) 30 30 stretch;
}

優(yōu)點(diǎn):可以設(shè)置單條、多條邊框涛菠,缺點(diǎn):更換顏色和樣式麻煩莉御,某些設(shè)備上會模糊。
2俗冻、使用background-image實(shí)現(xiàn)
background-image 跟border-image的方法一樣,你要先準(zhǔn)備一張符合你要求的圖片牍颈。優(yōu)缺點(diǎn)與border-image一樣迄薄。

    .background-image-1px {
    background: url(../img/line.png) repeat-x left bottom;
    -webkit-background-size: 100% 1px; background-size: 100% 1px;
}

3、使用box-shadow模擬邊框

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

優(yōu)點(diǎn):代碼少煮岁,兼容性好讥蔽,缺點(diǎn):邊框有陰影,顏色變淺画机。

上面三種方式效果并不是太好

4冶伞、偽元素+transform
構(gòu)建1個偽元素, border為1px, 再以transform縮放到50%。

/* 設(shè)計(jì)稿是750,采用1:100的比例,font-size為100*(100vw/750) */
.border-1px {
    position: relative;
}
@media screen and (-webkit-min-device-pixel-ratio: 2) {
    .border-1px:before {
        content: " ";
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 1px;
        border-top: 1px solid #D9D9D9;
        color: #D9D9D9;
        -webkit-transform-origin: 0 0;
        transform-origin: 0 0;
        -webkit-transform: scaleY(0.5);
        transform: scaleY(0.5);
    }
}

優(yōu)點(diǎn):可以滿足所有場景步氏,且修改靈活响禽,缺點(diǎn):對于已使用偽類的元素要多層嵌套。
5、用JS計(jì)算rem基準(zhǔn)值和viewport縮放值

/* 設(shè)計(jì)稿是750,采用1:100的比例,font-size為100 * (docEl.clientWidth * dpr / 750) */
var dpr, rem, scale;
var docEl = document.documentElement;
var fontEl = document.createElement('style');
var metaEl = document.querySelector('meta[name="viewport"]');
dpr = window.devicePixelRatio || 1;
rem = 100 * (docEl.clientWidth * dpr / 750);
scale = 1 / dpr;
// 設(shè)置viewport芋类,進(jìn)行縮放隆嗅,達(dá)到高清效果
metaEl.setAttribute('content', 'width=' + dpr * docEl.clientWidth + ',initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale + ',user-scalable=no');
// 設(shè)置data-dpr屬性,留作的css hack之用侯繁,解決圖片模糊問題和1px細(xì)線問題
docEl.setAttribute('data-dpr', dpr);
// 動態(tài)寫入樣式
docEl.firstElementChild.appendChild(fontEl);
fontEl.innerHTML = 'html{font-size:' + rem + 'px!important;}';

用JS根據(jù)屏幕尺寸和dpr精確地設(shè)置不同屏幕所應(yīng)有的rem基準(zhǔn)值和initial-scale縮放值胖喳,這個JS方案已經(jīng)在完美解決了1px細(xì)線問題

參考鏈接: https://www.cnblogs.com/superlizhao/p/8729190.html

https://blog.csdn.net/yexudengzhidao/article/details/98480173

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贮竟,隨后出現(xiàn)的幾起案子丽焊,更是在濱河造成了極大的恐慌,老刑警劉巖咕别,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技健,死亡現(xiàn)場離奇詭異,居然都是意外死亡顷级,警方通過查閱死者的電腦和手機(jī)凫乖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弓颈,“玉大人帽芽,你說我怎么就攤上這事∠杓剑” “怎么了导街?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纤子。 經(jīng)常有香客問我搬瑰,道長,這世上最難降的妖魔是什么控硼? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任泽论,我火速辦了婚禮,結(jié)果婚禮上卡乾,老公的妹妹穿的比我還像新娘翼悴。我一直安慰自己,他們只是感情好幔妨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布鹦赎。 她就那樣靜靜地躺著,像睡著了一般误堡。 火紅的嫁衣襯著肌膚如雪古话。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天锁施,我揣著相機(jī)與錄音陪踩,去河邊找鬼杖们。 笑死,一個胖子當(dāng)著我的面吹牛膊毁,可吹牛的內(nèi)容都是我干的胀莹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼婚温,長吁一口氣:“原來是場噩夢啊……” “哼描焰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栅螟,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤荆秦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后力图,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體步绸,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年吃媒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓤介。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赘那,死狀恐怖刑桑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情募舟,我是刑警寧澤祠斧,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站拱礁,受9級特大地震影響琢锋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呢灶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一吴超、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸯乃,春花似錦烛芬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仆潮。三九已至宏蛉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間性置,已是汗流浹背拾并。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗅义。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓屏歹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親之碗。 傳聞我的和親對象是個殘疾皇子蝙眶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

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