从vertical-align谈起 关于纵向对其和垂直居中的整理

vertical-align谈起,介绍关于元素纵向对齐的解决办法,特别对于垂直居中的问题,介绍了一些方案。文章于2007年43月28日 发布在http://www.12px.net

惯例,首先是基础知识,来自于伟大的css2.0手册。

语法:
vertical-align : auto | baseline | sub | super | top | text-top | middle | bottom | text-bottom | length
取值:
auto :  CSS1 根据 layout-flow 属性的值对齐对象内容
baseline :  CSS1 默认值。将支持 valign 特性的对象的内容与基线对齐
sub :  CSS1 垂直对齐文本的下标
super :  CSS1 垂直对齐文本的上标
top :  CSS1 将支持 valign 特性的对象的内容对象顶端对齐
text-top :  CSS1 将支持 valign 特性的对象的文本与对象顶端对齐
middle :  CSS1 将支持 valign 特性的对象的内容与对象中部对齐
bottom :  CSS1 将支持 valign 特性的对象的内容与对象底端对齐
text-bottom :  CSS1 将支持 valign 特性的对象的文本与对象顶端对齐
length :  CSS2 由浮点数字和单位标识符组成的长度值 | 百分数。可为负数。定义由基线算起的偏移量。基线对于数值来说为0,对于百分数来说就是0%。请参阅 长度单位 。目前IE尚未实现此参数

说明:
设置或检索对象内容的垂直对其方式。
对于 currentStyle 对象而言此属性的默认值为 auto 。对于其他对象而言是 baseline 。
此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。
对应的脚本特性为 verticalAlign 。

我们需要注意的是,这个属性只能作用于内联元素。

什么是内联元素,可以在网络上看到各种定义和不同的理解。css对于html的元素分类有三种,block(块元素)、inline(内联元素),列表项元素(list-item).分别也对应了display属性的三个可选的值,(另外还有display:none、table等)。

内联元素(inline element)一般都是基于语义级(semantic)的基本元素。内联元素只能容纳文本或者其他内联元素,常见内联元素 a、em、span等。 当然还包含可替换的元素。例如图像和表单项,他们的特点是不强迫其它元素占据新行,自己也不必在新行上,内联元素可以作为其它任何元素的子元素

下面是一个不错的总结:
  需要说明的是:inline element的中文叫法,有多种内联元素、内嵌元素、行内元素、直进式元素。基本上没有统一的翻译,爱怎么叫怎么叫吧。另外提到内联元素,我们会想到有个display的属性是display:inline;这个属性能够修复著名的IE双倍浮动边界问题。

