Div+CSS布局居中

用CSS让元素居中显示并不是件很简单的事情—同样的合法CSS居中设置在不同浏览器中的表现行为却各有千秋。让我们先来看一下CSS中常见的几种让元素水平居中显示的方法。

一、使用自动外边距实现居中

  CSS中首选的让元素水平居中的方法就是使用margin属性—将元素的margin- left和margin-right属性设置为auto即可。在实际使用中,我们可以为这些需要居中的元素创建一个起容器作用的div。需要特别注意的一点就是,必须为该容器指定宽度:

Div+CSS布局居中

div#container {

margin-left: auto;

margin-right: auto;

168px;

}

  在大多数主流浏览器中,这种方法都非常有效,即使是Windows平台上的IE6,在其标准兼容模式(compliance mode)下也能够正常显示。但不幸的是,在更低版本的IE中,这种设置却并不能实现居中效果。所以若想在实际项目中使用这种方法,那么就要确保用户的IE浏览器版本不低于6.0。

  尽管在支持上不尽如人意,但大多数设计师都建议尽可能地使用这种方法。该方法也被认为是在各种用CSS实现元素水平居中方法中最正确、最合理的一种。

二、使用text-align实现居中

  另一种实现元素居中的方法是使用text-align属性,将该属性值设置为center并应用到body元素上即可。这种做法是彻头彻尾的hack,但它却能兼容大多数浏览器,所以在某些情况下也自然必不可少。

  之所以说它是hack,是因为这种方法并没有将文本属性应用到文本上,而是应用到了作为容器的元素上。这也给我们带来了额外的工作。在创建好布局必须的div之后,我们要按照如下代码为body应用text-align属性:

Div+CSS布局居中

body{

text-align:center;

}

  之后会出现什么问题吗?body的所有子孙元素都会被居中显示。

  因此,我们就需要用再写一条规则,让其中的文本回到默认的居左对齐:

Div+CSS布局居中 

p {

text-align:left;

}

  可以想象这条附加的规则将带来一些不便。另外,真正完全遵循标准的浏览器并不会改变容器的位置,而只会让其中的文字居中显示。

三、组合使用自动外边距和文本对齐

  因为文本对齐居中方式有着良好的向下兼容性,且自动外边距方式也被大多数当代浏览器支持,所以很多设计师将二者组合起来使用,以期让居中效果得到最大限度的跨浏览器支持:

Div+CSS布局居中 

body {

text-align: center;

}

Div+CSS布局居中 

#container {

margin-left: auto;

margin-right: auto;

border: 1px solid red;

168px;

text-align: left

}

  可是这始终是个hack,无论如何也算不上完美。我们还是需要为居中容器中的文本编写附加的规则,但至少在各个浏览器中看起来都不错。

四、负外边距解决方案

  负外边距解决方案远不是仅仅为元素添加负外边距这么简单。这种方法需要同时使用绝对定位和负外边距两种技巧。

  下面是该方案的具体实现方法。首先,创建一个包含居中元素的容器,然后将其绝对定位于相对页面左边边缘50%的位置。这样,该容器的左外边距将从页面50%宽度的位置开始算起。

  然后,将容器的左外边距值设置为负的容器宽度的一半。这样即可将该容器固定在页面水平方向的中点。

Div+CSS布局居中 

#container {

background: #ffc url(52css.jpg) repeat-y center;

position: absolute;

left: 50%;

760px;

margin-left: -380px;

}

  看,没有任何hack!虽然这并不是首选的解决方案,但也是个不错的方法,且适用性极广—甚至在Netscape Navigator 4.x中都没有任何问题,很令人吃惊,不是吗?所以若想得到最广泛的浏览器支持,那么这种方法将会是最好的选择。

垂直居中方法大集合

时间:2009-02-12 20:56来源:网络 作者:秩名 点击: 15次

  1. 单行文字在固定高度容器中垂直居中

这个最简单,只要让行间距 line-height 与容器高度 height 相等即可;

   1. #box { height: 120px; line-height: 120px; overflow: hidden }

2. 多行文字在未知高度容器中垂直居中

这个也很简单,将 padding-top 与 padding-bottom 设置成相同的值即可;

   1. #box2 { padding: 10px 0 }

3. 多行文字在固定高度容器中垂直居中(非 IE 浏览器)

   1. #box3_wrapper {

   2.    display: table;

   3.    height: 311px;

   4.    background: #eee

   5. }

   6. #box3 {

   7.    display: table-cell;

   8.    vertical-align: middle

   9. }

