CSS display 屬性詳解

原文地址:http://zhanfang.github.io/2016/07/22/display屬性詳解
轉載請註明地址及做者: zhanfangcss

最近瞎忙了好長一段時間,一直沒時間寫文章,想深刻學習一下css的相關屬性,因此有了這篇文章,若有錯誤請指針。html

display的全部屬性

/* CSS 1 */
display: none;
display: inline;
display: block;
display: list-item;

/* CSS 2.1 */
display: inline-block;

display: table;
display: inline-table;
display: table-cell;
display: table-column;
display: table-column-group;
display: table-footer-group;
display: table-header-group;
display: table-row;
display: table-row-group;
display: table-caption;
/* CSS 2.1 */

/* CSS 3 */
display: inline-list-item;
display: flex;
display: box;
display: inline-flex;

display: grid;
display: inline-grid;

display: ruby;
display: ruby-base;
display: ruby-text;
display: ruby-base-container;
display: ruby-text-container;
/* CSS 3 */

/* Experimental values */
display: contents;
display: run-in;
/* Experimental values */

/* Global values */
display: inherit;
display: initial;
display: unset;

下面就display的重要屬性進行講解,並配合一些相關的例子git

基本屬性

display: none

none 是 CSS 1 就提出來的屬性,將元素設置爲none的時候既不會佔據空間,也沒法顯示,至關於該元素不存在。github

該屬性能夠用來改善重排與重繪,同時我也常常用它來作模態窗等效果。web

display: inline

inline也是 CSS 1 提出的屬性,它主要用來設置行內元素屬性,設置了該屬性以後設置高度、寬度都無效,同時text-align屬性設置也無效,可是設置了line-height會讓inline元素居中chrome

Alt

同時從上圖能夠看到兩個inline標籤之間出現了奇怪的間隔,改間隔的緣由是div換行產生的換行空白,解決辦法瀏覽器

  • 將兩個inline標籤寫到一行ruby

<body>
  <div class="test">123</div><div class="test">123</div>
</body>
  • 或者使用一點技巧ide

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div class="main">
    <div class="test">zhan</div>
    <div class="test">123</div>
  </div>

</body>
</html>


html{
  -webkit-text-size-adjust:none;/* 使用webkit的私有屬性,讓字體大小不受設備終端的調整,可定義字體大小小於12px */
}
.main{
  font-size:0;
  *word-spacing:-1px;/* 使用word-spacing 修復 IE六、7 中始終存在的 1px 空隙,減小單詞間的空白(即字間隔) */
}
.test{
  display:inline;
  width: 10000px;
  height:10000px;
  border:1px solid;
  font-size:12px;

  letter-spacing: normal;/* 設置字母、字間距爲0 */ 
  word-spacing: normal; /* 設置單詞、字段間距爲0 */
}

實測chome49瀏覽器只用設置父元素的font-size爲0便可。wordpress

目前有不少原生的元素都是inline的,span、a、label、input、 img、 strong 和em就是典型的行內元素元素。
連接:http://www.css88.com/archives...

display: block

設置元素爲塊狀元素,若是不指定寬高,默認會繼承父元素的寬度,而且獨佔一行,即便寬度有剩餘也會獨佔一行,高度通常以子元素撐開的高度爲準,固然也能夠本身設置寬度和高度。

在設計的過程當中有時須要設計一個div寬高都是整個屏幕,整個時候寬度很好設置,但是高度通常很難設置,由於頁面通常都是能夠滾動的,因此高度通常可變,因此這個時候可使用一個小技巧,以下。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div class="main">
  </div>
</body>
</html>

html{
  height: 100%;
}
body{
  height: 100%;
  padding: 0;
  margin:0;
}
.main{
  background: red;
  width: 100%;
  height: 100%;
}

基本原理:div繼承的是父元素body的高度,body是繼承html的高度,html是繼承的瀏覽器屏幕的高度。

display: list-item

此屬性默認會把元素做爲列表顯示,要徹底模仿列表的話還須要加上 list-style-positionlist-style-type

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<div>
  <span>111111</span>
  <span>222222</span>
  <span>333333</span>
</div>
</body>
</html>
div{
  padding-left:30px;
}

span{ 
  display:list-item;
  list-style:disc outside none;
}

效果圖以下:
Alt

經過上面樣式設置,就能仿出一個相似的列表,必定要在div上加padding,由於默認的列表以前的·在box外面

display: inline-block

