【问题标题】:Why does height 100% work when DOCTYPE is removed?为什么删除 DOCTYPE 后高度 100% 有效?
【发布时间】:2015-08-25 21:10:50
【问题描述】:

这是完整的代码:

<!DOCTYPE HTML>
<html>
<body style="height: 100%; padding: 0; margin: 0;">
    <div style="background-color: green; height: 100%; width: 100%"></div>
</body>
</html>

什么都没有出现。但是如果我删除第一行(doctype),所有页面都如预期的那样是绿色的。

我有两个问题:

  1. 如何使div 填满页面而不删除该标签?
  2. 为什么删除doctype 可以让它工作?

【问题讨论】:

    标签: css html doctype quirks-mode


    【解决方案1】:

    CSS height 属性、百分比值和 DOCTYPE

    您问题的第一部分询问如何将 100% 高度应用于您的 div,已被其他人多次回答。本质上,在根元素上声明一个高度:

    html { height: 100%; }
    

    完整的解释可以在这里找到:


    您问题的第二部分受到的关注要少得多。我会尽力回答。

    为什么删除 doctype 会使 [绿色背景] 起作用?

    当您删除 DOCTYPE (document type declaration) 时,浏览器会从 标准模式 切换到 怪癖模式

    quirks mode(也称为compatibility mode)中,浏览器模拟旧浏览器,因此它可以解析旧网页——在网络标准出现之前创作的页面。 quirks 模式下的浏览器会伪装成IE4IE5 and Navigator 4,因此它可以按照作者的意图呈现旧代码。

    Wikipedia 定义 quirks 模式的方式如下:

    在计算中,怪癖模式是指某些网络使用的一种技术 浏览器,以保持与 Web 的向后兼容性 为旧浏览器设计的页面,而不是严格遵守 标准模式下的 W3C 和 IETF 标准。

    这是MDN 的看法:

    在网络的旧时代,页面通常以两种形式编写 版本:一个用于 Netscape Navigator,一个用于 Microsoft Internet 探险家。当 W3C 制定 Web 标准时,浏览器无法 刚开始使用它们,因为这样做会破坏大多数现有网站 网络。浏览器因此引入了两种模式来处理新的 符合标准的网站不同于旧的旧网站。

    现在,您的代码中的 height: 100% 在怪癖模式下工作但在标准模式下不工作的具体原因如下:

    standards mode中,如果父元素有height: auto(未定义高度),那么子元素的百分比高度也将被视为height: autoas per the spec)。

    这就是为什么您的第一个问题的答案是html { height: 100%; }

    要使height: 100% 在您的div 中工作,您必须在父元素(more details) 上设置height

    然而,在 quirks 模式下,如果父元素具有 height: auto,则子元素的百分比高度相对于视口进行测量。

    以下是涵盖此行为的三个参考:


    TL;DR

    简而言之,以下是开发人员需要了解的内容:

    怪癖模式下的浏览器将以以下方式呈现网页 不可预测、不可靠且通常不受欢迎。所以总是包含一个 DOCTYPE 用于在standards mode 中呈现的文档。

    选择正确的 DOCTYPE 曾经是一个模棱两可的问题 与many DOCTYPE versions to choose from 混淆的过程。但 今天,这个过程和以往一样简单。只需使用:

    <!DOCTYPE html>
    

    【讨论】:

    • 我将this old question I answered 标记为这个的副本。你的遗愿清单上的另一个;)
    • 2021 年,老实说?怪癖模式从未给我带来意想不到的结果
    【解决方案2】:

    你的意思是垂直的? div 是块级元素,因此默认情况下它们会水平填充父级。

    为了使其工作,您还需要将 HTML 标记的高度设置为 100%。

    html, body { height:100%; }
    

    查看这里的工作示例:

    http://jsfiddle.net/uhg0y9tm/1/

    正如这里的其他一些人所说,一旦您删除了第一行(HTML5 文档类型),浏览器将以不同的方式呈现页面,在这种情况下,没有必要为 HTML 标记指定显式高度100%。

    【讨论】:

      【解决方案3】:

      使用 HTML5 文档类型,您还需要设置 html 元素的高度:

      html {
          height:100%;
      }
      

      【讨论】:

        【解决方案4】:

        您还必须将&lt;html&gt;&lt;body&gt; 标记的宽度和高度设置为100%,因为当您将&lt;div&gt; 的宽度和高度分配为100% 时,这意味着您正在分配它其父元素的完整宽度和高度,在这种情况下,&lt;div&gt; 的父元素是 &lt;body&gt;&lt;body&gt; 的父元素是 &lt;html&gt;

        为什么我删除&lt;!DOCTYPE html&gt;标签后它会起作用?

        因为当你删除&lt;!DOCTYPE html&gt;标签时,浏览器会以不同的方式呈现页面,显示其他结果。

        【讨论】:

        • 最后,一个有意义的解释。如果 html 和 body 元素不扩展以覆盖页面,那么它们包含的元素也不会。这是一个很好的答案。
        【解决方案5】:

        您需要将 html 和 body 标签高度设置为 100% 才能填满页面。

        css:

        html, body{
          height: 100%;
        }
        

        【讨论】:

          猜你喜欢
          • 2011-12-14
          • 1970-01-01
          • 2018-11-11
          • 2020-12-18
          • 2020-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多