代码之家  ›  专栏  ›  技术社区  ›  Peter O'Callaghan

浏览器呈现严格/过渡doctypes之间的差异

  •  5
  • Peter O'Callaghan  · 技术社区  · 14 年前

    一段时间前,我遇到了一个“问题”,我从来没有找到问题的根源。希望有人能照亮它。当我将doctype从strict更改为transitional时,是什么导致某些浏览器(chrome、opera和safari)呈现页面的方式不同?我知道这种情况的一般原因是触发了奇怪的模式,但是两个文件的XHTML和CSS都是根据W3C验证器进行验证的。

    我只能假设这些浏览器对这两个doctypes使用不同的内部样式表,但不知道它们为什么会这样做。我只是希望有人能证实这是为什么。

    可以看到的区别是“标题图像”底部和菜单栏边框之间的空间。在上述浏览器中,使用过渡doctype时两者之间没有间隙,但使用strict时(在ie和ff中,两者都存在间隙)。我最终得出结论 display:block 到img标签停止所有情况下出现的差距(这是我的目标)。

    transitional example , strict example

    3 回复  |  直到 14 年前
        1
  •  6
  •   Peter O'Callaghan    14 年前

    默认情况下,在“严格”模式下,图像显示为内联元素。内联元素在底部有一个空间来解释下行字符,如g或q。由于图像不会有任何下行字符,这被认为是奇怪的行为,导致引入了“几乎严格”模式。在“几乎严格”模式下,所有img标记都呈现为 display: block 而不是内联。可以找到更多详细信息 here .

    最后一个难题是,所有现代浏览器都在“严格”模式下呈现具有严格doctype的页面,在“几乎严格”模式下呈现具有过渡doctype的页面。可以找到更多详细信息 here .

    非常感谢摩西和莱利,他们提供的一些信息帮助我找到了答案。

        2
  •  1
  •   Riley    14 年前

    我自己并不真正理解这个怪癖。我认为这与空白有关。在怪癖模式下,空白更容易被原谅。但是,在标准中,空白可能会导致问题。

    例如,在您的示例中,您有一个漂亮的、易于阅读的源代码。删除容器和元素之间的空白和换行符将允许您消除某些浏览器中的空白(我相信是FF)。要在IE中修复它,您需要将行高:0;添加到图像的包含元素(在本例中是包含锚或链接标记)。

    您还应注意,如果您完全关心IE6,则在呈现时,如果您的每个<li>都位于自己的行中,则会在每个列表项之间添加额外的行。

        3
  •  1
  •   Moses    14 年前

    严格的和过渡的教义类型之间只有一些区别,没有一个能真正解释这一点。(注意,我只安装了FF,IE,所以看不到错误本身)。

    至于导致这种情况发生的原因,可能是浏览器在不同的渲染模式下有不同的样式表。但是,我认为这实际上是因为浏览器采用了不同的方法来呈现每种模式的页面:严格/转换/怪癖/帧。虽然strict和trans之间唯一有文档记录的区别是如何处理表中的内联图像,但是浏览器不必遵守W3C规范,可以做任何他们真正想要做的事情,而且这往往会导致像您刚刚发现的那样的错误。