CSS垂直居中

上一篇 / 下一篇  2008-08-01 13:06:12 / 個人分類:WEB

)|][3B;Je mP0CSS 中要垂直居中,多数是在有高度的情况下,或者容器高度不定的情况下才用,看上去比较舒服,而且实现的方法也不少,不一定要拘泥于和 table 布局一样。若鄰博客{y D!u~g&lw

若鄰博客[;? _6_ i&^Q1s

首先,要有一个概念:凡是 table 布局可以实现的,CSS 一定可以实现。CSS 可以实现的,table 未必能做到。
FgoIvj0现在来几个例子:若鄰博客Yq1\N Q'WX.i
若鄰博客5Vg[/@Y-fw

若鄰博客d-pU0f `?G3k0~

一、单行内容的居中
)DG$b9Ia)C7u^ n9@0      只考虑单行是最简单的,无论是否给容器固定高度,只要给容器设置 line-heightheight,并使两值相等,再加上 over-flow: hidden 就可以了若鄰博客1?$S[T4E*TL
.middle-demo-1{若鄰博客:t1euRM
height: 4em;
r'R$Z8S$| z U0line-height: 4em;若鄰博客N:E1P:J z^
overflow: hidden;
&g lW+{ gg C0}

$t5\ qJ*X#U&s B0

:}-{vD Ee(wKv0优点:若鄰博客Lx^ N6pG E#}%^
1. 同时支持块级和内联极元素
-B1N6Vrv(uC2Z02. 支持所有浏览器若鄰博客`|"]b,f6?$U^
若鄰博客LO)mqZn A
缺点:
C5tuQ:^ I01. 只能显示一行
]$u2VP_&m*\02. IE中不支持<img>等的居中若鄰博客 k(vt&oo:q#r
若鄰博客n8|;W6VmR-G
要注意的是:若鄰博客,U9J ds*N2bH XCA
1. 使用相对高度定义你的 height 和 line-height
w8QswoUL02. 不想毁了你的布局的话,overflow: hidden 一定要若鄰博客(?;\z ff
为什么?若鄰博客 ]L/NMw LJ
请比较以下两个例子:
QmGz3?&j'DTl)b0CODE:
%|Lz.`.m}j0_8C&{0若鄰博客D@9yX+Fm j
<p style="background: #900; color: #00f; font: bold 12px/24px Helvertica,Arial,sans-serif; height:24px; width:370px;">Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>若鄰博客9e~Askd1_1l(@
<br/>
:Rv ^Z;FC}k$O B0<br/>若鄰博客t`l9S:[ U
<p style="background: #090; color: #00f; font: bold 12px/2em Helvertica,Arial,sans-serif; height:2em; width:370px; overflow: hidden;">Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</p>

:Co&smwD{Wa!s0若鄰博客v+U\!M%Qi
     上一个高度是用的绝对单位px,并且没有隐藏溢出,下一个高度用的单位是相对单位em,并且隐藏了溢出。如果你的浏览器支持放大字体,那么尽情地放大字体,看看会出现什么效果。

@$K2ZeiY0 若鄰博客V6D#N%palj3s

二、多行内容居中,且容器高度可变
Av3D O+G7le_0也很简单,给出一致的 padding-bottom 和 padding-top 就行

[\u0F"G d.Pb0

nM't1XR5[7~0.middle-demo-2{若鄰博客@\+g;Sj,K$v.Y
padding-top: 24px;
~#Q3b)bC%N0padding-bottom: 24px;
*`UF%Z6q E8B @J0}
若鄰博客|#pt$\ r-U

t\N%p9yb0优点:
pR BIS01. 同时支持块级和内联极元素若鄰博客5o5p8l&J7o ^
2. 支持非文本内容若鄰博客#o6D W+^K9L,Fk
3. 支持所有浏览器
*n1xjp??0o M0缺点:若鄰博客hn;]aK0[0_)V3r
容器不能固定高度

]qU;y r4~+d`~K0 若鄰博客9w/@3d)V[ Ti ^

三、把容器当作表格单元若鄰博客,D]y:pa;r/ci}.^ kF
      CSS 提供一系列diplay属性值,包括 display: table, display: table-row, display: table-cell 等,能把元素当作表格单元来显示。这是再加上 vertical-align: middle, 就和表格中的 valign="center" 一样了。

1^ Q(Q,b&oUg0

J vK7y9iw'FK0.middle-demo-3{若鄰博客Xm w:Wy,\H.u#o#L.}U
display: table-cell;若鄰博客X] P5}vV,Cd
height: 300px;
#mM'Q6]7~gx$r0vertical-align: middle;
g1Exd8j:f%_0m0}
若鄰博客 ]m i;aC}w

