【问题标题】:Vertical centering working in almost every browser, but not in IE7垂直居中几乎适用于所有浏览器,但不适用于 IE7
【发布时间】:2011-08-25 00:33:05
【问题描述】:

这实际上是关于我的简单页面的两部分问题(有一天将被真实内容取代),用于垂直居中的 HTML+CSS 样板和 IE7

http://engitize.net/

  1. 谁能提供详细解释为什么页面在非 IE 浏览器(Chrome、Fx、Opera)中正确显示,几乎都是最近的 IE(IE5.5、IE6、IE8、IE9),但不是IE7?

    我特别感兴趣:它在 IE6 中可以工作,但在 IE7 中却不能工作,因为……有点解释。

  2. 要使div#c 在 IE7 中正确垂直居中,应该进行哪些更改?
    我正在为div#c 使用特定的高度,但使用的样板与高度无关,修复应该保留此功能。

    破坏其他浏览器不是一种选择,除非它是 IE5.5(好吧,IE6 也是,但前提是它确实是不可避免的)。

    也不接受更改 <!DOCTYPE html> 并将 IE 转换为 quirks 模式(这对于新开发的页面来说是一种非常糟糕的做法)。

如果你没有IE7(和我一样),你可以访问http://ipinfo.info/netrenderer/http://browserling.com/,在那里粘贴URL并选择IE7自己查看问题。


因为页面在接受某些答案后会发生变化,所以我提供了其中相关 HTML 和 CSS 部分的快照(徽标 URL 已更改为绝对 URL)。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
html, body { height: 100%; }
body { background-color: #fff; color: #000; margin: 0px; padding: 0px; }
div { margin: 0px; padding: 0px; }
#outer { position: relative; width: 100%; height: 100%; overflow: visible; }
#outer[id] { display: table; position: static; }
#middle { position: absolute; top: 50%; width: 100%; text-align: center; } /* for explorer only*/
#middle[id] { display: table-cell; vertical-align: middle; position: static; }
#c { position: relative; top: -50%; } /* for explorer only */
#c { width: 385px; height: 120px; margin-left: auto; margin-right: auto; }
#c { background-image: url(http://engitize.net/engitize.png); background-repeat: no-repeat; background-position: center top; }
#c div { position: relative; top: 100px; width: 100%; color: #666; font-weight: bold; font-family: serif; font-size: 12px; text-align: right; }
#footer { width: 100%; text-align: center; height: 15px; padding: 5px 0 0 0; margin: -20px auto 0 auto; border: 0; background-color: #def; } 
#footer div { padding: 0px 5px 0px 5px; text-align: right; font-size: 10px; font-family: sans-serif; }
a { text-decoration: none; color: #006; }
a:hover { color: #00c; }
p { margin: 0px; padding: 0px; }
</style> 
</head>
<body>
<div id="outer"><div id="middle"><div id="c"><div> 
because history is important!
</div></div></div></div> 
<div id="footer"><div> 
<p style="float:left;"><strong>Przemysław Pawełczyk</strong>'s imprint | Coming in 2012!</p> 
<p style="float:right;"><a href="http://przemoc.net/">Przemoc's network</a></p> 
</div></div>
</body>
</html>

【问题讨论】:

  • 如果有机会,我会看看您的更新/赏金问题。之前的调查似乎毫无意义。不过只有一件事 - 你应该忘记曾经存在过的 IE5(.5)。请参阅:en.wikipedia.org/wiki/… - 没有人 使用它。
  • @thirtydot 可以,没必要支持IE5.5(我一开始就说里面的破坏页是可以接受的,所以不知道你为什么要带它来),但是当事情“顺便说一句”在那里工作时,这很好。 :) 不幸的是 IE6 还没有死。

标签: css internet-explorer-7 vertical-alignment centering


【解决方案1】:

您的 Q#1 一直是answered by @thirtydot,IE7 及以下不支持 CSS 表格属性,因此必须为它们找到另一种方法。并且他的绝对定位技术通常是执行此操作的首选方法,因为大多数时候在这样的场景(启动页?)中,居中内容的宽度和高度是已知的。

上面每个 cmets 的附录: 为了回答为什么它在 IE6 而不是 IE7 中工作,即使 IE6 也不支持表格属性,IE7 实际上是从 #middle[id] {} 规则中选择了 position: static 规则 - IE7 确实理解这种类型的选择器所以这个意味着后来的绝对/相对定位与在 IE6 中的工作方式不同

考虑到上述情况,重做 CSS 以确保 IE7 和 6 获得相同的 CSS,并且稍后将其放置在级联中以覆盖“好”的 CSS,结果证明定位方法也与高度无关,在cmets 有各种链接可以对此进行测试,但这是最终的工作版本:

混合表格单元格/定位方法:here

该小提琴确实包括图像宽度和高度,但如果您删除它们并且“子文本”的定位它确实(或应该)表明中间的任何东西都保持居中

HTML 使用与此答案的底部相同。减去额外的&lt;i&gt;&lt;/i&gt; 元素

CSS:

html, body { height: 100%; margin: 0; padding: 0;}
body { background-color: #fff; color: #000;  }

#outer {
    position: relative;
    width: 100%;
    height: 100%;
    display: table;
}

#middle { 
    display: table-cell; 
    vertical-align: middle;
    text-align: center;
}

#c {
    width: 385px;
    height: 120px;
    margin: 0 auto;
    background: url(http://engitize.net/engitize.png) no-repeat 50% 50%;
}

/**** for IE7 and below ****/
/* hacks but there is another method below */
#middle {
  *position: absolute;
  *top: 50%;
  *width: 100%;
  *text-align: center;
  }

