8

假设我有一个父 DIV。在内部,有三个子 DIV:页眉、内容和页脚。标题附加到父级的顶部并水平填充。页脚附加到父级的底部并水平填充它。内容应该填充页眉和页脚之间的所有空间。

父级必须具有固定的宽度和高度。内容 DIV 必须填充页眉和页脚之间的所有可用空间。当内容 DIV 的内容大小超过页眉和页脚之间的空间时,内容 DIV 应显示滚动条并允许适当的滚动,这样页脚内容不会被遮挡,页脚内容也不会被遮挡。

现在是困难的部分:您事先不知道页眉和页脚的高度(例如,页眉和页脚是动态填充的)。如何在不使用 JavaScript的情况下定位内容?

例子:

<div style="position : relative; width : 200px; height : 200px; background-color : #e0e0ff; overflow : hidden;">
    <div style="background-color: #80ff80; position : absolute; left : 0; right : 0; top : 0;">
    header 
    </div>
    <div style="background-color: #8080ff; overflow : auto; position : absolute;">
    content (how to position it?)
    </div>
    <div style="background-color: #ff8080; position : absolute; bottom : 0px; left :0; right : 0;">
    footer 
    </div>    
</div>

为了进一步澄清这个事件- 我试图实现的目标布局将用于业务 Web 应用程序。父 DIV 将具有固定但未知的大小(例如,它将与浏览器视口的大小完全一致,同时调整自身大小以及用户调整浏览器窗口的大小)。让我们将父 DIV 称为“屏幕”。

标题将包含一组过滤控件(如文本框、下拉列表和“过滤”按钮),如果水平空间不足,它们应该换行到下一行(因此它的高度可以随时更改以适应换行)。标题应始终可见并附加到“屏幕”的顶部。

页脚将包含一组按钮,就像在对话窗口上一样。如果水平空间不足,这些也可以换行到下一行。页脚必须附加到“屏幕”的底部,以便始终可以访问和可见。

内容将包含“屏幕”内容,如对话框字段等。如果字段太少,则其余内容将为“空白”(在这种情况下,页脚不应在内容之后立即开始,但仍附加到固定大小的“屏幕”底部)。如果字段太多,则内容 DIV 将提供滚动条来访问隐藏的控件(在这种情况下,内容 DIV 不得将自身扩展到页脚下方,因为滚动条将被部分隐藏)。

我希望这能进一步澄清这个问题,因为我的代表太低,无法对您的回复发表评论。

4

7 回答 7

4

我将为此进行降级,但这听起来像是一张桌子的工作。

您要做的是将三个连续 div 的总高度设置为一个单位,而高度为 100% 的 1x3 表实际上是一种更清洁的解决方案。

于 2008-09-11T17:34:26.987 回答
2

纯 CSS 解决方案 1 - Flexbox:

display: flex;您可以使用 CSS3属性创建一列以这种方式运行的 div (请参阅 W3 规范

使用包装器,您可以将列中的所有内容与flex-direction: column;声明对齐,然后用justify content: space-between;and填充垂直空间height: 100vh;。然后你需要做的就是让你的内容元素扩展flex: 1 0 0;并给它一个滚动条overflow-y: auto;

关于浏览器支持的注意事项 - 虽然大多数现代浏览器都支持 flexbox,但仍有一些限制(参见: http ://caniuse.com/#feat=flexbox )。我建议使用-webkit-and-ms-前缀。


工作示例:请参阅以下代码片段和此jsfiddle

body {
    display: -webkit-flex; /* Safari 6.1+ */
    display: -ms-flex; /* IE 10 */ 
    display: flex;
    -webkit-flex-direction: column; /* Safari 6.1+ */
    -ms-flex-direction: column; /* IE 10 */
    flex-direction: column;
    -webkit-justify-content: space-between; /* Safari 6.1+ */
    -ms-justify-content: space-between; /* IE 10 */
    justify-content: space-between; /* Header top, footer bottom */
    height: 100vh;  /* Fill viewport height */
}
main {
    -webkit-flex: 1 0 0; /* Safari 6.1+ */
    -ms-flex: 1 0 0; /* IE 10 */
    flex: 1 0 0; /* Grow to fill space */
    overflow-y: auto; /* Add scrollbar */
    height: 100%; /* Needed to fill space in IE */
}
header, footer {
    -webkit-flex: 0 0 auto; /* Safari 6.1+ */
    -ms-flex: 0 0 auto; /* IE 10 */
    flex: 0 0 auto;
}



/* Make it look a little nicer */
body {
    margin: 0;
    background-color: #8080ff;
}
header {
    background-color: #80ff80; 
}
footer {
    background-color: #ff8080;
}
p {
    margin: 1.25rem;
}
<body>
    <header>
        <p>header</p> 
    </header>
    <main>
        <article>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pellentesque lobortis augue, in porta arcu dapibus dapibus. Suspendisse vulputate tempus venenatis. Pellentesque ac euismod urna. Donec dui odio, ullamcorper in posuere eu, laoreet sed nisl. Sed vitae vestibulum leo. Maecenas mattis lacus eget nisl malesuada, quis semper urna ornare. Praesent id mauris nec neque aliquet dignissim.</p>
                            <p>Morbi varius dolor at lorem aliquet lacinia. Aliquam id lacinia quam. Sed vel libero felis. Etiam et pellentesque sem. Aenean bibendum, ante quis luctus tincidunt, elit mauris volutpat nisi, et tempus lectus sapien in mauris. Aliquam condimentum nisl ut elit accumsan hendrerit. Morbi mollis turpis est, id tincidunt ipsum rhoncus eget. Fusce in feugiat lacus. Quisque vel massa magna. Mauris varius congue nisl, vitae pellentesque diam ultricies at. Sed ac nibh ac diam tristique venenatis non nec nisl. Vivamus enim eros, pretium at iaculis nec, pharetra non sem. Aenean ac imperdiet odio.</p>
                            <p>Morbi varius dolor at lorem aliquet lacinia. Aliquam id lacinia quam. Sed vel libero felis. Etiam et pellentesque sem. Aenean bibendum, ante quis luctus tincidunt, elit mauris volutpat nisi, et tempus lectus sapien in mauris. Aliquam condimentum nisl ut elit accumsan hendrerit. Morbi mollis turpis est, id tincidunt ipsum rhoncus eget. Fusce in feugiat lacus. Quisque vel massa magna. Mauris varius congue nisl, vitae pellentesque diam ultricies at. Sed ac nibh ac diam tristique venenatis non nec nisl. Vivamus enim eros, pretium at iaculis nec, pharetra non sem. Aenean ac imperdiet odio.</p>
        </article>
    </main>
    <footer>
        <p>footer</p> 
    </footer>
</body>


有关如何使用 flexbox 的更多信息,请参阅以下指南:



纯 CSS 解决方案 2 - 显示表格 [旧解决方案]:

这也可以通过使用 CSSdisplay: table;属性来完成(请参阅 W3 规范)。

的HTML:

<div id="screen">
    <div id="header"></div>
    <div id="content">
        <div id="content_frame">
            <div id="content_wrap"></div>
        </div>
    </div>
    <div id="footer"></div>
</div>

CSS:

html, body, #screen, #content, #content_frame {
    height: 100%; /* Make #screen viewport height and #content fill space */
}
#screen {
    display: table;
}
#header, #content, #footer {
    display: table-row;
}
#content_frame {
    overflow-y: auto; /* Add scrollbar */
    position: relative;
}
#content_wrap {
    position: absolute; /* Fix problem with overflow in FF */
}

