ChatGPT解决这个技术问题 Extra ChatGPT

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

CSS Push Div to bottom of page

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

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

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

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

https://i.stack.imgur.com/ahmtx.png

抱歉,如果没有澄清,我不希望它被修复,只是让它位于所有内容的实际底部。

尝试 position:fixed ,尽管这并不是最好的方法
尝试位置:相对于身体。
你没有关闭你的;后位置:绝对。否则它会完美无缺!

J
Joseph Silber

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

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

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


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

不幸的是,如果不添加一些额外的 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/


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

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

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 以查看页脚

笨蛋


I
Ian

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

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


A
AlexHighHigh

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

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

T
Tarciso Junior

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

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

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

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


O
Obromios

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

html,body{
height: 100%
}
#nonFooter{
min-height: calc(100vh - 30px)
}

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

l
lczapski
position: fixed;
bottom: 0;
(if needs element in whole display and left align)
left:0;
width: 100%;

请在您的答案中描述问题是什么,以及此代码段将如何解决它,以帮助其他人理解此答案
D
David B

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


T
Tim L

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

这是因为设置 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%;
}

这解决了我的问题!


G
George Carlin

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

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

G
Gowtham Sooryaraj

使用固定底部引导类

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

没有迹象表明 OP 正在使用 Bootstrap。