若鄰博客za#q,wHm

可惜IE不支持这些属性,不过在其他浏览器上显示效果非常完美。若鄰博客"r j3Cyw%O4?
要注意的是:和一个合法的<td>元素必须在<table>里一样,display: table-cell 元素必须作为 display: table 的元素的子孙出现。

/ed7Qx'w&I'^p$_0

zSz ZBt"T0优点:若鄰博客vh9QnI1fy
不用说了吧,就是表格,效果和表格一模一样
8CV-Jl vUU0缺点:
,bKn C*T&R0IE下无效若鄰博客]n_K(xw5LE

7X;Z~3\)j:GJI0四、以毒攻毒!用 IE 的 bug 解决 IE 中的绝对居中
G,{1WC4pc2M,CPQ$e J0     先不得不说一句,IE 真的是个很烂的浏览器,CSS1中的定义都不支持,害得要我们转个大圈子来造居中。不过就像我说的,凡是 table 布局可以实现的,CSS 一定可以实现,即使在 IE 里也不例外。我研究 IE layout 模式多年,还是找出了一个可以在 IE 中绝对居中的方法。这个方法就是基于 IE layout 的 bug,也可以算以毒攻毒。至于原理,不要问我,这是独门秘学,何况三言两语也讲不清楚,只要好用就行若鄰博客qrJ4Zf1u?os%Lz

若鄰博客)YAU)w}NuS^

.middle-demo-4{
6YF h(v!PP o0X0height: 300px;若鄰博客!Ee }0n SBac'F
position: relative;
BD&H8Z"j0}
|t)y4H9G5|Bk E K0.middle-demo-4 div{
-R B c6Kv6JP0position: absolute;
2Qn+`h:Lx)w0top: 50%;若鄰博客[8Y5x E7t#KH#r
left: 0;若鄰博客ZN%Qp ~)_Der R(BG4|
}若鄰博客M)N8H {fp8WUf
.middle-demo-4 div div{
a)| S@]zn-u;|N0position: relative;
;Y1TW a@j3Z'|0top: -50%;若鄰博客b*k?X+Kn} I
left: 0;
9z!dC(zY5vw9{0}

;GP4vH {)Te0 若鄰博客:|8Q7sB3p!|V

、整合三和四,写出支持所有浏览器的垂直居中容器!
&W:KA"p;T({0     思路是利用 IE 和 非IE 浏览器的 CSS hack, 整合三和四的CSS,写出兼容主流浏览器的垂直居中容器。具体代码就不给出了,大家权当作练习练习。例子可以在下面的附录中找到。若鄰博客2~0D]D"{#_
最终实测支持的浏览器:IE6+, Mozilla 1.7, Netscape Navigator 8, Opera 8.0+, Firefox 1.0+ 和 Safari 1.0+IE5 下需要加上对合适模型的补正。
~{~%\s3?H0推测支持的浏览器:Mozilla 1.5+, Netscape Navigator 7+, Opera 7+若鄰博客:Z jtCs:[
未测试浏览器:Konqueror

CF+y ^4AK4p0

TAG: css web2

 

評分:0

我來說兩句

顯示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的欄目

日曆

« 2008-12-02  
 123456
78910111213
14151617181920
21222324252627
28293031   

數據統計

  • 訪問量: 486
  • 日誌數: 40
  • 建立時間: 2008-04-02
  • 更新時間: 2008-08-01

RSS訂閱

Open Toolbar