inline-block爲 CSS 2.1 新增的屬性。 inline-block既具備block的寬高特性又具備inline的同行元素特性。 經過inline-block結合text-align: justify 還能夠實現固定寬高的列表兩端對齊佈局,以下例子:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<div class="main">
  <div class="col col1">111111</div>
  <div class="col col2">222222</div>
  <div class="col col3">333333</div>
  <div class="col col1">111111</div>
  <div class="col col2">222222</div>
  <div class="col col3">333333</div>
  <div class="col fix">&nbsp;</div>
  <div class="col fix">&nbsp;</div>
  <div class="col fix">&nbsp;</div>
  <div class="col fix">&nbsp;</div>
  <div class="col fix">&nbsp;</div>
</div>
</body>
</html>
body{
  margin:0;
  padding:0; 
}
.main{
  text-align:justify;
}
.col{ 
  display: inline-block;
  margin-top:10px;
  width:100px;
  height: 100px;
  text-align: center;
  line-height: 100px;
  color: #fff;
}
.col1{
  background: red;
}
.col2{
  background: green;
}
.col3{
  background: blue;
}
.fix{
  height:0; 
  padding:0; 
  overflow:hidden;
}

效果圖以下:
Alt

text-align: justify 屬性會使行內元素兩端對齊,可是要求這些行內元素總寬度至少佔滿一行,因此在總寬度不足一行的時候這個屬性沒用,所以在最後須要加上一些佔位符。

詳情能夠查看 張鑫旭老師的博客

Tip: inline-block會造成一個BFC

display: table

table 此元素會做爲塊級表格來顯示(相似table),表格先後帶有換行符。CSS表格可以解決全部那些咱們在使用絕對定位和浮動定位進行多列布局時所遇到的問題。例如,display:table的CSS聲明可以讓一個HTML元素和它的子節點像table元素同樣。使用基於表格的CSS佈局,使咱們可以輕鬆定義一個單元格的邊界、背景等樣式, 而不會產生由於使用了table那樣的製表標籤所致使的語義化問題。

利用table的特性,咱們可以輕易的實現三欄佈局,而且可以兼容IE8,以下是使用table屬性,實現三欄佈局的例子:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<div class="main">
  <div class="tr tr1">
    <div class="td">head1</div>
    <div class="td">head2</div>
    <div class="td">head3</div>
  </div>
  <div class="tr tr2">
    <div class="td">123</div>
    <div class="td">123</div>
    <div class="td">123</div>
  </div>
</div>
</body>
</html>
.main{
  display: table;
  width:100%;
  border-collapse: collapse;/*爲表格設置合併邊框模型:*/
}
.tr{
  display: table-row;
  border-color: inherit;
}
.tr1 .td{
  height:50px;
  vertical-align: middle;
}
.td{
  display: table-cell;
  border: 1px solid;
}
.td:nth-of-type(1){
  width: 100px;
}
.td:nth-of-type(3){
  width: 100px;
}

效果以下圖:
Alt

CSS2.1表格模型中的元素,可能不會所有包含在除HTML以外的文檔語言中。這時,那些「丟失」的元素會被模擬出來,從而使得表格模型可以正常工做。全部的表格元素將會自動在自身周圍生成所需的匿名table對象,使其符合table/inline-table、table-row、table-cell的三層嵌套關係。

因此在通常狀況下咱們也能夠不寫外面的table-row元素以及table元素。

display: inline-list-item

我在MDN上面看到有這個屬性,可是我實際嘗試發現這個屬性是不能使用的,在 http://caniuse.com/#search=in... 上面也沒有找到這個元素的兼容性,因此應該是不能使用的,支持度全無。

display: flex

flex是一種彈性佈局屬性
注意,設爲Flex佈局之後,子元素的float、clear和vertical-align屬性將失效。
主要屬性有兩大類:容器屬性和項目的屬性

容器屬性

  • flex-direction: 屬性決定主軸的方向(即項目的排列方向)。

  • flex-wrap: 默認狀況下,項目都排在一條線(又稱"軸線")上。flex-wrap屬性定義,若是一條軸線排不下,如何換行。

  • flex-flow: 屬性是flex-direction屬性和flex-wrap屬性的簡寫形式,默認值爲row nowrap。

  • justify-content: 屬性定義了項目在主軸上的對齊方式。

  • align-items: 屬性定義項目在交叉軸上如何對齊。

  • align-content: 屬性定義了多根軸線的對齊方式。若是項目只有一根軸線,該屬性不起做用。