Html代码 复制代码

   1. <div id="box3_wrapper">

   2.    <div id="box3">

   3.         作者:shimano<br />

   4.         如何既给用户提供最大限度的编辑权限<br />

   5.         又能保证网页整体的规范和美观?<br />

   6.         真 TMD 难啊!

   7.    <div>

   8. </div>

注意:这其中有个关于字号的问题,在 XP 和 Vista 及 Mac 下即使设定了像素为单位的字号,文字大小也依旧不同,这个在我之前一个篇日志里也提到过,在 XP 下,12px 宋体是 11x11(px)的,在 Vista 下有些文字高 11px 有些高 12px,这也是为什么 Vista 下的宋体看起来比较奇怪,Mac 下默认就是平滑边缘的黑体,再有就是 safari 下平滑边缘的宋体,所以更不容易辨别。

如果细究,在不设定高度和行间距的容器中,12px 宋体文字上下边沿依旧会有 1px 到 2px 的间距,XP 的 IE6 下,字下沿有 3px ,字上沿为 0;Firefox 下,字上沿为 1px,下沿为2px;Vista 下,文字上下各 1px 间距(考虑同等高度文字);这可以理解为默认 line-height,在 这篇日志 中我也是遇到了同样的问题。

关于 IE6 下 line-height 的问题我在 这篇日志 中有提。

4. 多行文字在固定高度容器中垂直居中(IE 浏览器)

因为 IE 不支持将 div 显示为 table 及其同胞,所以我们要另想办法:

Css代码

   1. #box3_wrapper {

   2.    position: relative;

   3. }

   4. #box3_inner {

   5.    position: absolute;

   6.    top: 50%

   7. }

   8. #box3 {

   9.    position: relative;

  10.    top: -50%;

  11.    background: #eee

  12. }

Html代码

   1. <div id="box3_wrapper">

   2.    <div id="box3_inner">

   3.       <div id="box3">

   4.          这种方法<br />

   5.          在下面的未知高度 div 垂直居中<br />

   6.          也用到了

   7.       </div>

   8.    </div>

   9. </div>

下面有个权衡 IE 与 非 IE 浏览器浏览效果的实现方法,请继续看

5. 未知高度 div 的垂直居中

Css代码 复制代码

   1. #box4_wrapper {

   2.    height: 100%;

   3.    100%;

   4.    overflow: hidden;

   5.    position: relative

   6. }

   7. #box4_wrapper[id] {

   8.    display: table;

   9.    position: static

  10. }

  11. #box4_outer {

  12.    position: absolute;

  13.    top: 50%

  14. }

  15. #box4_outer[id] {

  16.    display: table-cell;

  17.    vertical-align: middle;

  18.    position: static

  19. }

  20. #box4_inner {

  21.    position: relative;

22.    top: -50%;
  23.    margin: 0 auto;
  24.    background: #eee
  25. }

Html代码

   1. <div id="box4_wrapper">
   2.    <div id="box4_outer">
   3.       <div id="box4_inner">
   4.          这是一种无 hack 的方式<br />
   5.          虽然环保,但是臃肿:(
   6.       </div>
   7.    </div>
   8. </div>

CSS2 选择符 #value[id] 相当于 #value,但是 IE 不支持这种类型的选择符,使用这种方式区分浏览器避免 hack:)

6. 未知尺寸图片(小与容器高度)在固定高度容器中垂直居中

   1. #box5 {
   2.    display: table-cell;
   3.    *display: block;
   4.    *font-size: 175px;
   5.    *font-family: Arial;
   6.    vertical-align: middle;
   7.    height: 200px;
   8.    200px
   9. }
  10. #box5 img {
  11.    vertical-align: middle
  12. }

Html代码 复制代码

   1. <div id="box5">
   2.    <img src="img/ctba.png" alt="扯谈社" />
   3. </div>

<div id="box5">
   <img src="img/ctba.png" alt="扯谈社" />
</div>

淘宝 UED 07 前端开发原题。解释下针对 IE 的 hack:在 IE 下,将字号设置为容器高度的 0.873(本例中即 200*0.873 = 175)图片便会垂直居中;字体设置为 Arial 主要防止非 utf-8 引起的 hack 失效问题,如 gbk 编码(摘自译飞的博客)

当然如果只是图片,在针对非 IE 浏览器时利用单行文字的垂直居中方法也可以。

原文地址:https://www.cnblogs.com/tangge/p/1935271.html