CSS 動態(tài)REM

說明:動態(tài)REM是移動端專用的自適應方案群扶,需要注意的是,它并不屬于響應式布局,不支持在PC上使用該方案竞阐。

一缴饭、em和rem分別是什么


em和rem都是眾多長度單位的中的一種,MDN給出的定義分別是

em是一個相對長度單位骆莹,這個單位表示元素的font-size的計算值颗搂。如果用在font-size屬性本身,它會繼承父元素的font-size幕垦。

1em == 自己的font-size的像素值

rem代表根元素的font-size大卸狻(例如<html>元素的font-size)。當用在根元素的font-size上面時 先改,它代表了它的初始值疚察。

1rem == html的font-size的像素值

其他的長度單位還有px(像素)、vw(100vw == 視口寬度)仇奶、vh(100vh == 視口高度)等等貌嫡。

注意:

  • chrome默認font-size大小為16px
  • chrome默認最小字號為12px(可在設置中更改),這意味著即使設置font-size<12px该溯,打開控制臺查看計算出來的font-size依舊是12px

二衅枫、移動端的特點


打開開發(fā)者工具切換到手機端,我們發(fā)現所有手機顯示的界面都大同小異朗伶,不同的僅僅只是屏幕的大小(寬高)

機型 大小
iPhone 4 320 x 480
iPhone 5/SE 320 x 568
iPhone 6/7/8 375 x 667
iPhone 6/7/8 Plus 414 x 736
iPhone X 375 x 812

三步咪、移動端適配方案


方案一:媒體查詢

從上面可以看出论皆,光是iPhone這一類手機就有如此多不同的寬高,更別說要適配所有手機了猾漫,顯然這時候如果使用媒體查詢來做適配不可鹊闱纭(那得寫n多套樣式)

方案二:百分比布局

思路:不用定寬/定高,而是將寬高都設置為百分比悯周,這樣不管屏幕大小如何變化粒督,總是保持最初的比例不變

寬度自適應,高度無法確定

我們可以發(fā)現禽翼,元素寬度隨屏幕寬度變化而變化屠橄。但問題是,元素高度沒辦法與屏幕寬度相關聯(lián)闰挡,比如這里我們想讓高度為寬度的一半就無法做到锐墙,這樣就無法保持原始的比例,如果是圖片的話會發(fā)生明顯的形變长酗。

解決方法:去掉高度溪北,使用padding將元素撐起來

width: 40%; /* 屏幕寬度的40% */
height 0;
padding-bottom: 20%; /* 屏幕寬度的20% */

這樣就用百分比布局做到了實現寬高都自適應的效果

用百分比做寬高自適應

代碼:http://js.jirengu.com/peziq/3/edit?html,css,output

當然,為了引入我們的主題,這里還介紹另外一種方法動態(tài)REM之拨。

四茉继、動態(tài)rem(JS動態(tài)地調整rem)


從上面對百分比布局的分析中,我們不難發(fā)現蚀乔,只需要把元素的寬高與屏幕寬度關聯(lián)起來烁竭,就可以實現根據屏幕寬度來進行縮放。

換個思路乙墙,我們不使用百分比布局颖变,而是改為固定寬高,讓元素寬高兩者都有的長度單位和手機屏幕寬度進行關聯(lián)听想。

但是無論是px腥刹、em還是rem都與手機屏幕的寬度無關(vw與屏幕寬度有關,但這個屬性的兼容性太差汉买,這里我們不使用它)

將rem與手機屏幕寬度進行關聯(lián)

雖然除vw之外的長度單位都與屏幕寬度無關衔峰,但是1rem == html的font-size啊,這樣我們只需要讓font-size == 屏幕寬度(用JS做)蛙粘,即1rem == html的font-size == 屏幕寬度垫卤,這樣就把長度單位rem與手機屏幕寬度關聯(lián)起來了。

1 rem == html font-size == viewport width

我們用JS來實現font-size == 屏幕寬度

var pageWidth = window.innerWidth
document.write('<style>html{font-size:'+pageWidth+'px;}</style>')

效果如下:

動態(tài)rem

每次運行JS都會改變rem的值出牧,即JS動態(tài)地調整rem穴肘,這就是動態(tài)rem