項目屬性

  • order: 定義項目的排列順序。數值越小,排列越靠前,默認爲0。

  • flex-grow: 定義項目的放大比例,默認爲0,即若是存在剩餘空間,也不放大。

  • flex-shrink: 屬性定義了項目的縮小比例,默認爲1,即若是空間不足,該項目將縮小。

  • flex-basis: 屬性定義了在分配多餘空間以前,項目佔據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的默認值爲auto,即項目的原本大小。

  • flex: 屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值爲0 1 auto。後兩個屬性可選。

  • align-self: 屬性容許單個項目有與其餘項目不同的對齊方式,可覆蓋align-items屬性。默認值爲auto,表示繼承父元素的align-items屬性,若是沒有父元素,則等同於stretch。

以上關於flex的基礎知識基本是從阮一峯老師那copy過來的,有興趣的同窗,能夠到阮一峯老師的博客深刻閱讀

http://www.ruanyifeng.com/blo...
http://www.ruanyifeng.com/blo...

實例:實現一個固定寬度但內容可變的列表

目前我有一個需求,有一個列表頁,左側固定,右側固定,總寬度固定,可是左側的內容可能會增長,右側的內容也可能會增長,要求平時一行展現,增長的時候兩行展現,左側兩行,右側仍是一行,而且都居中。

先上效果圖,否則可能會迷糊:
Alt

爲了實現上述效果,代碼以下

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div class="main">
    <ul>
      <li>
        <span class="col1">累積的分爲:123</span>
        <div class="col2">
          <span>123</span>
          <span>x 10</span>
          <button>submit</button>
        </div>
      </li>
      <li>
        <span class="col1">累積的分爲:1234</span>
        <div class="col2">
          <img src="http://7xltvd.com1.z0.glb.clouddn.com/css1.png" alt="">
          <span class="col2-span">x 10</span>
          <button>submit</button>
        </div>
      </li>
    </ul>
  </div>
</body>
</html>
.main{
  height: 200px;
  width: 300px;
  border: 1px solid;
}
ul{
  padding: 0px;
  margin-top: 10px;
}
li{
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 10px 0;
  margin-bottom: 10px;
  border: 1px solid;
}
button{
  height: 20px;
  vertical-align: middle;
  border:0;
  background: green;
  outline:none;
}
img{
  width:30px;
  vertical-align: middle;
}
.col2-span{
  vertical-align: middle;
}
.col1{
  width: 130px;
  padding-left:8px;
}
.col2{
  padding-right: 8px;
  vertical-align: middle;
}

display: -webkit-box

因爲某X5瀏覽器某些版本還不支持最新版的flex佈局,因此爲了保證良好的運行,建議仍是使用display: box,box和flex佈局的主要差異以下:

容器屬性
  • display: box
    該顯示樣式的新值可將此元素及其直系子代加入彈性框模型中。Flexbox 模型只適用於直系子代。

  • box-orient
    值:horizontal | vertical | inherit

框的子代是如何排列的?還有兩個值:inline-axis(真正的默認值)和 block-axis,可是它們分別映射到水平和垂直方向。

  • box-pack
    值:start | end | center | justify

設置沿 box-orient 軸的框排列方式。所以,若是 box-orient 是水平方向,就會選擇框的子代的水平排列方式,反之亦然。

  • box-align
    值:start | end | center | baseline | stretch

基本上而言是 box-pack 的同級屬性。設置框的子代在框中的排列方式。若是方向是水平的,該屬性就會決定垂直排列,反之亦然。

項目屬性
  • box-flex
    值:0 | 任意整數

該子代的彈性比。彈性比爲 1 的子代佔據父代框的空間是彈性比爲 2 的同級屬性的兩倍。其默認值爲 0,也就是不具備彈性。

用box改造上述例子

基本只修改了容器元素li的屬性,以下所示

li{
  display: -webkit-box;
  -webkit-box-orient:horizontal;
  -webkit-box-pack: justify;
  -webkit-box-align: center;
  padding: 10px 0;
  margin-bottom: 10px;
  border: 1px solid;
}

display: inline-flex

我發如今chrome條件下設置了inline-flex,其子元素所有變成了inline模式,設置flex並無什麼用,不知道是否是我寫的有問題,目前沒找到這個屬性的用法

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
  <div class="main">
    <div class="sp1">123</div>
    <div class="sp1">123</div>
  </div>
</body>
</html>
.main{
  display: -webkit-inline-flex;
  justify-content: center;
}
.sp1{
  flex:1;
}

其餘

如下屬性是實驗性質的,支持度都很低,不建議使用,知道就行。

  • run-in: 此元素會根據上下文做爲塊級元素或內聯元素顯示;

  • grid: 柵格模型,相似block

  • inline-grid: 柵格模型,相似inline-block

  • ruby, ruby-base, ruby-text, ruby-base-container, ruby-text-container

  • contents

相關文章
相關標籤/搜索