【问题标题】:Setting border on scrollable HTML frame在可滚动的 HTML 框架上设置边框
【发布时间】:2011-11-15 16:36:40
【问题描述】:

我有一个框架来承载导航树。我想在框架的右侧有一个蓝色边框。这个边框应该从上到下填满整个框架区域,并且框架也应该是可滚动的。

框架没有固定大小,它会填满浏览器窗口的整个左侧,并在用户调整浏览器窗口大小时改变大小。

树框架(和最小上下文)定义为:

<html>
<head><title></title></head>
<frameset cols="250,*" frameborder="0" framespacing="0" >  
    <frame src="tree.html" scrolling="auto" /> 
    <frame src="about:blank" name="navTarget" scrolling="auto" /> 
</frameset>
</html>

在框架内容(tree.html)中,我将边框定义为:

<style type="text/css">
    html {
        border-right: red 2px solid;
        background: yellow;
    }
</style>

现在,如果树内容足够大以填充框架区域(或更大,在这种情况下会自动添加滚动条),那么这会很好。

但是,如果树“太小”并且没有扩展以填满整个框架区域,那么边框将不会填满框架的整个右侧,而是在中途停止。

更新:这似乎是特定于浏览器的。在 Firefox 8 和 Opera 11 中,内容边框被剪短了,但在 Chrome 中,它填充了整个右边框。

这可以反过来强制树扩展到可用区域:

<style type="text/css">
    html {
        height: 100%;
        border-right: blue 2px solid;
        background:yellow;
    }
</style>

但是在这种情况下,当树大到需要滚动时,您会注意到向下滚动时边框会消失。至少在 IE8+、Firefox、Chrome 和 Opera 等现代浏览器中是这样。在 IE6 中,由于某种原因,滚动时边框将保持原位。

更新:这在所有 Chrome、Firefox 和 Opera 中都会失败(即滚动时边框消失)。

有没有一种简单的方法可以让它在其他浏览器中也能像我想的那样工作?

另一方面,背景按预期工作,它在所有情况下都会填满整个框架区域,那么为什么不是边框呢?

解决方案:

最终找到的解决方案是在 BODY 元素而不是 HTML 上设置边框,并将 HTML 元素高度设置为 100%,将 BODY 元素最小高度设置为 100%。

对 BODY 使用 min-height 而不是 height 可确保边框在滚动时不会消失,并且会填充“太短”内容的整个边框。

<style type="text/css">
    html { height:100%; }
    body { min-height:100%; }
    body { border-right:blue 2px solid; }
</style>

由于 IE6 不支持最小高度,我们使用普通高度。恰好在该浏览器中起作用(滚动时边框不会消失),但在更现代的浏览器中不起作用。

<!--[if lt IE 7]>
<style type="text/css">
body { height:100%; }
</style>
<![endif]-->

【问题讨论】:

  • 您不能将border 样式添加到内部html 页面而是iframe 吗?
  • "但是在这种情况下,当树足够大以至于需要滚动时,您会注意到向下滚动时边框会消失" --> 我只是认为滚动条与您的右边框重叠。但是这个说法让我很困惑。边框只有在向下滚动时才会消失?
  • "只有在向下滚动时边框才会消失" 是的,在您开始滚动之前,它会填充框架内容的整个右侧,但是当您向下滚动时,下方的内容部分会变得可见由于某种原因没有边界。我猜这是因为边框是从“高度:100%”创建的,这将是托管框架的大小。所以只针对内容的可见区域,而不是整个可滚动区域。

标签: html css scroll border frames


【解决方案1】:

是的。正如@Zoltan Toth 所说,将样式添加到 iframe 本身...(在某些浏览器中,您可能还需要一个 frameborder="0" 属性,并且您需要这样做:

更新:

在 tree.html 样式中:

body { border:0; border-right: 2px solid blue; min-height: 400px; /* change this */ }

在参考文档中:

<iframe src="tree.html" frameborder="0" style="border:0; width:400px; height:400px; "></iframe>

【讨论】:

  • 感谢您的回答,但似乎不太奏效。当您将border-right样式应用于框架时,它被放置在滚动条的错误一侧(当它可见时);我希望它位于滚动条的左侧,而不是右侧。所以似乎边框必须在框架内容中定义,而不是在框架本身上。
  • 我认为为框架指定一个固定高度是行不通的,因为这不符合要求。我没有使用 iframe,而是使用框架集中的普通框架。我已经编辑了问题以使其更清楚。虽然如果没有其他工作可能 min-height (即使它似乎在 IE6 中不起作用)至少可以用来使它更好一点。必须注意选择的值不要太大,我猜会导致出现不必要的滚动条。
  • 在这种情况下,我会在您的 tree.html 页面上重复使用背景图片。只有 2px 宽 x 1px 高的蓝色 .gif,重复-y
  • 嗯,你看到了什么,使用 css 背景图像就可以了。谢谢你的提示!我最终得到了这个 CSS "html, #idTreeContainer { background-image:url('images/tree_border.png'); background-repeat:repeat-y; background-position:right top; } "。出于某种原因,也不得不在树容器上指定它。如果我为border-right这样做,我会得到双边框,但不是背景图像。好吧,只要它有效! (虽然不使用这样的 hack 的解决方案更可取,但拥有单独的图像来维护并可能稍后更新并不理想。)
  • 当然。如果您想简单地更改颜色或宽度,那将很困难。但是考虑到您的其他要求(未知高度,没有不必要的滚动条等),这似乎是最不生硬的;)。很高兴它成功了。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2016-09-05
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2014-08-06
相关资源
最近更新 更多