px黔酥、em和rem實戰(zhàn)經(jīng)驗

前言

在自適應(yīng)布局或者移動端網(wǎng)頁開發(fā)時藻三,我們經(jīng)常會用到em和rem兩個長度單位。接下來我們討論一下這兩個單位和px之間的區(qū)別跪者,以及他們的使用場景等棵帽。

區(qū)別

px

px,像素(計算機屏幕上的一個點)渣玲。(引自w3school-css單位

像素(Pixels)逗概,相對長度單位,它是相對于顯示器屏幕分辨率而言的忘衍,它兼容性好而且精確逾苫,但是這種方法當(dāng)用戶在縮放瀏覽器或者需要兼容不同移動設(shè)備時,我們的頁面布局可能會被打破枚钓。?

em

em為了解決上述問題而進化產(chǎn)生铅搓,也是相對長度單位,根據(jù)使用它的元素的大小決定(有人誤以為是根據(jù)父元素搀捷,那是因為使用它的元素繼承了父類的屬性星掰,根據(jù)W3C標(biāo)準(zhǔn)可知 ,它們是基于當(dāng)前對象元素的字體大心壑邸)氢烘,它可以自動適應(yīng)用戶所使用的字體。

em至壤,相對長度單位威始。相對于當(dāng)前對象內(nèi)文本的字體尺寸。
如當(dāng)前對行內(nèi)文本的字體尺寸未被人為設(shè)置像街,則相對于瀏覽器的默認(rèn)字體尺寸。(引自em-CSS3參考手冊

關(guān)于em值的計算

假設(shè)任意瀏覽器的默認(rèn)字體大小都是16px晋渺。所有未經(jīng)調(diào)整的瀏覽器中都是1em=16px镰绎。為了方便換算,我們通常在css中設(shè)置body的屬性 font-size:62.5%木西,這就使1em值變?yōu)?0px,這樣我們就可以把設(shè)計稿的px值除以10畴栖,然后換上em作為單位來進行px和em的換算,十分簡單八千,例如16px可以改寫為1.6em吗讶。

rem

由于em值不是固定的燎猛,1em在不同元素下的值會因為該元素或者該元素父元素的大小不同而不同,因此在我們多次使用時照皆,就會帶來開發(fā)的難度重绷。這時候rem(root em)應(yīng)運而生了。rem是相對于根(html)元素膜毁,這就意味著昭卓,我們只需要根據(jù)自己的需要給根元素確定一個參考值,然后通過它既可以做到只修改根元素就成比例地調(diào)整所有字體大小瘟滨,又可以避免字體大小逐層復(fù)合的連鎖反應(yīng)候醒。最大的優(yōu)點是提供一致尺寸,便于計算杂瘸。

rem倒淫,相對長度單位。相對于根元素(即html元素)font-size計算值的倍數(shù)昌简。(引自rem-CSS3參考手冊

根元素重寫

em 和 rem 單位之間的區(qū)別是瀏覽器根據(jù)誰來轉(zhuǎn)化成px值,em是基于當(dāng)前對象內(nèi)文本的字體尺寸決定犬金,rem是基于html元素的字體大小來決定,而根(html)元素的字體大小如果沒有顯式地設(shè)置固定值去覆蓋,那么它首先來自瀏覽器設(shè)置栓袖,因此瀏覽器的字體大小設(shè)置可以影響每個使用rem單元以及每個通過em單位繼承的值裹刮。為了還原設(shè)計稿和實現(xiàn)合理的布局所以需要根元素重寫捧弃。瀏覽器縮放動態(tài)修改根元素大小可以參考以下代碼段嘴办。

<script>
    var timer, style = document.head.appendChild(document.createElement("style"));
    var useREM = window.useREM = Object.create({
      resize: function () {
        var config=this.config;
        this.size=Math.max(config.min, Math.min(config.max, document.documentElement.clientWidth)) / config.num;
        style.innerHTML="html{font-size: "+ this.size +"px !important;}"
        return this;
      },
      set: function (newConfig) {
        if(newConfig){
          for (var a in newConfig){
            if(this.config.hasOwnProperty(a)){
              this.config[a]=newConfig[a];
            }
          }
        }
        this.resize();
        return this;
      }
    }, {
      size: {
        value: 20,
        writable: true,
        configurable: false,
        enumerable: true
      },
      config: {
        value:{
          max: 1200,//設(shè)置最大可視區(qū)寬
          min: 900,//設(shè)置最小可視區(qū)寬
          num: 10,//根據(jù)需求調(diào)整比例
          delay: 100
        },
        writable: false,
        configurable: false,
        enumerable: true
      }
    });

    addEventListener("resize", function () {
      clearTimeout(timer);
      timer = setTimeout(this.resize.bind(this), this.config.delay);
    }.bind(useREM));

    useREM.set();
    </script>

同時底燎,也有人認(rèn)為這種做法在一定程度上剝奪了用戶對瀏覽器字體設(shè)置的權(quán)利,他們的觀點是rem的好處是給了我們的一個途經(jīng)去獲取用戶的偏好來影響網(wǎng)站中每一處使用rem的元素大小朱沃,無論用戶如何設(shè)置自己的瀏覽器逗物,我們的布局都能調(diào)整到合適大小。這個就暫不做討論吧失暴,日后有機會再講逗扒。

使用場景

  • 如果這個屬性根據(jù)它的font-size進行測量,則使用em欠橘,其他的使用rem
  • 媒體查詢中使用 rem 單位
  • 不要在多列布局中使用 em 或 rem -改用 %

關(guān)于em和rem在完成模塊化組件中的應(yīng)用實例矩肩,你可以參考這篇文章

兼容

  • 所有瀏覽器都支持px肃续,除了IE8及以下版本黍檩,其它的瀏覽器都支持em和rem屬性。對于不支持它的瀏覽器痹升,就多寫一個絕對單位的聲明建炫。
  • IE9/IE10在用于偽元素時或者使用字體簡寫聲明時不支持rem
  • IOS Safari5.0-5.1雖然支持rem,但是在使用媒體查詢時不支持rem

工具

在這里為大家提供一個px疼蛾,em,rem單位轉(zhuǎn)換工具艺配。地址:http://pxtoem.com/

討論區(qū)

  • csdn移動端和pc端兩套代碼察郁,兩種字號大小聲明衍慎,pc端用了px,沒有根據(jù)瀏覽器縮放自適應(yīng)皮钠,移動端用了rem稳捆,根據(jù)屏幕寬度重寫了根元素,實現(xiàn)了自適應(yīng)麦轰。
  • 掘金主頁用了rem乔夯,在mac的chrome中根元素固定12px,但是文字大小有根據(jù)瀏覽器縮放實現(xiàn)自適應(yīng)款侵。
  • 你們團隊是怎么做的末荐?
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市新锈,隨后出現(xiàn)的幾起案子甲脏,更是在濱河造成了極大的恐慌,老刑警劉巖妹笆,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件块请,死亡現(xiàn)場離奇詭異,居然都是意外死亡拳缠,警方通過查閱死者的電腦和手機墩新,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窟坐,“玉大人海渊,你說我怎么就攤上這事±暧浚” “怎么了切省?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帕胆。 經(jīng)常有香客問我朝捆,道長,這世上最難降的妖魔是什么懒豹? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任芙盘,我火速辦了婚禮,結(jié)果婚禮上脸秽,老公的妹妹穿的比我還像新娘儒老。我一直安慰自己,他們只是感情好记餐,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布驮樊。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪囚衔。 梳的紋絲不亂的頭發(fā)上挖腰,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音练湿,去河邊找鬼猴仑。 笑死,一個胖子當(dāng)著我的面吹牛肥哎,可吹牛的內(nèi)容都是我干的辽俗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼篡诽,長吁一口氣:“原來是場噩夢啊……” “哼崖飘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起霞捡,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤坐漏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碧信,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赊琳,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年砰碴,在試婚紗的時候發(fā)現(xiàn)自己被綠了躏筏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呈枉,死狀恐怖趁尼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猖辫,我是刑警寧澤酥泞,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站啃憎,受9級特大地震影響芝囤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辛萍,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一悯姊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贩毕,春花似錦悯许、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘩扼。三九已至,卻和暖如春启上,著一層夾襖步出監(jiān)牢的瞬間邢隧,已是汗流浹背店印。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工冈在, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人按摘。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓包券,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炫贤。 傳聞我的和親對象是個殘疾皇子溅固,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,751評論 1 92
  • 作者:HelKyle鏈接:http://www.w3cplus.com/css/when-to-use-em-vs...
    紅葉丶秋鳴閱讀 3,231評論 0 3
  • ·##概念介紹:1.px(pixel亮元,像素):是一個虛擬長度單位,是計算機系統(tǒng)的數(shù)字化長度單位唠摹,如果px要換算成物...
    小時候很帥的龍少閱讀 2,120評論 0 6
  • 概念介紹 px (pixel勾拉,像素):是一個虛擬長度單位煮甥,是計算機系統(tǒng)的數(shù)字化圖像長度單位,如果px要換算成物理長...
    柯琦閱讀 1,993評論 0 7
  • 國內(nèi)的設(shè)計師大都喜歡用px藕赞,而國外的網(wǎng)站大都喜歡用em和rem成肘,那么三者有什么區(qū)別,又各自有什么優(yōu)劣呢斧蜕?PX特點1...
    xixihaha520閱讀 536評論 0 0