即使有滚动条,也让 div 始终停留在页面内容的底部

Posted

技术标签:

【中文标题】即使有滚动条,也让 div 始终停留在页面内容的底部【英文标题】:Make div stay at bottom of page's content all the time even when there are scrollbars 【发布时间】:2012-02-08 03:17:26 【问题描述】:

CSS Push Div to bottom of page

请看那个链接,我想要相反:当内容溢出到滚动条时,我希望我的页脚总是在页面的完整底部,就像 Stack Overflow。

我有一个带有 id="footer" 的 div 和这个 CSS:

#footer 
    position: absolute;
    bottom: 30px;
    width: 100%;

但它所做的只是转到视口的底部,即使向下滚动也会停留在那里,因此它不再位于底部。

图片:

对不起,如果没有澄清,我不希望它被修复,只是让它在所有内容的实际底部。

【问题讨论】:

试试position:fixed,虽然这并不是最好的方法 尝试位置:相对于身体。 你没有关闭你的 ;后位置:绝对。否则它会工作得很好! 【参考方案1】:

这正是 position: fixed 的设计目的:

#footer 
    position: fixed;
    bottom: 0;
    width: 100%;

这是小提琴:http://jsfiddle.net/uw8f9/

【讨论】:

该解决方案不适用于 90% 的情况。如果您重新调整窗口大小,您的页脚将覆盖其他内容,并且不会停在内容的末尾 @aroth 那是因为它们是两种完全不同的解决方案。此解决方案将始终将页脚保持在屏幕可视区域的底部。另一种解决方案将页脚保留在屏幕底部或页面底部,具体取决于哪个更大 - 这是提问者所要求的。 @MyHeadHurts - 你完全正确。回答后,我意识到这不是 OP 想要的,但我把它留在这里给那些寻找简单固定页脚的人。从 cmets(和投票)来看,似乎很多人都在为这个基本的 CSS 特性而苦苦挣扎。 @MyHeadHurts - 很公平,尽管就我的钱而言,它们仍然基本相同。当有足够的内容时,内容会在 fixed 页脚下方滚动。这对我来说已经足够了。当然,我可以看到 very large 页脚(如 *** 上的页脚)在 fixed 方法中效果不佳,但对于基本的单行页脚,我认为这种方法效果很好。 @aroth 我同意,这是一个很好的解决方案,这完全取决于您想要什么。我只是指出为什么一种解决方案比另一种更复杂 -> 他们不做同样的事情。【参考方案2】:

不幸的是,如果不添加一些额外的 html 并让一段 CSS 依赖于另一段,您将无法做到这一点。

HTML

首先,您需要将 headerfooter#body 包装成 #holder div:

<div id="holder">
    <header>.....</header>
    <div id="body">....</div>
    <footer>....</footer>
</div>

CSS

