CSS之居中
CSS的居中會遇到很多種情況,不同的情況使用的方法不同。
1.水平居中
(1)文本、圖片等行內元索的水平居中
給父元素設置
text-align: center可以實現文本、圖片等行內元素的水平居中,如代碼清單1所示。
代碼清單1 行內元素的水平居中
- <style type="text/CSS">
- .wrap{
- background:#000; width:500px; height:100px;
- margin-bottom:10px; color:#fff; text-align:center}
- </style>
- <div class="wrap">hello world</div>
- <div class="wrap"><img src="test.gif" /></div>
效果如圖1,圖2所示:
圖1 文本元素行內水平居中
圖2 圖片元素行內水平居中
(2)確定寬度的塊級元素的水平居中
確定寬度的塊級元素水平居中是通過設置
margin-left:auto和margin.right:auto來實現的,如代碼清單2
所示。
代碼清單2 確定寬度的塊級元素的水平居中
- <style type="text/CSS">
- .wrap{background:#000; width:500px; height:100px}
- .test{background:red; width:200px; height:50px; margin-left:auto;
- right:auto}
- </style>
- <div class="wrap"><div class="test"></div></div>
效果如圖3
所示。
圖3 塊級元素水平居中
(3)不確定寬度的塊級元素的水平居中
不確定寬度的塊級元素有三種方式可以實現居中。以分頁模塊為例,因為分頁的數量是不確定的,所以我們不能通過設置寬度來限制它的彈性。
方法一如代碼清單3所示。
代碼清單3 不確定寬度的塊級元素的水平居中方法一
- <style type="text/CSS">
- ul{list-style:none; margin:0; padding:0}
- table{margin-left:auto; margin-right:auto;}
- .test li{float:left; display:inline; margin-right:5px;}
- .test a{
- float:left; width:20px; height:20px; text-align:center;
- line- height:20px; background:#316AC5;
- color:#fff; border:1px solid #316AC5; text-decoration:none;}
- .test a:hover{background:#fff; color:#316AC5}
- </style>
- <div class="wrap">
- <table><tbody><tr><td>
- <ul class="test">
- <li><a href="#">1</a></li>
- </ul>
- </td></tr></tbody></table>
- <table><tbody><tr><td>
- <ul class="test">
- <li><a href-"#">1</a></li>
- <li><a href="#">2</a></li>
- <li><a href="#">3</a></li>
- </ul>
- </td></tr></tbody></table>
- <table><tbody><tr><td>
- <ul class="test">
- <li><a href="#">l</a></li>
- <li><a href="#">2</a></li>
- <li><a href-"#">3</a></li>
- <li><a href="#">4</a></li>
- <li><a href-"#">5</a></li>
- </ul>
- </td></tr></tbody></table>
- </div>
效果如圖4所示
圖4 不確定寬度的塊級元素的水平居中
方法一演示了有一個分頁,三個分頁和五個分頁的情況下,分頁模塊都能居中的示例。
ul標簽是整個分頁模塊的根元素,它包含的li數量不確定,所以ul本身的寬度也沒辦法確定,不能通過設置固定寬度,
margin-left:auto和margin-right:auto來實現居中。這里用到了一個有趣的標簽
table來幫助實現了不確定寬度的塊級元素的水平居中,table有趣的地方在於它本身並不是塊級元素,如果不給它設定寬度的話,它的寬度由內部元素的寬度“撐起”,但即使不設定它的寬度,僅設置
margin-left:auto和margin-right:auto就可以實現水平居中!將
ul包含在table標簽內,對table設置margin-left:auto和margin-right:auto 就可以使table水平居中,間接使ul實現了水平居中。
這種做法很巧妙,但缺點是增加了無語義標簽,加深了標簽的嵌套層數。
方法二如代碼清單4所示
代碼清單4 不確定寬度的塊級元素的水平居中方法二
- <style type="text/CSS">
- ul{list-style:none;margin:0;padding:0}
- .wrap{background:#000; width:500px; height:100px}
- .test{text-align:center;padding:5px;}
- .test li{display:inline;}
- .test a{padding:2px 6px;background:#316AC5;color:#fff;
- border:1px solid #316AC5;text-decoration:none;}
- .test a:hover{background:#fff;color:#316AC5}
- </style>
- <div class="wrap">
- <ul class="test">
- <li><a href="#">1</a></li>
- </ul>
- <ul class="test">
- <li><a href="#">1</a></li>
- <li><a href="#">2</a></li>
- <li><a href-"#">3</a></li>
- </ul>
- <ul class="test">
- <li><a href="#">1</a></li>
- <li><a href="#">2</a></li>
- <li><a href="#">3</a></li>
- <li><a href="#">4</a></li>
- <li><a href="#">5</a></li>
- </ul>
- </div>
效果如圖
4所示。
方法二換了種思路
,改變塊級元素的display為inline類型,然后使用text-align:center來實現居中。相較於方法一,它的好處是不用增加無語義標簽,簡化了標簽的嵌套深度,但它也存在一定問題:它將塊級元素的
display類型改為inline,變成了行內元素,而行內元素比起塊級元素缺少一些功能,比如設定長寬值,在某些特殊需求的CSS設置中,這種方法可能會帶來一些限制。
方法三如代碼清單5所示
代碼清單5 不確定寬度的塊級元素的水平居中方法三
- <style type="text/CSS">
- ul{list-style:none; margin:0; padding:0}
- .wrap{background:#000; width:500px; height:100px}
- .test{clear:both; padding-top:5px; float:left; position:relative; left:50%;}
- .test li{float:left; display:inline; margin-right:5px; position:relative; left:-50%;}
- .test a{float:left; width:20px; height:20px;
- text-align:center; line- height:20px;
- background:#316AC5; color:#fff;
- border:1px solid #316AC5; text-decoration:none;}
- .test a:hover{background:#fff; color:#316AC5}
- </style>
- <div class="wrap">
- <ul class="test">
- <li><a href="#">1</a></li>
- </ul>
- <ul class="test">
- <li><a href="#">1</a></li>
- <li><a href="#">2</a></li>
- <li><a href="#">3</a></li>
- </ul>
- <ul class="test">
- <li><a href="#">1</a></li>
- <li><a href="#">2</a></li>
- <li><a href="#">3</a></li>
- <li><a href="#">4</a></li>
- <li><a href="#">5</a></li>
- </ul>
- </div>
效果如圖
4所示
方法三通過給父元素設置
float,然后父元素設置position:relative和left:50%,子元素設置position:relative和left:-50%來實現水平居中。它可以保留塊級元素仍以display:block的形式顯示,而且不會添加無語義標簽,不增加嵌套深度,但它的缺點是設置了position:relative,帶來了一定的副作用。
這三種方法使用得都非常廣泛,各有優缺點,具體選用哪種方式可以視具體情況而定。
2.豎直居中
(1)父元素高度不確定的文本、圖片、塊級元素的豎直居中
父元素高度不確定的文本、圖片、塊級元素的豎直居中是通過給父容器設置相同上下邊距實現的,如代碼清單6
所示。
代碼清單6 父元素高度不確定的文本、圖片、塊級元素的豎直居中
- <style type="text/CSS">
- .wrap{background:#000; width:500px;
- color:#fff; margin-bottom:10px;
- padding-top:20px; padding-bottom:20px}
- .test{width:200px;height:50px;background:red;}
- </style>
- <div class="wrap">hello world</div>
- <div class="wrap"><img src="54.gif" /></div>
- <div class="wrap"><div class="test"></div></div>
效
果如圖5,圖6,圖7所示。
圖5 文本垂直居中
圖6 圖片垂直居中
圖7 塊級元素垂直居中
(2)父元素高度確定的單行文本的豎直居中
父元素高度確定的單行文本的豎直居中,是通過給父元素設置
line-height來實現的,
line-height值和父元素的高度值相同,如代碼清單7所示。
代碼清單7 父元素高度確定的單行文本的豎直居中
- <style type-"text/CSS">
- .wrap{background:#000; width:500px; color:#fff;height:100px;line- height:100px;}
- </style>
- <div class="wrap">hello world</div>
效果如圖8
所示。
圖8 父元素高度確定的單行文本的豎直居中
(3)父元素高度確定的多行文本、圖片、塊級元素的豎直居中
父元素高度確定的多行文本、圖片、塊級元素的豎直居中有兩種方法。
方法一:說到豎直居中,
CSS中有一個用於豎直居中的屬性vertical-align,但只有 當父元素為
td或者th時,這個vertical-align屬性才會生效,對於其他塊級元素,例如 div、
p等,默認情況下是不支持vertical-align屬性的。在
Firefox和IE 8 下,可以設置塊級元素的
display類型為table-cell,激活vertical-align屬性,但
IE 6和IE 7並不支持display:table-cell,所以這種方法沒辦法跨瀏覽器兼容
。但我們可以使用最原始的笨方法來實現兼容——既然不支持塊級元素設置為
display:table-cell來模擬表格,那么,我們就直接使用表格好了。如代碼清單8
所示。其效果如圖5,圖6,圖7所示。
代碼清單8 父元素高度確定的多行文本、圖片、塊級元素的豎直居中方法一
- <style type="text/CSS">
- .wrap{background:#000; width:500px; color:#fff;height:100px}
- .test{width:200px;height:50px;background:red;}
- </style>
- <table><tbody><tr><td class="wrap">
- hello world<br />
- hello world<br />
- hello world
- </td></tr></tbody></table>
- <table><tbody><tr><td class="wrap">
- <img src="54.gif" />
- </td></tr></tbody></table>
- <table><tbody><tr><td class="wrap">
- <div class="test"></div>
- </td></tr></tbody></table>
因為
td標簽默認情況下就隱式地設置了vertical-align的值為
middle,所以我們不需要再顯式地設置一遍。
方法一可以很好地實現豎直居中效果,且不會帶來任何樣式上的副作用,但它添加了無語義標簽,並增加了嵌套深度。
方法二
:對支持display:table-cell的IE 8和Firefox用display:table-cell和vertical- align:middle來實現居中,對不支持display:table-cell的IE 6和IE 7,使用特定格式的hack,如代碼清單9所示。其效果如圖5,圖6,圖7所示。
代碼清單9 父元素高度確定的多行文本、圖片、塊級元素的豎直居中方法二
- <style type="text/CSS">
- .mblO{margin-bottom:10px}
- .wrap{background:#000; width:500px; color:#fff;margin-bottom:10px;height:100px;
- display:table-cell;vertical-align:iddle;
- *position:relative}
- .test{width:200px;height:50px;background:red}
- .verticalWrap{*position:absolute;*top:50%}
- .vertical{*position:relative;*top:-50%}
- </style>
- <div class="mblO">
- <div class="wrap">
- <div class="verticalWrap''>
- <div class="vertical">
- hello world<br />
- hello world<br />
- hello world
- </div>
- </div>
- </div>
- </div>
- <div class="mblO">
- <div class="wrap">
- <div class="verticalWrap">
- <img src="54.gif" class="vertical" />
- </div>
- </div>
- </div>
- <div class="mb10">
- <div class="wrap">
- <div class="verticalWrap" >
- <div class="test vertical"></div>
- </div>
- </div>
- </div>
方法二
.利用hack技術區別對待Fire fox、IE 8和IE 6、IE 7,在不支持display:table- cell的IE 6和IE 7 F,通過給父子兩層元素分別設置top:50%和top:-50%來實現居中。這種方法的好處是沒有增加額外的標簽,但它的缺點也很明顯,一方而它使用了hack.不利於維護,另一方面,它需要設置position:relative和position:absolute,帶來了副作用。