轉自(擔憂原做者會刪除文章,因此這裏本身作個備份):display的32種寫法css
你知道『回
』字有四種寫法,但你知道display
有32
種寫法嗎?今天咱們一一道來,讓你一次性徹底掌握display
,今後不再用對它發愁。html
從大的分類來說,display
的32
種寫法能夠分爲6個大類
,再加上1個全局類
,一共是7大類
前端
所謂外部值,就是說這些值只會直接影響一個元素的外部表現,而不影響元素裏面的兒子級孫子級元素的表現。css3
1.1 display: block;
:這個值你們不陌生,咱們最熟悉的<div>
缺省就是這個值,最基本的塊級元素,屬於css入門初學者都知道的概念,只要是容器類型的元素基本都是這個值。除<div>
以外,還有<h1>到<h6>,<p>,<form>,<header>,<footer>,<section>,<article>
天生都是這個值。面試
1.2 display: inline;
:這個值你們也不陌生,行內元素嘛,只要是個行內元素都是這個值,最典型的是<span>
,還有<a>,<img>
,以及古代html語言當中的<b>,<i>
都屬於這一類型。segmentfault
1.3 display: run-in
(一般沒人用它):除了IE
和Opera
支持它之外,其餘全部主流瀏覽器包括Chrome
, Safari
, Firefox
全都對它置若罔聞。run-in
,中文意思就是『闖入
』那麼這個元素就直接闖入下一行瀏覽器
談完了外部值,咱們來看看內部值。這一組值比較有意思了,在css3
如火如荼的今天,你要玩不轉這些值,怕是哪兒也找不到工做的。內部值主要是用來管束本身下屬的兒子級元素的排布的,規定它們或者排成S形,或者排成B形這樣的。ruby
display: flow;
(實驗階段):含義不清,實驗室階段產品,Chrome
不支持2.2 display: flow-root;
:不一樣於flow
,如今用flow-root
的漸漸多起來了, 由於它能夠撐起被你float
掉的塊級元素的高度。bash
浮動元素使其父元素高度塌陷(該段內容參看了另外一文章後總結) :咱們常常會遇到一種狀況,給一個元素設置浮動以後 float:left/right;,若是該元素的父元素有背景顏色,那麼會發現父元素的背景顏色消失了;若是父元素有一個邊框,那麼浮動元素沒法將邊框撐開。前端工程師
<html>
<head>
<style> .pdiv { background-color:cornflowerblue; border: 2px solid red; /**父元素加overflow:hidden 能夠消除子元素float對父元素的影響*/ /**overflow: hidden; */ /** display新的屬性值 雖然目前僅幾個最新瀏覽器支持, 但徹底能夠經過@supports()屬性作完美降級處理。 */ display: flow-root; } /** 爲父元素添加僞類能夠 消除子元素float對父元素的影響 .pdiv::after { content:""; clear:both; //清除浮動 display:block; //確保該元素是一個塊級元素 } */ .cdiv { background-color:burlywood; border: 1px solid brown; width: 100px; height: 100px; margin: 20px; /** float: left; */ } </style>
</head>
<body>
<div class="pdiv">
<div class="cdiv">
</div>
<div class="cdiv">
</div>
</div>
</body>
</html>
複製代碼
未加float時:
在第一個示例中彷彿父元素消失了,但在第二個示例中發現其實父元素並無消失,只是高度被計算爲0。這就要回到浮動元素的特性來講明此問題「當元素設置浮動後,會自動脫離文檔流」,翻譯成白話就是說,元素浮動後,就不在整個文檔流的管轄範圍,那麼它以前存在在父元素內的高度就隨着浮動不復存在了,而此時父元素會默認本身裏面沒有任何內容(前提是未給父元素設置固定高度,若是父元素自己有固定高度,就不會出現這種狀況)
解決方法:
a、給父元素也添加float。這樣讓父元素與子元素一塊兒脫離文檔流浮動起來,保證子元素在父元素內,這樣父元素就能自適應子元素的高度,可是此方法有一弊端,必定會影響父元素以後的元素排列,甚至影響佈局。
b、給父元素一個固定高度,此方法適用於子元素高度已知而且固定的狀況。
c、添加一個塊級元素,並給此元素設置clear:both;清除浮動。在很早以前用的就是這種解決辦法,新建一個空的div,爲這個div設置clear:both;這樣無疑是增長了無心義的標籤,一個大型頁面中,這種標籤太可能是很差的。
d、給父元素添加 overflow:hidden;
e、給父元素添加僞類::after清除浮動
新的解決方法:display: flow-root;
2.3 display: table;
:這一個屬性,以及下面的另外8個與table相關
的屬性,都是用來控制如何把div
顯示成table
樣式的,由於咱們不喜歡<table>
這個標籤嘛,因此咱們想把全部的<table>
標籤都換成<div>
標籤。<div>
有什麼好?無非就是能自動換行而已,但其實你徹底能夠作一個<table><tr><td>
標籤,把它全都替換成display: block;
也能夠自動折行,只不過略微麻煩而已。
2.4 display: flex;
【敲黑板,劃重點!】:做爲新一代的前端工程師,這個屬性你必須爛熟於胸。display: flex;
以及與它相關聯的一系列屬性:flex-direction, flex-wrap, flex-flow, justify-content, align-items, align-content
,而且包括全部這些屬性的取值,都是你須要反覆研磨的。2009年誕生的這個屬性能夠說是不亞於css界一場蒸汽機誕生同樣的工業革命,它的誕生標誌着馬車同樣的float被完全拋進歷史的垃圾堆。
2.5 display: grid;
【會flex
很吊嗎?會grid
更吊哦!】:也許這就是下次前端面試的重點哦!
grid佈局
,中文翻譯爲網格佈局
。學習grid佈局有兩個重點: 一個重點是grid佈局引入了一個全新的單位:fr,它是fraction(分數)的縮寫,因此今後之後,你的兵器庫裏除了px, em, rem, 百分比這些常見兵器以及vw,vh這些新式武器以外,又多了同樣旁門暗器fr,要想用好grid,必須充分掌握fr。
另外一個重點是斜槓操做符,這可不是分數哦。它表示的是起始位置和結束位置。好比說3 /4,這可不是四分之三的意思,這是指一個元素從第3行開始,到第4行結束,但又不包括第4行。
一樣,與grid相關聯的也有一大堆旁門屬性,是在學習display: grid;
的同時必須掌握的。包括grid, grid-column-start, grid-column-end, grid-row-start, grid-row-end, grid-template, grid-template-columns, grid-template-rows, grid-template-areas, grid-gap, grid-column-gap, grid-row-gap, grid-auto-columns, grid-auto-rows, grid-auto-flow, grid-column, grid-row
。不能詳述,關於這個寫起來又是一大篇文章。詳情仍是參考csstrick上這篇文章,講得很是細緻很是清楚。
2.6 display: ruby;
【相似加拼音】:ruby這個取值對於咱們亞洲人來講實際上是很是有用的一個東西,可是目前除了Firefox之外其它瀏覽器對它的支持都不太好。簡而言之,display: ruby;的做用就是能夠作出下面這樣的東西:
2.7 display: subgrid;
【瞭解便可】
2015年8月6日
,W3C
的級聯樣式單(CSS
)工做組(Cascading Style Sheets Working Group
)發佈了CSS網格佈局模塊第一級(CSS Grid Layout Module Level 1
)的工做草案。在這個草案裏規定了上一節咱們講到的display: grid;
的方案。
而display: subgrid;
是屬於2017年11月9日發佈的非正式的CSS網格佈局模塊第二級
的內容。因此這是一個很是新的草案,而且圍繞它的爭議歷來也沒有斷過。
subgrid
總的思想是說大網格里還能夠套小網格,互相不影響。
但若是grid
裏能夠再套subgrid
的話,那我subgrid
裏還想再套subgrid
怎麼辦?subsubgrid
嗎?何況,究竟是grid: subgrid;
仍是display: subgrid;
這個也沒有達成共識,關於此一系列的爭議,感興趣的同窗能夠看看這篇文章
display: list-item;
display: list-item;
和display:table;
同樣,也是一幫痛恨各類html
標籤,而但願只使用<div>
來寫遍一切html的傢伙搞出來的鬼東西,實際使用極少,效果就是這樣:
<ul><li>
能實現的效果,他能夠用<div>
實現出來,就是這個做用。li
的默認樣式
好比主值裏設置了display: table;
,就能夠在子元素裏使用display: table-row-group;
等等屬性,不過並不絕對。關於它們的做用,主要參考主值就夠了。
display: table-row-group;
display: table-header-group;
display: table-footer-group;
display: table-row;
display: table-cell;
display: table-column-group;
display: table-column;
display: table-caption;
複製代碼
display: ruby-base;
display: ruby-text;
display: ruby-base-container;
display: ruby-text-container;
複製代碼
MDN裏把它叫作<display-box> values
(盒子值),我把它叫作顯示值,主要是爲了便於理解。
5.1 display: contents
(下面內容來自w3cplus)
display:contents
啥意思呢?看下圖展現:
<div style="display: contents; background: magenta; border: solid thick black; ng: 20px; color: cyan; font: 30px/1 Monospace;">
<span style="background: black;">foobar</span>
</div>
複製代碼
即:display: contents
樣式規則使div元素不產生任何邊界框,所以元素的背景、邊框和填充部分都不會渲染。然而,繼承的屬性如顏色(color)和字體(font)卻能照常影響到span這個子元素。
5.2 CSS網格佈局與display: contents
這個display: contents
樣式能取代子網格(subgrids
:上面2.7提到的內容)功能,目前尚未任何瀏覽器支持次網格。不過,子網格(subgrids
)有些狀況仍是須要用到的。
典型的例子是網格佈局(Grid Layout
)的自動就位(auto-placement
)效果,下面是一個簡單的表格元素,看起來是這樣的:
<html>
<head>
<style> form { display:grid; } label { grid-column: 1; } input { grid-column: 2; } button { grid-column: span 2; } </style>
</head>
<body>
<form>
<label>Name</label><input />
<label>Mail</label><input />
<button>Send</button>
</form>
</body>
</html>
複製代碼
<form>
<ul>
<li><label>Name</label><input /></li>
<li><label>Mail</label><input /></li>
<li><button>Send</button></li>
</ul>
</form>
複製代碼
有了display: contents
樣式,就能夠作出和第一個例子相同的佈局,用的CSS也差很少:
ul{
display: grid;
}
li{
display: contents;
}
label{
grid-column: 1;
}
input{
grid-column: 2;
}
button {
grid-column: span 2;
}
複製代碼
如今這樣,網站轉用CSS網格佈局(Grid Layout
)時,HTML代碼不用大改,也不須要捨去一些確實有用的HTML元素,如上面例子裏的列表元素,真的很不錯。
6.1 display: inline-block;
:關於display: inline-block;
的做用恐怕只要作過3天以上前端的工程師都應該知道。什麼也不說了,上一張著名的圖片做總結吧:
6.2 display: inline-table;
:你要能理解inline-block
,你就能理解inline-table
。在行內顯示一個表格,就像這樣:
6.3 display: inline-flex;
:這個就不用多說了吧?跟上面同樣,在行內進行彈性佈局,參考display: flex
;。
6.4 display: inline-grid;
:同上,在行內進行網格佈局,參考display: grid;
。
這些值不是display屬性的專利,幾乎其它任意屬性均可以用,列在這裏湊個數。
display: inherit;
:繼承父元素的display
屬性。display: initial;
:無論父元素怎麼設定,恢復到瀏覽器最初始時的display
屬性display: unset;
:unset
混合了inherit
和initial
。若是父元素設值了,就用父元素的設定,若是父元素沒設值,就用瀏覽器的缺省設定。直接看圖最明白:以上就是在css
裏display
的32
種寫法。談了這麼多,不知道你記住了多少呢?其實,單純理解每個display
屬性的取值都不難,難的是融會貫通,在恰當的地方運用恰當的值,畢竟咱們的目的是爲了把代碼寫短,而不是把代碼寫長。若是你怕記不太清的話,就請你收藏這篇小文,也許未來的某一天,你會用得着。