【问题标题】:Border around 100% body height and width (HTML 4.01 Strict)边框约 100% 身体高度和宽度(HTML 4.01 Strict)
【发布时间】:2010-10-27 13:45:34
【问题描述】:

好吧,这让我快疯了。

我想在我的文档周围设置一个边框。它应该很好地围绕整个窗口/视口。所以我定义:

body {
  border: 1px solid red;
}

当我的文档处于 quirks 模式时,它可以正常工作。至少在 IE 中,这是我的主要目标。我页面的边缘出现了一个红色边框,显然是因为预定义的 CSS 将 bodyhtml 设置为填充屏幕。

当通过设置 HTML 4.01 严格 DOCTYPE 进入标准模式时,bodyhtml 折叠到内容的真实(较小)大小,边框从中间绘制的屏幕。所以我定义:

body, html {
  padding: 0px;
  margin: 0px;
  border: 0px none;
  width: 100%;
  height: 100%;
}

body {
  border: 1px solid red;
}

我得到了 — 滚动条,正好滚动 一个像素 以显示底部/右侧边框。但是,我希望该边框立即可见。

有没有什么废话(比如“height: 99.9%;”、“overflow: hidden;”或“switch back to quirks mode”)的方法来获得 100% 的边框,而没有不必要的滚动条? IE-only 很好,当然跨浏览器会更好。

【问题讨论】:

  • IE-only 用于 Intranet 应用程序?唯一可以获得 100% 非 IE 用户的地方?疯狂的! :)
  • 企业环境和 Firefox 是互斥的。至少 99% 的时间。在 Mozilla 最终得到它之前,手动 NTLM 身份验证(或在每个客户端上摆弄 about:config)真的无法解决问题,这将保持这种状态。
  • 远程配置。 wetdog.sourceforge.net
  • 正如 Tomalak 所说,Firefox 一直存在很多打印问题,大多数公司也都回避它。让开发人员做一些扭曲是一回事。让最终用户无法按照自己喜欢的方式工作是另一回事。

标签: html css internet-explorer


【解决方案1】:

在 CSS3 为我们提供内部边框和框模型切换之前,您需要两个 div。第一个提供 100% 高度,第二个提供边框。否则边框在 100% 高度之外(即 1px+100%+1px)

顺便说一句。在进入“仅限 IE”之前,您应该收集一些统计信息。 IE 没有它曾经拥有的市场份额。 10% - 30% 的用户可能使用其他浏览器。

【讨论】:

  • 这是一个 Intranet 应用程序。可以肯定地说它只是 IE。 ;-)
【解决方案2】:

尝试为 html 元素设置边框。 body 元素只有它需要的高度,但据我记得,html 元素占据了整个空间(这也是你应该设置背景的地方)。

我不确定边框的外观,我通常只设置背景。

【讨论】:

  • 不工作,同样的问题。当文档处于标准模式时,HTML 元素也只有所需的高度/宽度。
【解决方案3】:

边框超出 100% 大小。试试padding: -1pxmargin: -1px

【讨论】:

  • 负边距将边框拉出文档,在 CSS 规范中内边距必须为正。
【解决方案4】:

这是一个仅使用 html 和 body 元素的简单解决方案(不需要嵌套的 div)。它利用了 HTML 元素的特殊行为(它不能有外边框,所以必须缩小才能显示)。

<html>
<head>
<style>
html {padding:0; margin:0; border:5px solid red;}
body {height:100%; padding:0; margin:0; border:0;}
</style>
</head>

<body>

</body>
</html>

【讨论】:

  • 不错。在这方面,我不知道 HTML 元素的“特殊属性”。很高兴知道。
  • 不过,它似乎无法在标准模式下工作。 html 高度再次折叠,将其设置为 100% 会导致垂直滚动条。
  • 您必须使用 Internet Exploiter。它适用于 FF 上的 4.01 Strict,因此您可能会看到浏览器错误。
【解决方案5】:

你会喜欢这个的。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>

<style>
html {
    height: 100%;
    width: 100%;
    display: table;
}
body {
    display: table-row;
}
#wrapper {
    display: table-cell;
    border: 5px solid red;
}
</style>
</head>

<body>
    <div id="wrapper"></div>
</body>
</html>

http://www.test.dev.arc.net.au/100-percent-border.html

我认为,即使在标准模式下,表格也会保留很多“古怪”的行为,它们可能是解决方案。不过,将 HTML 元素转换为表格非常有趣。

在将其标记为在 IE6 中不工作之前,请考虑这是一个需要解决的非常微不足道的问题。重点是使用表格绘制算法是解决方案,纯CSS方案也是可以的:

