display的所有屬性 下麵就display的重要屬性進行講解,並配合一些相關的例子 基本屬性 display: none none 是 CSS 1 就提出來的屬性,將元素設置為none的時候既不會占據空間,也無法顯示,相當於該元素不存在。 該屬性可以用來改善重排與重繪,同時我也經常用它來做模態窗 ...
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
的重要屬性進行講解,並配合一些相關的例子
基本屬性
display: none
none
是 CSS 1 就提出來的屬性,將元素設置為none的時候既不會占據空間,也無法顯示,相當於該元素不存在。
該屬性可以用來改善重排與重繪,同時我也經常用它來做模態窗等效果。
display: inline
inline
也是 CSS 1 提出的屬性,它主要用來設置行內元素屬性,設置了該屬性之後設置高度、寬度都無效,同時text-align
屬性設置也無效,但是設置了line-height
會讓inline
元素居中
同時從上圖可以看到兩個inline
標簽之間出現了奇怪的間隔,改間隔的原因是div
換行產生的換行空白,解決辦法
-
將兩個inline標簽寫到一行
<body>
<div class="test">123</div><div class="test">123</div>
</body>
-
或者使用一點技巧
<div class="main">
<div class="test">zhan</div>
<div class="test">123</div>
</div>
<style>
html{
-webkit-text-size-adjust:none;/* 使用webkit的私有屬性,讓字體大小不受設備終端的調整,可定義字體大小小於12px */
}
.main{
font-size:0;
*word-spacing:-1px;/* 使用word-spacing 修複 IE6、7 中始終存在的 1px 空隙,減少單詞間的空白(即字間隔) */
}
.test{
display:inline;
width: 10000px;
height:10000px;
border:1px solid;
font-size:12px;
letter-spacing: normal;/* 設置字母、字間距為0 */
word-spacing: normal; /* 設置單詞、欄位間距為0 */
}
</style>
實測chome49瀏覽器只用設置父元素的font-size為0
即可。
目前有很多原生的元素都是inline
的,span、a、label、input、 img、 strong 和em
就是典型的行內元素元素。
鏈接:http://www.css88.com/archives...
display: block
設置元素為塊狀元素,如果不指定寬高,預設會繼承父元素的寬度,並且獨占一行,即使寬度有剩餘也會獨占一行,高度一般以子元素撐開的高度為準,當然也可以自己設置寬度和高度。
在設計的過程中有時需要設計一個div寬高都是整個屏幕,整個時候寬度很好設置,可是高度一般很難設置,因為頁面一般都是可以滾動的,所以高度一般可變,所以這個時候可以使用一個小技巧,如下。
<div class="main">
</div>
<style>
html{
height: 100%;
}
body{
height: 100%;
padding: 0;
margin:0;
}
.main{
background: red;
width: 100%;
height: 100%;
}
</style>
基本原理:div
繼承的是父元素body
的高度,body
是繼承html
的高度,html
是繼承的瀏覽器屏幕的高度。
display: list-item
此屬性預設會把元素作為列表顯示,要完全模仿列表的話還需要加上 list-style-position,list-style-type
<div>
<span>111111</span>
<span>222222</span>
<span>333333</span>
</div>
<style>
div{
padding-left:30px;
}
span{
display:list-item;
list-style:disc outside none;
}
</style>
效果圖如下:
通過上面樣式設置,就能仿出一個類似的列表,一定要在div
上加padding
,因為預設的列表之前的·在box
外面
display: inline-block
inline-block
為 CSS 2.1 新增的屬性。 inline-block
既具有block
的寬高特性又具有inline
的同行元素特性。 通過inline-block
結合text-align: justify
還可以實現固定寬高的列表兩端對齊佈局,如下例子:
<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"> </div>
<div class="col fix"> </div>
<div class="col fix"> </div>
<div class="col fix"> </div>
<div class="col fix"> </div>
</div>
<style>
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;
}
</style>
效果圖如下:
text-align: justify
屬性會使行內元素兩端對齊,但是要求這些行內元素總寬度至少占滿一行,所以在總寬度不足一行的時候這個屬性沒用,因此在最後需要加上一些占位符。
詳情可以查看 張鑫旭老師的博客
Tip: inline-block會形成一個BFC
display: table
table
此元素會作為塊級表格來顯示(類似table),表格前後帶有換行符。CSS表格能夠解決所有那些我們在使用絕對定位和浮動定位進行多列佈局時所遇到的問題。例如,display:table
的CSS聲明能夠讓一個HTML
元素和它的子節點像table
元素一樣。使用基於表格的CSS佈局,使我們能夠輕鬆定義一個單元格的邊界、背景等樣式, 而不會產生因為使用了table
那樣的製表標簽所導致的語義化問題。
利用table的特性,我們能夠輕易的實現三欄佈局,並且能夠相容IE8,如下是使用table屬性,實現三欄佈局的例子:
<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>
<style>
.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;
}
</style>
效果如下圖:
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...
實例:實現一個固定寬度但內容可變的列表
目前我有一個需求,有一個列表頁,左側固定,右側固定,總寬度固定,但是左側的內容可能會增加,右側的內容也可能會增加,要求平時一行展示,增加的時候兩行展示,左側兩行,右側還是一行,並且都居中。
先上效果圖,不然可能會迷糊:
為了實現上述效果,代碼如下
<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>
<style>
.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;
}
</style>
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
並沒有什麼用,不知道是不是我寫的有問題,目前沒找到這個屬性的用法
<div class="main">
<div class="sp1">123</div>
<div class="sp1">123</div>
</div>
<style>
.main{
display: -webkit-inline-flex;
justify-content: center;
}
.sp1{
flex:1;
}
</style>
其他
以下屬性是實驗性質的,支持度都很低,不建議使用,知道就行。
-
run-in
: 此元素會根據上下文作為塊級元素或內聯元素顯示; -
grid
: 柵格模型,類似block -
inline-grid
: 柵格模型,類似inline-block -
ruby, ruby-base, ruby-text, ruby-base-container,ruby-text-container
-
contents