#c {
  *position: relative;
  *top: -50%;
}

/**** end IE7 and below rules ****/


#c div {
    position: relative;
    top: 100px;
    width: 100%;
    color: #666;
    font-weight: bold;
    font-family: serif;
    font-size: 12px;
    text-align: right;
}

#footer {
    width: 100%;
    text-align: center;
    height: 15px;
    padding: 5px 0 0 0;
    margin: -20px auto 0 auto;
    border: 0;
    background-color: #def;
}
#footer div {
    padding: 0px 5px 0px 5px;
    text-align: right; font-size: 10px;
    font-family: sans-serif;
}
#footer p {margin: 0;}

正如 cmets 中所指出的,使用 HTML5 样板用于有条件地对 HTML 元素进行分类的技术参见:

Conditional stylesheets vs CSS hacks? Answer: Neither!

意味着您可以将 IE7 hack 替换为:

.ie6 #middle, .ie7 #middle {
  position: absolute;
  top: 50%;
  width: 100%;
  text-align: center;
}

.ie6 #c, .ie7 #c {
  position: relative;
  top: -50%;
}

原始替代品 - “火柴技术”

您可以通过条件 cmets 或 hack 将以下技术与“table-cell”技术混合使用,但就我的测试而言,这种(hacky!)技术适用于浏览器

正如您所要求的高度不可知论版本..您可能喜欢也可能不喜欢“火柴棍”技术,这涉及使用内联块并将它们排列起来..“火柴棍”是 100% 高空的,关闭页面,其垂直对齐设置为“中间”的内联块元素,一旦它就位,下一个内联块(您的实际内容 div)位于它旁边并对齐到中间或它,然后在它上面使用 text-align: center;也有水平居中

这里是一个工作的example fiddle 的链接

注意:我已将您的宽度保持不变,但您可以通过删除 #c 的高度和宽度并删除 #c div 文本 div 的 CSS 来测试没有宽度/高度 - 在纯文本场景中输入将文本放入这些 div 中的任何一个都应“自动”居中。

特别注意在外部 div 中插入额外的&lt;i&gt;&lt;/i&gt; HTML(这可能是为什么这不是首选方法的原因!),这是支撑整个页面打开的“火柴棒”。

小提琴中使用的代码:

html, body { height: 100%; margin: 0; padding: 0; }
body { background-color: #fff; color: #000; }

#outer { position: relative; width: 100%; height: 100%;}

/* a matchstick spacer */
#outer i {
 display: inline-block; 
 height: 100%; 
 width: 1px; 
 margin-left: -1px; /* to hide off page */
 margin-right: -4px; /* to remove spacing between this and #middle block */
 vertical-align: middle; /* will make inline block next to it center vertically */
 background: #f00; /* red, not required just to see or not see it */
 }

#middle { 
  display: inline-block;
  width: 100%;
  text-align: center;
  vertical-align: middle;
} 

/* image 385 * 120 */
#c { 
  display: inline-block;
  /* presuming image heights, but it wouldn't matter if there was width/height here or not */
  width: 385px; 
  height: 120px; 
  background: url(http://engitize.net/engitize.png) no-repeat 50% 50%; 
}

#middle, #c { /* IE hack for inline block on block level elements */
 *display: inline; 
}


#c div { position: relative; top: 100px; width: 100%; color: #666; font-weight: bold; font-family: serif; font-size: 12px; text-align: right; }

#footer { width: 100%; text-align: center; height: 15px; padding: 5px 0 0 0; margin: -20px auto 0 auto; border: 0; background-color: #def; } 
#footer div { padding: 0px 5px 0px 5px; text-align: right; font-size: 10px; font-family: sans-serif; }