<table class="outer"><tr><td class="inner"> ...page content...

【讨论】:

  • 页面上唯一有效的解决方案,它被标记了??什么鬼?
  • 嗯.. 猜是因为它在 IE6 中不起作用?但这就是 IE7-js 的用途。
  • 在一定程度上有效。如果您有多个相对定位的 div,无论出于何种原因,第一个 div 将占用大部分空间,而其他每个 div 只会占用屏幕的一小部分,而不是每个页面占用一整页:/为什么这?!?!?!
【解决方案6】:

正如 SpliFF 已经提到的,问题是因为默认 (W3C) box model 是“内容框”,这导致边界在 widthheight 之外。但是您希望它们在您指定的 100% 宽度和高度内。一种解决方法是选择边框框模型,但在 IE 6 和 7 中,如果不恢复到 quirks 模式,则无法这样做。

另一种解决方案也适用于 IE 7。只需将htmlbody 设置为100% 高度,将overflow 设置为hidden 即可摆脱窗口的滚动条。然后你需要插入一个绝对定位的包装 div 来获取红色边框和所有内容,将所有四个 box offset properties 设置为 0 (因此边框贴在视口的边缘)和 overflow 设置为 auto (将滚动条放在包装器 div 中)。

只有一个缺点:IE 6 不支持同时设置left righttop bottom。唯一的解决方法是使用CSS expressions(在条件注释中)将包装器的宽度和高度显式设置为视口的大小,减去边框的宽度。

为了更容易看到效果,在下面的例子中我将边框宽度放大到了 5 个像素:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
  <title>Border around content</title>
  <style type="text/css">
    * {
      margin: 0;
      padding: 0;
    }

    html, body {
      height: 100%;
      overflow: hidden;
    }

    #wrapper {
      position: absolute;
      overflow: auto;
      left: 0;
      right: 0;
      top: 0;
      bottom: 0;
      border: 5px solid red;
    }
  </style>
  <!--[if IE 6]>
  <style type="text/css">
    #wrapper {
      width: expression((m=document.documentElement.clientWidth-10)+'px');
      height: expression((m=document.documentElement.clientHeight-10)+'px');
    }
  </style>
  <![endif]-->
</head>
<body>
  <div id="wrapper">
    <!-- just a large div to get scrollbars -->
    <div style="width: 9999px; height: 9999px; background: #ddd"></div>
  </div>
</body>
</html>

P.S.:我刚看到你不喜欢overflow: hidden,嗯...


更新:我设法绕过overflow: hidden,通过使用四个粘在视口边缘的 div 来伪造边框(你不能只用一个完整的-大小的 div,因为它下面的所有元素都不能再访问了)。这不是一个好的解决方案,但至少正常的滚动条保持在原来的位置。我无法让 IE 6 使用 CSS 表达式模拟固定定位(右侧和底部 div 出现问题),但无论如何它看起来很可怕,因为这些表达式是 very expensive 并且渲染速度非常慢。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
  <title>Border around content</title>
  <style type="text/css">
    * {
      margin: 0;
      padding: 0;
    }

    #border-t, #border-b, #border-l, #border-r {
      position: fixed;
      background: red;
      z-index: 9999;
    }

    #border-t {
      left: 0;
      right: 0;
      top: 0;
      height: 5px;
    }

    #border-b {
      left: 0;
      right: 0;
      bottom: 0;
      height: 5px;
    }

    #border-l {
      left: 0;
      top: 0;
      bottom: 0;
      width: 5px;
    }

    #border-r {
      right: 0;
      top: 0;
      bottom: 0;
      width: 5px;
    }
  </style>
</head>
<body>
  <!-- just a large div to get scrollbars -->
  <div style="width: 9999px; height: 9999px; background: #ddd"></div>
  <div id="border-t"></div><div id="border-b"></div>
  <div id="border-l"></div><div id="border-r"></div>
</body>
</html>

【讨论】:

  • +1,至少这是一个不错的解释。是的,overflow: hidden 有点笨拙,但我想没有办法绕过它。看起来我最初的要求是不可能实现的,但这也是一个答案。
  • PS:你的更新中很好的解决方法!如果可以的话,我会给第二个+1。 :)
  • @Tomalak:我为你做了。 ;-)
【解决方案7】:

也有点丑,但是给身材

position:relative;
top:-1px;
left:-1px;

为我工作。

【讨论】:

  • 这也值得一试。而且只是有点丑陋,不严重。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2011-05-03
  • 2011-11-10
  • 2016-08-09
相关资源
最近更新 更多