然后将height: 100% 设置为htmlbody(实际主体,而不是您的#body div)以确保您可以将最小高度设置为子元素的百分比。

现在在#holder div 上设置min-height: 100%,使其填充屏幕内容并使用position: absolute 将页脚放在#holder div 的底部。

很遗憾,您必须将padding-bottom 应用于与footer 高度相同的#body div,以确保footer 不会位于任何内容之上:

html,body
    height: 100%


#holder
    min-height: 100%;
    position:relative;


#body
    padding-bottom: 100px;    /* height of footer */


footer
    height: 100px; 
    width:100%;
    position: absolute;
    left: 0;
    bottom: 0; 

工作示例,短正文:http://jsfiddle.net/ELUGc/

工作示例,长正文:http://jsfiddle.net/ELUGc/1/

【讨论】:

我不明白为什么 width:100%;是必需的 @sTACKoOVERFLOW - 如果您不指定width 或两者 leftright 然后值设置为auto 并且元素将换行以适应其内容。指定width: 100% left: 0right:0 确保绝对定位的元素占据容器元素的整个宽度 我一直在寻找类似的行为,但在我的情况下,#body div 是浮动的,比如“float: left”。短体示例有效,但长体示例无效。任何建议我如何使用 #body div 上的浮动来获得所需的行为。 @Ian 在回答中说,因为他没有足够的代表发表评论:如果您在 asp.net 中遇到“我的头疼”的答案时遇到问题 - 您需要添加“ height : 100%' 到主要生成的 FORM 标记以及 HTML 和 BODY 标记,以使其正常工作。 如果您想让它在 div 内而不是在整个主体内工作,请确保在 all 包含的元素上指定 height=100%,包括&lt;form&gt; 元素。【参考方案3】:

刚刚为我制定了另一个解决方案,如上例有错误(某处错误)。与所选答案不同。

html,body 
    height: 100%


#nonFooter 
    min-height: 100%;
    position:relative;
    /* Firefox */
    min-height: -moz-calc(100% - 30px);
    /* WebKit */
    min-height: -webkit-calc(100% - 30px);
    /* Opera */
    min-height: -o-calc(100% - 30px);
    /* Standard */
    min-height: calc(100% - 30px);


#footer 
    height:30px;
    margin: 0;
    clear: both;
    width:100%;
    position: relative;

用于 html 布局

<body>
    <div id="nonFooter">header,middle,left,right,etc</div>
    <div id="footer"></div>
</body>

这种方式不支持旧浏览器,但是旧浏览器可以向下滚动 30px 以查看页脚

plunker

【讨论】:

【参考方案4】:

我意识到它说不要使用它来“回复其他答案”,但不幸的是我没有足够的代表来为适当的答案添加评论(!)但是......

如果您在 asp.net 中遇到“我的头疼”的答案时遇到问题 - 您需要在生成的主要 FORM 标记以及 HTML 和 BODY 标记中添加“height : 100%”,以便这样做工作。

【讨论】:

【参考方案5】:

如果可以的话,我会发表评论,但我还没有权限,所以我会发布一个提示作为答案,以解决某些 android 设备上的意外行为:

位置:已修复,仅适用于 Android 2.1 至 2.3,使用以下元标记:

<meta name="viewport" content="width=device-width, user-scalable=no">.

见http://caniuse.com/#search=position

【讨论】:

【参考方案6】:

这是一个使用视口命令的直观解决方案,只需将最小高度设置为视口高度减去页脚高度。

html,body
height: 100%

#nonFooter
min-height: calc(100vh - 30px)


#footer 
height:30px;
margin: 0;
clear: both;
width:100%;

【讨论】:

【参考方案7】:

如果您有一个固定高度的页脚(例如 712px),您可以使用 js 来执行此操作,如下所示:

var bgTop = 0;
window.addEventListener("resize",theResize);
function theResize()
    bgTop = winHeight - 712;
    document.getElementById("bg").style.marginTop = bgTop+"px";

【讨论】:

【参考方案8】:

我通过将所有主要内容放在一个额外的 div 标签 (id="outer") 中解决了类似的问题。然后,我将 id="footer" 的 div 标签移到了最后一个“外部”div 标签之外。 我使用 CSS 来指定“outer”的高度并指定“footer”的宽度和高度。我还使用 CSS 将“页脚”的 margin-left 和 margin-right 指定为 auto。结果是页脚牢牢地位于我的页面底部并与页面一起滚动(尽管它仍然出现在“外部”div 内,但很高兴在主“内容”div 之外。这看起来很奇怪,但它我想要的地方)。

【讨论】:

【参考方案9】:

你没有关闭你的 ;后位置:绝对。 否则你上面的代码会完美运行!

#footer 
   position:absolute;
   bottom:30px;
   width:100%;

【讨论】:

【参考方案10】:

我只想补充一下——大多数其他答案对我来说都很好;但是,让它们工作需要很长时间!

这是因为设置 height: 100% 只会获取父 div 的高度!

因此,如果您的整个 html(正文内部)如下所示:

<div id="holder">
    <header>.....</header>
    <div id="body">....</div>
    <footer>....</footer>
</div>

那么以下就可以了:

html,body
    height: 100%


#holder
    min-height: 100%;
    position:relative;


#body
    padding-bottom: 100px;    /* height of footer */


footer
    height: 100px; 
    width:100%;
    position: absolute;
    left: 0;
    bottom: 0; 

...因为“持有人”会直接从“身体”获取它的高度。

感谢我的头疼,他的答案是我最终开始工作的那个!

但是。如果您的 html 更加嵌套(因为它只是整个页面的一个元素,或者它在某个列中等),那么您需要确保 每个包含元素 在 div 上也设置了 height: 100%。否则,“body”和“holder”之间的身高信息会丢失。

例如下面,我在每个 div 中添加了“全高”类,以确保高度一直到我们的页眉/正文/页脚元素:

<div class="full-height">
    <div class="container full-height">
        <div id="holder">
            <header>.....</header>
            <div id="body">....</div>
            <footer>....</footer>
        </div>
    </div>
</div>

记得在 CSS 中设置全高类的高度:

#full-height
    height: 100%;

这解决了我的问题!

【讨论】:

【参考方案11】:

使用固定底部引导类

<div id="footer" class="fixed-bottom w-100">

【讨论】:

没有迹象表明 OP 正在使用 Bootstrap。【参考方案12】:
position: fixed;
bottom: 0;
(if needs element in whole display and left align)
left:0;
width: 100%;

【讨论】:

请在您的回答中描述问题是什么,以及这个 sn-p 将如何解决它,以帮助其他人理解这个答案

以上是关于即使有滚动条,也让 div 始终停留在页面内容的底部的主要内容,如果未能解决你的问题,请参考以下文章

div自动适应页面高度,多出部分出现滚动条

我有一个大div,里面有很多个小div,大div设置了滚动条,我想第一个小div不受滚动条影响,始终显示.

如何让DIV固定在页面而不随着滚动条随意滚动

怎么让滚动条只显示在子盒子body不显示

JS或者jquery做 一个div不随滚动条上下移动改变位置的效果,就是div始终保持在浏览器的一个位置,不用css

如何使 div 上的滚动条仅在必要时可见?