a { text-decoration: none; color: #006; }
a:hover { color: #00c; }
p { margin: 0px; padding: 0px; }

HTML:

<div id="outer">
  <i></i>
  <div id="middle">
      <div id="c"><div>
        because history is important!
      </div></div>
  </div>
</div>

<div id="footer">
  <div>
   <p style="float:left;"><strong>Przemys?aw Pawe?czyk</strong>'s imprint | Coming in 2012!</p>
   <p style="float:right;"><a href="http://przemoc.net/">Przemoc's network</a></p>
  </div>
</div>

【讨论】:

  • 即使它有点hacky,它也可以工作,并且不需要知道高度。 +1
  • +1,谢谢@clairesuzy。也许是hackish,但看起来很有趣。我稍后会仔细看看。我不完全接受@thirtydot 对 Q1 的简单回答,因为它适用于 IE6,它也不支持 CSS 表属性(正如我已经在评论中指出的那样)。 您能解释一下为什么它在 IE6 中有效,但在 IE7 中无效?
  • @przemoc : 是的.. IE7 可以读取您的middle[id](和outer[id])规则,并且只应该用于非 IE 浏览器的静态位置正在被拾取..我认为如果将两个版本正确分离为lte IE 7条件注释,我认为您的版本可以正常工作,因为IE8 +应该使用表属性..你想要条件还是固定破解版本..你的偏好
  • @prezemoc 继承了一个小提琴,使用您的原始方法与 CSS 正确分离(查看源代码以获取条件注释) - fiddle.jshell.net/clairesuzy/7S4Cb/1/show - 它似乎也与高度无关 :) 我承认我没有不认为会是.. 但是做测试,因为我只在 IE7 和 Quirks 模式下检查(“通常”是 IE6 的一个很好的指标
  • 再次感谢@clairesuzy。我通常不喜欢增加.css 文件的数量(这里的样式表在.html 文件中,因为它是一个简单的页面)。在你的新小提琴页脚被宠坏了。 :(
【解决方案2】:

IE7 does not support display: table-cell,您将其用作垂直居中技术的一部分。

你的页面比较简单,所以我对 HTML/CSS 做了很多简化。现在,在我测试过的任何地方,居中都可以正常工作。

完整代码: http://jsbin.com/azuhe4

【讨论】:

  • 感谢您的注意,但 IE6 也是如此,但它在那里工作。
  • +1,您的简化很好(破坏 IE5.5 是可以接受的,正如我之前所说),但我仍然不知道为什么原始代码在 IE7 中不起作用以及它是如何工作的固定的。我对此很感兴趣,因为我使用的样板与内容高度无关。您的解决方案需要先验高度知识,这在我的特定页面示例中显然是已知的,但不是一般情况。
【解决方案3】:

导致此行为的行是...

position: static

...关于“#middle”CSS 规范。

如果我禁用该行,IE7 似乎(或多或少)在页面中间呈现徽标。

【讨论】:

  • 是的,虽然删除该行似乎搞砸了 IE8。我现在正在寻找一种适用于任何地方的修复方法。
  • 。删除它会在所有浏览器中将徽标不再位于页面中间。 engitize.net/index2.html
【解决方案4】:

这是&lt;!DOCTYPE&gt;

IE6 和 7 有点不稳定(反正我读过的就是这个)。

如果您执行以下操作,您会看到事情发生了 - 使用您的代码(无需编辑,保存几个边框以查看发生了什么)。

这就是我所做的:

  1. 删除了您的&lt;!DOCTYPE&gt;
  2. 添加到您的 DIV {} CSS 行 - border:1px dotted gray
  3. 在您的“外部”、“中间”和“c” div 中,a 抛出了一个内联 border-color 只是为了看看哪个是哪个。
  4. 点击刷新

然后粘贴&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;,然后再次点击刷新。在我看来很好。垂直居中,水平居中。

截至 2011 年 4 月 20 日,W3C 将 &lt;!DOCTYPE HTML&gt; 声明为“非标准”。当然,IE6/7 不知道那个标签是什么意思。 http://www.w3.org/QA/2002/04/valid-dtd-list.html

【讨论】:

  • 这不是一个好的解决方案。通过将 doctype 更改为此,您将 IE(和其他浏览器)置于 Quirks 模式。虽然对于此页面可能无关紧要,但故意使用 Quirks 模式(几乎)始终是个坏主意。您可以通过查看具有该文档类型的任何页面并点击(在 IE 中)F12 以调出开发人员工具来验证其是否为 Quirks 模式 - 它会显示“文档模式:Quirks 模式”。此处的文档类型也为 CTRL+F:http://hsivonen.iki.fi/doctype/。最后,&lt;!DOCTYPE HTML&gt; 可以在 IE6 和 IE7 上正常工作 - 它们将进入“标准模式”。
  • 感谢@Dawson 的努力,但正如@thirtydot 所解释的那样。我的意思是 DOCTYPE 在这里只是一个外观问题,但它绝对应该保持现在的样子。
【解决方案5】:

我为此找到了新的简单解决方案:

<style>

    .vam{vertical-align:middle;}

</style>

<div style="line-height:200px; border:1px solid #000000; height:200px; 
text-align:center;color:#FFFFFF; font-size:1px;">

    .<img src="her-banner.jpg" alt="" class="vam" />

</div>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-26
    • 2011-05-26
    • 2012-04-28
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多