CSS中強大的EM
這篇教程將引導大家如何使用“em”來建立一個基本的彈性佈局,從而學習其如何計算?又是如何使用“em”對層進行彈性擴充套件?又是如何擴充套件文字和影象等內容?下在我們就一起帶著這些問題開始今天的“em”之行。
什麼是彈性佈局?
使用者的文字大小與彈性佈局
使用者的瀏覽器預設渲染的文字大小是“16px”,換句話說,Web頁面中“body”的文字大小在使用者瀏覽器下預設渲染是“16px”。當然,如果使用者願意他可以改變這種字型大小的設定,使用者可以通過UI控制元件來改變瀏覽器預設的字型大小。
彈性設計有一個關鍵地方Web頁面中所有元素都使用“em”單位值。“em”是一個相對的大小,我們可以這樣來設定1em,0.5em,1.5em等,而且“em”還可以指定到小數點後三位,比如“1.365em”。而其中“相對”的意思是:
1.相對的計算必然會一個參考物,那麼這裡相對所指的是相對於元素父元素的font-size。比如說:如果在一個<div>設定字型大小為“16px”,此時這個<div>的後代元素教程了是將繼承他的字型大小,除非重新在其後代元素中進行過顯示的設定。此時,如果你將其子元素的字型大小設定為“0.75em”,那麼其字型大小計算出來後就相當於“0.75 X 16px = 12px”;
2.如果使用者通過瀏覽器的UI控制元件改變了文字的大小,那麼我們整個頁面也會進行放大(或縮小),不至於使用者改變了瀏覽器的字型後會致使整個頁面崩潰(我想這種現像大家都有碰到過,不信你就試試你自己製作過的專案,你會覺得很恐怖)。
大家可以檢視這個彈性佈局樣例。此時你使用瀏覽器的UI控制元件改變了文字的大小或者直接“ctrl + ”和“ctrl - ”,你會發現這個彈性佈局例項,在瀏覽器改變字型大小瀏覽會做出相應的放大和縮小,並不會影響整個頁面的佈局。注:這個例項的所有HTML和CSS在本教程中教程了都會使用到。
至於其他的彈性佈局的例項,大家可以瀏覽Dan Cederholm的Simplebites,並改變文字的大小去瀏覽。
體驗後,是不是覺得彈性佈局的頁面很靈活呀,而且也像“px”一樣的精確。因此,只要我們掌握了“font-size”、“px”和“em”之間的基本關係,我們就可以民以食快速使用CSS建立精確的佈局。
CSS的Elastigirl引進EM
Elastigirl的“em”是極其強大和靈活的,他不管字型大小是什麼,是12px,16或60,他都可以計算出其值。
em其實就是一種排版的測試單位,而且他的由來還有一段小故事,關於這段小故事我就不和大家說了,因為大家都不是來聽我講故事的,我想大還是喜歡知道他在CSS中的那些事。
在CSS中,“em”實際上是一個垂直測量。一個em等於任何字型中的字母所需要的垂直空間,而和它所佔據的水平空間沒有任何的關係,因此:
如果字型大小是16px,那麼1em=16px。
入門
在我們開始來了解CSS中的這個“em”之前,我們需要知道在瀏覽器下,他的預設字型大小。正好我們前面也這樣做了,在所有現代瀏覽器中,其預設的字型大小就是“16px”。因此在瀏覽器下預設的設定將是:
1em = 16px
因此,在一個CSS選擇器被寫入時,瀏覽器就有了一個“16px”大小的預設字型。此時我們Web頁面中的<body>就繼承了這個“font-size:16px;”,除非你在CSS樣式中顯式的設定<body>的“font-size”值,來改變其繼承的值。這樣一來,“1em = 16px”、“0.5em = 8px”、“10em = 160px”等等,那麼我們也可以使用“em”來指定任何元素的大小。
設定Body的font-size
很多前輩在多年的實踐中得出一個經驗,他們建議我們在<body>中設定一個正文文字所需的字型大小,或者設定為“10px”,相當於(“0.625em或62.5%”),這樣為了方便其子元素計算。這兩種都是可取的。但是我們都知道,<body>的預設字型是“16px”,同時我們也很清楚了,我們改變了他的預設值,要讓彈性佈局不被打破,就需要重新進行計算,重新進行調整。所以完美的設定是:
body {font-size:1em;}
可是在那個沒人愛的IE底下,“em”會有一個問題存在。調整字型大小的時候,同樣會打破我們的彈性佈局,不過還好,有一個方法可以解決:
html {font-size: 100%;}
公式轉換——PXtoEM
如果你是第一建立彈性佈局的,最好在身邊準備一個計算器,因為我們一開始少不了很多的計算,有了他放心。
畫素對於我們來說太密切了,因此我們也將從這開始。首先需要計算出1px和em之間的比例,然後是知道我們需要的px值。通過前面的介紹,大家都知道1em總是等於父元素的字型大小,因此我們完全可以通過下面的工式來計算:
1 ÷ 父元素的font-size × 需要轉換的畫素值 = em值
大家可以參考一下面這張轉換表(body字型為16px時的值)
接下來我們一起看一個很簡單的例項“使用CSS的EM製作一個960px寬度的彈性佈局”
HTML Markup
<body> <div id="container"> …</div> </body>
將960px轉換為em
1 ÷ 16px × 960px = 60em
這個計算值的前提條件是<body>的“font-size:16px”。
CSS Code
html { font-size: 100%; } body { font-size: 1em; } #container { width: 60em; }
通過上面的例項,我想大家更能形像化的理解了,因為有例可詢,其實我們可以把上面的計算公式轉換一下,將更方便你的計算:
需要轉換的畫素值 ÷ 父元素的font-size = em值
那麼我們上面的例項“960px”就可以這樣來轉換成“em”值
960px ÷ 16px = 60em
上面我們一起見證了“px”轉換成“em”的計算方式,接下來我們一起來動看製作上面展示過的彈性佈局樣例。下面我們主要一起來一步一步的實現他。更多精彩內容關注微信公眾號:全棧開發者中心(admin10000_com)
構建一個彈性的容器
要建立彈性佈局樣例那樣的居中效果,我們首先需要建立一個HTML結構,我在此給建立一個<div>並且取名叫“wrap”
<body> <div id="wrap"> content here</div> </body>
我們希望這個容器是一個“740px”寬,適合一個“800px × 600px”顯屏的例項。那麼“740px”會等於多少“em”呢?這就是我們需要關心的問題,大家一起來看吧:
1、將“740px”轉換成“em”設定到我們的容器“div#wrap”:我們都知道“div#wrap”的父元素<body>設定了字型為“16px”,那麼此時在沒有進行另外顯示的設定時,他的子元素<div id="wrap">將繼承“font-size”值,這樣我們就可以輕意得到:“1px和1em之間的關係”
1em = 16px 也就是 1px = 1 ÷ 16 = 0.0625em
這樣一來,我們的“740px”就很容易的能轉換成“em” 0.0625em × 740 = 46.25em
當然大家也可以按照我們前面所列出的計算公式來進行轉換,這樣你心中更具有一個概念性,也不容易弄錯:
1 ÷ 16 × 740 = 46.25em (1 ÷ 父元素的font-size × 需要轉換的畫素值 = em值)
這樣一來,您可以使用上面的公式計算出您需要的任何寬度或高度的“em”值,你只需要知道“1px等於多少em”,另外就是你要轉換的“px”值是多少,具備這幾個引數你就能得到你想要的“em”值了。
2、建立CSS樣式:現在我們可以給“div#wrap”寫樣式了,彈性佈局樣例很明顯的告訴我們,給“div#wrap”設定了一個寬度為“740px”居中,帶有上下“margin”為“24px”,而且帶有“1px”的邊框效果,那麼我們首先根據上面的公式計算出相應的“em值”,然後在寫到CSS樣式中:
html {font-size: 100%;} body {font-size: 1em;} #wrap { width: 46.25em;/*740px ÷ 16 = 46.25em */ margin: 1.5em auto;/*24px ÷ 16 = 1.5em*/ border: 0.0625em solid #ccc;/*1px ÷ 16 = 0.0625em*/ }
現在我們就輕鬆的建立了一個包含內容的彈性容器:彈性佈局樣例。
文字樣式與em
首先我們在前面那個建立的<div id="wrap"></div>中插入一個<h1>和一個<p>:
<div id="wrap"> <h1>...</h1> <p>...</p> </div>
在彈性佈局樣例例項中,我們標題使用了“18px”,而段落設定的是“12px”字型,同時其行高是“18px”。18px將是我們實現彈性佈局的一個重要值,可以使用他們都按正比變化。(有關於標題和段落的排版介紹,大家感興趣可以點選Richard Rutter的basic leading和vertical rhythm以及chapter on vertical motion的相關介紹)。
根據CSS繼承一說,我們在“div#wrap”的內容容器中沒有顯式的設定字型大小,這樣整個“div#wrap”將繼承了其父元素“body”的字型——“16px”。
1、給段落設定樣式:——“12px”的字型,“18px”的行高以及margin值
從CSS繼承中,我們可以得知我們所有段落繼承了其父元素“div#wrap”的“font-size:16px”。同時我們通過前面的介紹得知1px = 1 ÷ 16 = 0.0625em,這樣一來我們就很輕鬆的知道“12px”等於多少個“em”
0.0625em × 12 = 0.750em
這樣我們就可以給段落p設定樣式:
p {font-size: 0.75em;/*0.0625em × 12 = 0.750em */}
要計算出段落所需的行高和“margin”為“18px”,來滿足Richard Rutter說的basic leading,那我們就需要像下面的方法和來計算:
18 ÷ 12 = 1.5em
使用所需的行高值“18px”直接除以“字型大小12px”,這樣就得到了段落“p”的“line-height”值。在本例中行高就等於字型的“1.5”倍,接著我們把“line-height”和“margin”樣式加到段落“p”中
p{ font-size: 0.75em;/*0.625em × 12 = 0.750em */ line-height: 1.5em;/*18px(line-height) ÷ 12(font-size) = 1.5em */ margin: 1.5em;/*18px(margin) ÷ 12(font-size) = 1.5em */ }
2、給標題設定一個18px的字號
標題“h1”和段落“p”一樣的原理,他也是繼承他父元素“div#wrap”的“16px”的“font-size”,所以我們也是按同樣的方法可以計處出他的“em”
0.0625em × 18 = 1.125em
我們可以把得出的值寫到CSS樣式表中
h1 { font-size: 1.125em;/*0.625em × 18 = 1.125em*/ }
同樣為了保留Richard Rutter所說的vertical rhythm,我們同樣將標題“h1”的“line-height”和“margin”都設定為“18px”,使用方法前面介紹的方法。很容易得到他們的“em”值為“1em”:
h1 { font-size: 1.125em; /*0.625em × 18 = 1.125em*/ line-height: 1em; /*18px(line-height) ÷ 18px(font-size) = 1em */ margin: 1em; /*18px(margin) ÷ 18px(font-size) = 1em */ }
設定圖片大小——使用em
要做出彈性佈局樣例這樣的果,我們也需要在html中插入一張圖片:
<body> <div id="wrap"> <h1>....</h1> <p><img src="90.png" alt="" /> Lorem...</p> </div> </body>
我們這張圖片具有“90px”的寬和高,同時具有一個右邊距和底邊距為“18px”設定,而且還進行左浮動。下面我們就一起來看其如何實現圖片這幾個樣式效果:
從HTML結構中,我們很清楚的知道,圖片是段落“p”的子元素,通過前面的介紹,你們知道這個段落“p”的“font-size”值被得定義為“12px”,因此我們計算圖片的屬性值時,不能在按“1px = 0.0625em”或者“1em=16px”來計算,我們需要使用最老的公式計算:
1 ÷ 父元素的font-size × 需要轉換的畫素值 = em值
這樣一來,按上面所示的公式,我們就可以計算出圖片的大小:
1 ÷ 12 × 90 = 7.5em
現在你就可以將計算出來的值寫到樣式中去:
p img { width: 7.5em; /*1 ÷12( 父元素的font-size) × 90px(圖片的寬度) = 7.5em */ height: 7.5em; /*1 ÷12( 父元素的font-size) × 90px(圖片的高度) = 7.5em */ }
我們在段落中知道了“18px”剛好是“1em”,現在我們也把他使用到圖片的樣式中:
p img { width: 7.5em; /*1 ÷12( 父元素的font-size) × 90px(圖片的寬度) = 7.5em */ height: 7.5em; /*1 ÷12( 父元素的font-size) × 90px(圖片的高度) = 7.5em */ margin: 0 1.5em 1.5em 0; float: left; }
這樣我們就製作出一個和彈性佈局樣例一樣的效果。希望通過這樣的一個例項能幫助大家瞭解如何使用“em”來建立一個彈性佈局的方法。當然大家可能還在擔心使用“em”來製作一個彈性佈局,不能像“px”一樣的的精確,如果你真正理解了這篇教程後,我想你不會在有這樣的想法。
彈性佈局的公式總結
最後我想大家肯定和我會有同一種想法,就是相關引數是的“px”值如何成功而且正確的轉換成“em”值,經過上面的學習,我最後將公式總結一下:
元素自身沒有設定字號大小時,元素的width、height、line-height、margin、padding、border等值轉換都按下面公式轉換:
1 ÷ 父元素的font-size × 需要轉換的畫素值 = em值
我們來看一個例項:
<body> <div id="wrapper">test</div> </body>
我們在body預設字型大小為“16px”,此時需要“div#wrapper”的相關引數值為:
#wrapper { width: 200px; height: 100px; border: 5px solid red; margin: 15px; padding: 10px; line-height: 18px; }
那麼我們按照上面的公式,將所在引數進行轉換:
#wrapper { width: 12.5em;/*1 ÷ 16 × 200 = 12.5em值*/ height: 6.25em;/*1 ÷ 16 × 100 = 6.25em值*/ border: 0.3125em solid red;/*1 ÷ 16 × 5 = 0.3125em值*/ margin: 0.9375em;/*1 ÷ 16 × 15 = 0.9375em值*/ padding: 0.625em;/*1 ÷ 16 × 10 = 0.625em值*/ line-height: 1.125em;/*1 ÷ 16 × 18 = 1.125em值*/ }
我們一起來看計算出來的值:
接下來我需要大家在來看一個效果,這一點很關鍵喲,仔細看好,在同樣的引數基礎上稍加一條元素本身設定字型大小為:14px;,大家可以會說很簡單的呀,按前面的公式計算出來加上就是了,那麼我現在就按大家說的計算加上:
#wrapper { font-size: 0.875em;/*1 ÷ 16 × 14= 0.875em值*/ width: 12.5em;/*1 ÷ 16 × 200 = 12.5em值*/ height: 6.25em;/*1 ÷ 16 × 100 = 6.25em值*/ border: 0.3125em solid red;/*1 ÷ 16 × 5 = 0.3125em值*/ margin: 0.9375em;/*1 ÷ 16 × 15 = 0.9375em值*/ padding: 0.625em;/*1 ÷ 16 × 10 = 0.625em值*/ line-height: 1.125em;/*1 ÷ 16 × 18 = 1.125em值*/ }
此進我們在firebug下看計算出來的layout值
為了更好的說明問題,我把元素自身沒有設定字型大小和元素自身設定了字型大小,兩者在firebug計算出來值:
我截這個圖的主要意圖是,說明一個問題就是元素自身要是設定了字型大小後,其計算公式就不在是前面所說的,我們需要做一下修改:
1、字型計算公式依舊
1 ÷ 父元素的font-size × 需要轉換的畫素值 = em值
2、其它屬性的計算公式需要換成
1 ÷ 元素的font-size × 需要轉換的畫素值 = em值
那麼我們現在來計算一回:
#wrapper { font-size: 0.875em;/*1 ÷ 16 × 14= 0.875em值*/ width: 14.2857em;/*1 ÷ 14 × 200 = 14.2857em值*/ height: 7.1429em;/*1 ÷ 14 × 100 = 7.1429em值*/ border: 0.357em solid red;/*1 ÷ 14 × 5 = 0.357em值*/ margin: 1.071em;/*1 ÷ 14 × 15 = 1.071em值*/ padding: 0.714em;/*1 ÷ 14 × 10 = 0.714em值*/ line-height: 1.2857em;/*1 ÷ 14 × 18 = 1.2857em值*/ }
我們在來看一次計算出來的值:
總結
長篇介紹了一大堆,唯一想告訴大家的是以下幾點
1、瀏覽器的預設字型大小是16px
2、如果元素自身沒有設定字型大小,那麼元素自身上的所有屬性值如“boder、width、height、padding、margin、line-height”等值,我們都可以按下面的公式來計算
1 ÷ 父元素的font-size × 需要轉換的畫素值 = em值
3、這一種千萬要慢慢理解,不然很容易與第二點混了。如果元素設定了字型大小,那麼字型大小的轉換依舊按第二條公式計算,也就是下面的:
1 ÷ 父元素的font-size × 需要轉換的畫素值 = em值
那麼元素設定了字型大小,此元素的其他屬性,如“border、width、height、padding、margin、line-height”計算就需要按照下面的公式來計算:
1 ÷ 元素自身的font-size × 需要轉換的畫素值 = em值
這樣說,不知道大家理解了整明白了沒有,如果沒有整明白,可以回過頭來看上面的一個例項。
相關文章
- css中的px、em、rem 詳解CSSREM
- CSS 小結筆記之emCSS筆記
- CSS px、em和rem單位CSSREM
- 深入理解CSS中em, rem, ex區別,及使用技巧CSSREM
- 強大的CSS:顏色、背景和剪下CSS
- 強大的CSS動畫:Transition與AnimationCSS動畫
- 強大的CSS:圖形繪製合集,方便你我!CSS
- 強大的CSS:文字下波浪線動畫效果CSS動畫
- css常用單位px、em、 rem 區別與各自的用法解析CSSREM
- 強大的CSS:實現平行四邊形佈局效果CSS
- 強大的CSS:focus-visible偽類真的太6了!CSS
- 強大的CSS:模擬下雪效果動畫製作教程CSS動畫
- EM
- 7.pytest 強大的 fixture (中)
- [譯] Swift 中強大的模式匹配Swift模式
- CSS中的五大選擇器CSS
- CSS的一些你可能不知道的強大技巧CSS
- 15 分鐘帶你感受 CSS :has() 選擇器的強大CSS
- rem與em的區別||結合使用rem與emREM
- 強填EM演算法在理論與工程之間的鴻溝(上)演算法
- 強大的CSS:var變數的區域性作用域(繼承)特性CSS變數繼承
- 強大的CSS :實現仿 Windows10 滑鼠照亮邊框效果CSSWindows
- CSS單位em是相對於父元素還是當前元素的字型大小?CSS
- 如何更愉快地使用em —— 別說你懂CSS相對單位CSS
- Golang中的強大Web框架Fiber詳解GolangWeb框架
- Laravel 中強大的tap你用過麼Laravel
- 強大的CSS:scroll-snap滾動事件停止及元素位置檢測CSS事件
- em、rem、px、的區別REM
- em 和 remREM
- 強制修改CSS的屬性styleCSS
- 強大的ognl
- [譯]發現 JavaScript 中閉包的強大威力JavaScript
- css中實現強制不換行/自動換行/強制換行CSS
- CSS中的“大白”——CSS 動畫CSS動畫
- 強大的CSS:3種姿勢實現26個英文字母的案例CSS
- 強大的CSS:濾鏡和混合模式處理的圖片如何上傳下載?CSS模式
- oracle EM 優化Oracle優化
- CSS中的BFCCSS
- 強大的Github ActionsGithub