動(dòng)態(tài)REM方案&&border 1px問題

動(dòng)態(tài)REM

  • 我們都知道移動(dòng)端頁面在做適配時(shí)罚缕,媒體查詢響應(yīng)式是一種方法,但是鑒于需要寫多套的CSS怎静,考慮多種設(shè)備寬度邮弹,非常麻煩。

除了使用媒體查詢響應(yīng)式之外蚓聘,還有另一種更好用的方案就是動(dòng)態(tài)rem腌乡。

  • 首先我們假設(shè)設(shè)計(jì)稿的基本頁面寬度為320px,1個(gè)rem指的是1個(gè)頁面寬度夜牡,

獲取當(dāng)前設(shè)備視口的寬度和與設(shè)計(jì)稿基準(zhǔn)寬度的比率scale:

var width=document.documentElement.clientWidth;//獲取當(dāng)前視口的寬度

var scale= width/320;  //基本尺寸是320px

然后我們使用JS寫入CSS与纽,

 var css=`
    html {
        font-size: ${320*scale/10}px;
    }
    `
    document.write(`<style>${css}</style>`)

rem這個(gè)單位代表頁面的寬度,在原來的CSS中塘装,我們使用的單位都是px急迂,注意這個(gè)CSS是以設(shè)計(jì)稿寬度為320px這個(gè)標(biāo)準(zhǔn)下寫的。

<style>
    body {
  background: white;
  margin: 0;
}
#section1 {
  text-align: center;
}

#section1 img {
    width: 74px;
    margin-top: 60px;
    border-radius: 50%;
    margin-bottom: 34px;
}

#section1 .tags {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    padding: 0 16px;
  }

#section1 span {
    background-color: #D8D8D8;
    width: 128px;
    line-height: 24px;
    height:24px;
    margin: 0 0 24px;
  }

#section2 {
  background: #EFEFEF;
  text-align: center;
  padding: 50px 0 30px; 
}

#section2 h2 {
    background: #D8D8D8;
    display: inline-block;
    width: 200px;
    margin: 0 0 20px;
    border-radius: 14px;
    line-height: 40px;
  }

  #section2 p {
    background-color: #d8d8d8;
    width: 250px;
    display: inline-block;
    margin: 0 0 20px;
    line-height: 24px;
    height: 24px;
    border-radius: 14px;
  }
  </style>

那么結(jié)合320px和CSS中每一個(gè)px值的比率蹦肴,本來:

html {
        font-size: ${320*scale/10}px;
    }

這個(gè)CSS片段中僚碎,320*scale表示的就是實(shí)際的設(shè)備頁面寬度,我們可以理解為10rem==320*scale阴幌,也就是說10個(gè)rem代表一個(gè)頁面

寬度勺阐,他是一個(gè)動(dòng)態(tài)的值,可以理解為一個(gè)比例∶現(xiàn)在渊抽,以height: 24px為例,它基準(zhǔn)設(shè)備寬度為320px议忽,也就是說可以轉(zhuǎn)化為

height: (24/320)*10 rem懒闷,也就是說height: 0.75rem.

思路簡化如下:

1. 瀏覽器禁止980px像素縮放

2. 設(shè)置html{font-size: 頁面寬度/10 px}

3. 10rem == 頁面寬度

4. 所有單位都使用rem,這樣長度以頁面寬度為基準(zhǔn)

5. 頁面可兼容任何手機(jī)屏幕

寫到這里,我們貼出代碼及頁面效果:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
<meta name="viewport" content="width=device-width, user-scalable=no, maximum-scale=1.0, minimum-scale=1.0, initial-scale=1.0"> 
 <script>
    var width=document.documentElement.clientWidth;//獲取當(dāng)前視口的寬度
    console.log(width)
    
    var scale= width/320;  //基本尺寸是320px
    console.log(scale)

    var css=`
    html {
        font-size: ${320*scale/10}px;
    }
    `
    document.write(`<style>${css}</style>`)
    
  </script>
 
  <title>JS Bin</title>