溢出属性对 css 表格元素及其子元素不可靠,因此我不得不嵌套内容。在这种情况下,我被迫嵌套两次并使用position: absolute;它以使其在 Firefox 中工作。也许其他人可以想出一个更优雅的解决方案来避免这种“divitis”。

这是一个正常运行的jsfiddle

警告:这在 Opera 12 中似乎不起作用!内容 div 占据了父级高度的 100%,这会导致行溢出表格(就像他们在 Firefox 中所做的那样)。

于 2014-02-24T01:05:00.567 回答
1

如果您可以避免主要内容可滚动,您最好使用footerStickAlt方法来确保您的页脚停留在屏幕底部或内容底部(如果内容超出屏幕底部)。

于 2008-09-12T12:18:32.527 回答
0

你需要让中心 div 改变大小吗?如果您只是想确保它的背景 (#8080ff) 出现在页眉和页脚之间,为什么不将包含 div 的背景设为 #8080ff。页眉和页脚背景将覆盖它,而 div 的其余背景将是正确的。

于 2008-09-11T21:00:40.453 回答
0

绝对定位把你搞砸了。尝试这样的事情:

HTML:

<div id="wrapper">
 <div id="header">
  header
 </div>
 <div id="content">
  content
 </div>
 <div id="footer">
  footer
 </div>
</div>

CSS:

#wrapper {
  width: 200px;
  height: 200px;
  overflow: visible;
  background: #e0e0ff;
}
#header {
  background: #80ff80;
}
#content {
  background: #8080ff;
}
#footer {
  background: #ff8080;
}

编辑:也许我误解了,你想让所有东西都适合 200x200px 的盒子还是你想让盒子增加它的高度以适应内容?

于 2008-09-11T17:17:58.540 回答
0

父母是否需要保持固定高度?

<div style="position : relative; width : 200px; background-color : #e0e0ff; overflow : hidden;">
<div style="float: left; clear: left; background-color: #80ff80;">
header 
</div>
<div style="float: left; clear: left; background-color: #8080ff; overflow : auto; ">
content (how to position it?)
<BR />taller
<BR />taller
<BR />taller
<BR />taller
<BR />taller
<BR />taller
<BR />taller
<BR />taller
</div>
<div style="float: left; clear: left; background-color: #ff8080;">
footer 
<BR />taller
</div>    

如果父级的高度是固定的,这是我知道的最接近它的方法——如果这些色块(而不只是文本)真的很重要并且不仅仅是为了说明,那么仍然不完全正确DIV 的边界:

<div style="position : relative; width : 200px; height : 200px; background-color : #e0e0ff; overflow : hidden;">
<div style="float: left; clear: left; background-color: #80ff80; ">
header <BR .> taller
</div>
<div style="float: left; clear: left; background-color: #8080ff; overflow : auto; ">
content (how to position it?)<BR /> and another line
</div>
<div style="background-color: #ff8080; position : absolute; bottom : 0px; left :0; right : 0;">
footer <BR /> taller
</div>    

于 2008-09-11T17:18:55.197 回答
0

这可以通过使用不同的技术来解决。第一个是使用媒体查询。使用它们,您可以定义每种屏幕尺寸的页面外观。其次,有几种技术可以正确定位页脚(粘性页脚)。第三,您可以使用不同的表格样式或 flexbox 方法来正确定位您的内容。

于 2020-09-17T09:37:38.937 回答