块级元素(block element)


  ◎ address - 地址
  ◎ blockquote - 块引用
  ◎ center - 举中对齐块
  ◎ dir - 目录列表
  ◎ div - 常用块级容易,也是css layout的主要标签
  ◎ dl - 定义列表
  ◎ fieldset - form控制组
  ◎ form - 交互表单
  ◎ h1 - 大标题
  ◎ h2 - 副标题
  ◎ h3 - 3级标题
  ◎ h4 - 4级标题
  ◎ h5 - 5级标题
  ◎ h6 - 6级标题
  ◎ hr - 水平分隔线
  ◎ isindex - input prompt
  ◎ menu - 菜单列表
  ◎ noframes - frames可选内容,(对于不支持frame的浏览器显示此区块内容
  ◎ noscript - 可选脚本内容(对于不支持script的浏览器显示此内容)
  ◎ ol - 排序表单
  ◎ p - 段落
  ◎ pre - 格式化文本
  ◎ table - 表格
  ◎ ul - 非排序列表

内联元素(inline element)

  ◎ a - 锚点◎ abbr - 缩写
  ◎ acronym - 首字
  ◎ b - 粗体(不推荐)
  ◎ bdo - bidi override
  ◎ big - 大字体
  ◎ br - 换行
  ◎ cite - 引用
  ◎ code - 计算机代码(在引用源码的时候需要)
  ◎ dfn - 定义字段
  ◎ em - 强调
  ◎ font - 字体设定(不推荐)
  ◎ i - 斜体
  ◎ img - 图片
  ◎ input - 输入框
  ◎ kbd - 定义键盘文本
  ◎ label - 表格标签
  ◎ q - 短引用
  ◎ s - 中划线(不推荐)
  ◎ samp - 定义范例计算机代码
  ◎ select - 项目选择
  ◎ small - 小字体文本
  ◎ span - 常用内联容器,定义文本内区块
  ◎ strike - 中划线
  ◎ strong - 粗体强调
  ◎ sub - 下标
  ◎ sup - 上标
  ◎ textarea - 多行文本输入框
  ◎ tt - 电传文本
  ◎ u - 下划线
  ◎ var - 定义变量

可变元素


  可变元素为根据上下文语境决定该元素为块元素或者内联元素。
  ◎ applet - java applet
  ◎ button - 按钮
  ◎ del - 删除文本
  ◎ iframe - inline frame
  ◎ ins - 插入的文本
  ◎ map - 图片区块(map)
  ◎ object - object对象
  ◎ script - 客户端脚本

 


 

回到vertical-align的问题。

vertical-align中的sub、super分别对应于上标和下标,将他们作用在一个span元素,常常很好用。这里要谈到的是一个非常关键的垂直居中的问题,

例如下面的例子

<p>
<input type="text" name="author" id="author" style="vertical-align:middle" />
<label for="author"><small>呢称</small></label>
</p>

非常简洁的解决了input和文字居中的问题,不过对于不是内联元素的元素,如果仅仅使用vertical-ali是不能解决这个问题的。下面摘录一些解决办法.

一、单行内容的居中
只考虑单行是最简单的,无论是否给容器固定高度,只要给容器设置 line-height 和 height,并使两值相等,再加上 over-flow: hidden 就可以了
.middle-demo-1{
height: 4em;
line-height: 4em;
overflow: hidden;
}

优点:
1. 同时支持块级和内联极元素
2. 支持所有浏览器
缺点:
1. 只能显示一行
2. IE中不支持<img>等的居中
要注意的是:
1. 使用相对高度定义你的 height 和 line-height
2. 不想毁了你的布局的话,overflow: hidden 一定要


二、多行内容居中,且容器高度可变
也很简单,给出一致的 padding-bottom 和 padding-top 就行
.middle-demo-2{
padding-top: 24px;
padding-bottom: 24px;
}

优点:
1. 同时支持块级和内联极元素
2. 支持非文本内容
3. 支持所有浏览器
缺点:
容器不能固定高度

三、把容器当作表格单元
CSS 提供一系列diplay属性值,包括 display: table, display: table-row, display: table-cell 等,能把元素当作表格单元来显示。这是再加上 vertical-align: middle, 就和表格中的 valign="center" 一样了。
.middle-demo-3{
display: table-cell;
height: 300px;
vertical-align: middle;
}

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

优点:
不用说了吧,就是表格,效果和表格一模一样
缺点:
IE下无效

四、以毒攻毒!用 IE 的 bug 解决 IE 中的绝对居中
先不得不说一句,IE 真的是个很烂的浏览器,CSS1中的定义都不支持,害得要我们转个大圈子来造居中。不过就像我说的,凡是 table 布局可以实现的,CSS 一定可以实现,即使在 IE 里也不例外。我研究 IE layout 模式多年,还是找出了一个可以在 IE 中绝对居中的方法。这个方法就是基于 IE layout 的 bug,也可以算以毒攻毒。至于原理,不要问我,这是独门秘学,何况三言两语也讲不清楚,只要好用就行
.middle-demo-4{
height: 300px;
position: relative;
}
.middle-demo-4 div{
position: absolute;
top: 50%;
left: 0;
}
.middle-demo-4 div div{
position: relative;
top: -50%;
left: 0;
}

五、整合三和四,写出支持所有浏览器的垂直居中容器!
思路是利用 IE 和 非IE 浏览器的 CSS hack, 整合三和四的CSS,写出兼容主流浏览器的垂直居中容器。具体代码就不给出了,大家权当作练习练习。例子可以在下面的附录中找到。
最终实测支持的浏览器:IE6+, Mozilla 1.7, Netscape Navigator 8, Opera 8.0+, Firefox 1.0+ 和 Safari 1.0+IE5 下需要加上对合适模型的补正。
推测支持的浏览器:Mozilla 1.5+, Netscape Navigator 7+, Opera 7+
未测试浏览器:Konqueror

如果懂英文的话,去下面的位置看看,收货肯定很大。http://www.student.oulu.fi/~laurirai/www/css/middle/ 文章介绍的是关于ie6、opera和ff下面垂直居中的方法。

相关文章

xhtml元素水平居中方案总结

一个很不错的方案集合。提到了一些将元素水平居中的办法。其中最后一种很巧妙,很多人在用,不过我是第一次知道。