</head>
<body>
  <section id="section1">
    <img src="http://via.placeholder.com/100x100" alt="">
    <div class="tags">
      <span>標(biāo)簽1</span>
      <span>標(biāo)簽2</span>
      <span>標(biāo)簽3</span>
      <span>標(biāo)簽4</span>
    </div>
  </section>
  <section id="section2">
    <h2>文字文字1</h2>
    <h2>文字文字2</h2>
    <p>文字文字文字文字文字1</p>
    <p>文字文字文字文字文字2</p>
  </section>
  <style>
    body {
  background: white;
  margin: 0;
  font-size: .5rem;
}
#section1 {
  text-align: center;
}

#section1 img {
    width: 2.3125rem;
    margin-top: 1.875rem;
    border-radius: 50%;
    margin-bottom: 1.0625rem;
}

#section1 .tags {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    padding: 0 .5rem;
  }

#section1 span {
    background-color: #D8D8D8;
    width: 4rem;
    line-height: 0.75rem;
    height: 0.75rem;
    margin: 0 0 0.75rem;
  }

#section2 {
  background: #EFEFEF;
  text-align: center;
  padding: 1.5625rem 0 0.9375rem; 
}

#section2 h2 {
    background: #D8D8D8;
    display: inline-block;
    width: 6.25rem;
    margin: 0 0 0.625rem;
    border-radius: 0.4375rem;
    line-height: 1.25rem;
  }

  #section2 p {
    background-color: #d8d8d8;
    width: 7.8125rem;
    display: inline-block;
    margin: 0 0 0.625rem;
    line-height: 0.75rem;
    height: 0.75rem;
    border-radius: 0.4375rem;
  }
  </style>
</body>
</html>

頁面效果:

頁面效果.jpg

你可以自己在本地嘗試毛雇,這樣可適配任意手機(jī)尺寸嫉称。

border 1px問題

  • 接下來我們來聊一聊手機(jī)屏幕中的1px邊框問題。我們知道灵疮,在普通屏幕中织阅,CSS中的1px就是代表設(shè)備中的1px,但是在Retina屏幕下震捣,CSS的

1px它指設(shè)備中的2px荔棉,iphone就是使用的Retina屏幕,這樣的屏幕顯示效果會(huì)更好當(dāng)然會(huì)比較耗電蒿赢。在實(shí)際的開發(fā)過程中判帮,由于設(shè)計(jì)師的處女情

結(jié),他們會(huì)要求即使在retina屏幕下浇雹,1px也必須代表設(shè)備中的1px(前端默默地豎起中指稿蹲,女設(shè)計(jì)師除外)

  • 我們想到的解決方法是讓border-width: 0.5px,這樣就能讓在retina屏幕下也代表只有1px的設(shè)備像素,但是這樣是有兼容性問題的皂冰,根本就

不推薦使用店展。正確的方法是:

  1. 頁面整體縮放50%,即meta里面設(shè)置50%秃流, 然后再將rem設(shè)置成原來的2倍赂蕴。

具體的思路如下:

1. 獲取設(shè)備像素比(1/2/3)

2. initial-scale = 1/像素比

3. 讓rem變?yōu)閞em*像素比

4. 最后border: 1px solid red

這里我將代碼貼出來:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script>
    var scale = 1 / window.devicePixelRatio // 1\2\3
    document.write(`
      <meta name="viewport"
        content="initial-scale=${scale}, maximum-scale=${scale}, minimum-scale=${scale}, user-scalable=no"> 
      `)
  </script>
  <script>
    var width = document.documentElement.clientWidth / window.devicePixelRatio
    var css = `
    html{
      font-size: ${width / 10 * window.devicePixelRatio}px;
    }
    `
    document.write(`<style>${css}</style>`)
  </script>
  
  <title>JS Bin</title>
  