五舔痕、對rem進行微調


  1. 別忘了移動端得加一個meta viewport评抚,加了之后才能正常顯示出動態(tài)rem的效果
  1. 不一定非得讓rem和屏幕寬度保持1:1

比如,上例中我們可以讓1 rem == html font-size == viewport width/10伯复,
1 rem == 0.1 width

document.write('<style>html{font-size:'+pageWidth/10+'px;}</style>')

這樣我們在寫寬高的時候就不用總是寫小數了慨代,便于我們取整數

效果不變

不過需要注意的是,不要把比例設置得太小啸如,否則會出bug侍匙。
比如你設置1 rem == 0.01width,因為在chrome中叮雳,默認最小字號為12px想暗,當屏幕寬度為375px時碉输,此時html的font-size為3.75<12取逾,字體大小變化是不會生效的,瀏覽器依然按照最小的12px來計算职辅。

  1. REM 可以與其他單位同時存在
    當計算出來的rem值特別小時就別用rem值了厌均,比如上例中唬滑,如果此時
    我要為元素添加border,通過計算1px/640 == 0.0015 == 0.015 rem,
    這樣計算出來的rem值太小時晶密,border就會顯示不精確擒悬。

    因此,當rem值太小時稻艰,可以不使用rem懂牧,rem可以與其他長度單位混用。

六尊勿、讓px自動變?yōu)閞em


每次都要計算rem值比較麻煩僧凤,我們可以通過SCSS將px直接翻譯為正確的rem值。

使用步驟如下:

  1. npm config set registry https://registry.npm.taobao.org/
  2. touch ~/.bashrc
  3. echo 'export SASS_BINARY_SITE="https://npm.taobao.org/mirrors/node-sass"' >> ~/.bashrc
  4. source ~/.bashrc
  5. npm i -g node-sass
  6. mkdir ~/Desktop/scss-demo
  7. cd ~/Desktop/scss-demo
  8. mkdir scss css
  9. touch scss/style.scss
    在scss文件中添加以下內容
$ cat scss/style.scss @function px($px) {
  @return $px/$designWidth*10 + rem;
}

$designWidth: 400px; // 400px是設計稿的寬度元扔,你要根據設計稿的寬度填寫

.child {
  width: px(160px);
  height: px(80px);
  margin: px(20px) px(20px);
  border: 1px solid red;
  float: left;
  font-size: 16px;
}
  1. node-sass -wr scss -o css
運行結果

代碼:http://js.jirengu.com/zokat/2/edit?html,css,output

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末躯保,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子澎语,更是在濱河造成了極大的恐慌途事,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擅羞,死亡現場離奇詭異尸变,居然都是意外死亡,警方通過查閱死者的電腦和手機减俏,發(fā)現死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門召烂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娃承,你說我怎么就攤上這事骑晶。” “怎么了草慧?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匙头。 經常有香客問我漫谷,道長,這世上最難降的妖魔是什么蹂析? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任舔示,我火速辦了婚禮,結果婚禮上电抚,老公的妹妹穿的比我還像新娘惕稻。我一直安慰自己,他們只是感情好蝙叛,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布俺祠。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜘渣。 梳的紋絲不亂的頭發(fā)上淌铐,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音蔫缸,去河邊找鬼腿准。 笑死,一個胖子當著我的面吹牛拾碌,可吹牛的內容都是我干的吐葱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼校翔,長吁一口氣:“原來是場噩夢啊……” “哼弟跑!你這毒婦竟也來了?” 一聲冷哼從身側響起展融,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤窖认,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后告希,有當地人在樹林里發(fā)現了一具尸體扑浸,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年燕偶,在試婚紗的時候發(fā)現自己被綠了喝噪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡指么,死狀恐怖酝惧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情伯诬,我是刑警寧澤晚唇,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站盗似,受9級特大地震影響哩陕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜赫舒,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一悍及、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧接癌,春花似錦心赶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椭符。三九已至,卻和暖如春弯汰,著一層夾襖步出監(jiān)牢的瞬間艰山,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工咏闪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曙搬,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓鸽嫂,卻偏偏與公主長得像纵装,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子据某,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353