</head>
<body>
  <section id="section1">
    <img src="http://placehold.it/100x100" alt="">
    <div class="tags">
      <span>標(biāo)簽1</span>
      <span>標(biāo)簽2</span>
      <span>標(biāo)簽3</span>
      <span>標(biāo)簽4</span>
    </div>
    
  </section>
  <section id="section2">
    <h2>文字文字文字</h2>
    <h2>文字文字文字</h2>
    <p>文字文字文字文字文字文字</p>
    <p>文字文字文字文字文字文字</p>
  </section>
  <style> body {
    background: white;
    margin: 0;
    font-size: 0.5rem;
  }
  #section1 {
    text-align: center;
    border-bottom: 1px solid red;
  }
  #section1 img {
    width: 2.3125rem;
    margin-top: 1.875rem;
    border-radius: 50%;
    margin-bottom: 1.0625rem;
  }
  #section1 .tags {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    padding: 0 0.5rem;
  }
  #section1 span {
    background: #D8D8D8;
    width: 4rem;
    line-height: 0.75rem;
    height: 0.75rem;
    margin: 0 0 0.75rem;
  }
  #section2 {
    background: #EFEFEF;
    text-align: center;
    padding: 1.5625rem 0 .9375rem;
  }
  #section2 h2 {
    background: #d8d8d8;
    display: inline-block;
    width: 6.25rem;
    margin: 0 0 .625rem;
    border-radius: .4375rem;
    line-height: 1.25rem;
    height: 1.25rem;
  }
  #section2 p {
    background: #E8E8E8;
    width: 7.8125rem;
    display: inline-block;
    margin: 0 0 .625rem;
    line-height: .75rem;
    height: .75rem;
    border-radius: .4375rem;
  }
  </style>
</body>
</html>


頁面效果同上。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舶胀,一起剝皮案震驚了整個(gè)濱河市概说,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嚣伐,老刑警劉巖糖赔,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纤控,居然都是意外死亡挂捻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門船万,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刻撒,“玉大人,你說我怎么就攤上這事耿导∩” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵舱呻,是天一觀的道長醋火。 經(jīng)常有香客問我悠汽,道長,這世上最難降的妖魔是什么芥驳? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任柿冲,我火速辦了婚禮,結(jié)果婚禮上兆旬,老公的妹妹穿的比我還像新娘假抄。我一直安慰自己,他們只是感情好丽猬,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布宿饱。 她就那樣靜靜地躺著,像睡著了一般脚祟。 火紅的嫁衣襯著肌膚如雪谬以。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天由桌,我揣著相機(jī)與錄音为黎,去河邊找鬼。 笑死沥寥,一個(gè)胖子當(dāng)著我的面吹牛碍舍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邑雅,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼妈经!你這毒婦竟也來了淮野?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤吹泡,失蹤者是張志新(化名)和其女友劉穎骤星,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爆哑,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洞难,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揭朝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片队贱。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖潭袱,靈堂內(nèi)的尸體忽然破棺而出柱嫌,到底是詐尸還是另有隱情,我是刑警寧澤屯换,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布编丘,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嘉抓。R本人自食惡果不足惜索守,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抑片。 院中可真熱鬧蕾盯,春花似錦、人聲如沸蓝丙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渺尘。三九已至挫鸽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸥跟,已是汗流浹背丢郊。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留医咨,地道東北人枫匾。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像拟淮,于是被迫代替她去往敵國和親干茉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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

  • 原文地址 在移動(dòng)設(shè)備上進(jìn)行網(wǎng)頁的重構(gòu)或開發(fā)很泊,首先得搞明白的就是移動(dòng)設(shè)備上的viewport了角虫,只有明白了viewp...
    matthewm閱讀 1,555評(píng)論 0 4
  • 移動(dòng)前端開發(fā)之viewport的深入理解 一、viewport的概念 通俗的講委造,移動(dòng)設(shè)備上的viewport就是設(shè)...
    明明三省閱讀 15,539評(píng)論 1 46
  • 問題的由來 手機(jī)屏幕的分辨率差異很大戳鹅。 iphone4:320×480 iphone6:375×667 H5 網(wǎng)頁...
    尚山夏香閱讀 2,434評(píng)論 0 1
  • 移動(dòng)前端開發(fā)之viewport的深入理解 在移動(dòng)設(shè)備上進(jìn)行網(wǎng)頁的重構(gòu)或開發(fā),首先得搞明白的就是移動(dòng)設(shè)備上的view...
    _雙眸閱讀 8,947評(píng)論 1 12
  • 頁面布局 靜態(tài)布局(Static Layout)使用CSS邏輯像素單位px進(jìn)行定寬布局昏兆,是PC端最常見形式枫虏。 流式...
    JunChow520閱讀 1,429評(píng)論 0 6