如何使用弹性框使页脚停留在页面底部

Gar*_*ary 11 html css flexbox

在 iOS Safari 上,当我创建一个 div 是一个 Flex 项目并使其成为一个 Flex 容器时,它的高度不会拉伸以匹配其内容。然而,如果它不是一个弹性容器,那么它的高度会拉伸以匹配它的内容。

详细说明 - 我正在使用 css flexbox 将页脚放置在页面底部。页面主体有两个 div - “maincontents”和“footer”。即使“maincontents”div 内容很少或没有内容,页脚仍将保留在窗口底部。而如果“maincontents”div内容较多,则可以根据需要将页脚下推。这个想法很容易在 Flexbox 中实现,方法是将页面主体设置为 Flex 容器,并将“maincontents”设置为“flex:1”,将“footer”设置为“flex:0”,这样“maincontents”就会占用所有可用空间,而“页脚”被推到窗口底部。它适用于所有现代浏览器,包括 iOS safari。

如果我也将“maincontents”本身设置为弹性框(使用display:flex),就会出现问题。在 iOS Safari 上,页脚现在始终位于窗口底部,即使 maincontents 有很多内容应该将页脚进一步向下推;相反,“maincontents”最终会在“footer”下方继续,而不是将其向下推。

我在 jsfiddle 上做了一个简单的模型。 https://jsfiddle.net/8xs1rocu/

如果您在 Windows 桌面上打开该小提琴,您会看到以下内容(chrome/ff/ie11) 在此输入图像描述

如果您在 iPad 或 iPhone (Safari) 上打开它,您会看到以下内容。 在此输入图像描述

请注意,在 iOS safari 上,页脚不会被内容向下推,而是内容最终会进入页脚下方。在桌面上的 Chrome/FF/IE11 上不会发生这种情况;在这些浏览器上,页脚由“maincontents”的内容向下推。

如果删除“display:flex”行,那么它也可以在 ios safari 上完美运行,就像在其他浏览器上一样。不过,我需要“display:flex”行,因为我会将其他内容放入“maincontents”中,这些内容需要使用 css flexbox 以某种方式布局。

直接将 jsfiddle 片段代码粘贴到此处:

html, body {
  height: 100%;
  display: flex;
  flex-direction: column;
}

.maincontents {
  flex: 1;
  display: flex; /* if you remove this line it works on Safari */
}

.footer {
  flex: 0;
  background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
<html>
  <head></head>
  <body>
    <div class="maincontents">
      Main contents1 <br />
      Main contents2 <br />
      Main contents3 <br />
      Main contents4 <br />
      Main contents5 <br /> 
      Main contents6 <br />
      Main contents7 <br />
      Main contents8 <br />
      Main contents9 <br />
      Main contents10 <br />
      Main contents11 <br />
      Main contents12 <br />
    </div>
   
    <div class="footer">
      Footer1 <br />
      Footer2 <br />
      Footer3 <br />
      Footer4 <br />
      Footer5 <br />
      Footer6 <br />
      Footer7 <br />
    </div> 
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

cnl*_*evy 22

只需添加margin-top: auto;到页脚即可。

这将导致它粘在容器的底部。

html, body {
  height: 100%;
  display: flex;
  flex-direction: column;
}

.maincontents {
    /* nothing to put here */
}

.footer {
  margin-top: auto;
  background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
<html>
  <head></head>
  <body>
    <div class="maincontents">
      Main contents1 <br />
      Main contents2 <br />
      Main contents3 <br />
      Main contents4 <br />
      Main contents5 <br /> 
      Main contents6 <br />
      Main contents7 <br />
      Main contents8 <br />
      Main contents9 <br />
      Main contents10 <br />
      Main contents11 <br />
      Main contents12 <br />
    </div>
   
    <div class="footer">
      Footer1 <br />
      Footer2 <br />
      Footer3 <br />
      Footer4 <br />
      Footer5 <br />
      Footer6 <br />
      Footer7 <br />
    </div> 
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)


Cor*_*buk 3

经过进一步调查,我找到了解决您问题的方法。通过这些信息,我希望您可以做出以下更改:

html, body {
  height: 100%;
  width: 100%;
}

.maincontents {
  min-height: 100%;
  display: flex;
  flex-direction: column;
  align-items: stretch;
}

.footer {
  flex: 0;
  background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
<html>
<head></head>
<body>
  <div class="maincontents">
    Main contents1 <br />
    Main contents2 <br />
    Main contents3 <br />
    Main contents4 <br />
    Main contents5 <br /> 
    Main contents6 <br />
    Main contents7 <br />
    Main contents8 <br />
    Main contents9 <br />
    Main contents10 <br />
    Main contents11 <br />
    Main contents12 <br />
  </div>

  <div class="footer">
    Footer1 <br />
    Footer2 <br />
    Footer3 <br />
    Footer4 <br />
    Footer5 <br />
    Footer6 <br />
    Footer7 <br />
  </div>
  
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我已经在 safari 和 Chrome 上进行了测试,并且按您的预期工作。以下是jsfiddle https://jsfiddle.net/1o3904xh/12/

我强烈建议任何人看到这个,让页脚留在页面底部,并将任何内容保留在上面,就像下面的方式一样。这是正确的语义,可以提高 SEO 和可访问性。通过这种布局,您的网页应该处于非常有利的位置。

您可以在此处阅读有关 HTML5 元素的更多信息

html, body {
  width: 100%;
  height: 100%;
}

article {
  min-height: 100%;
  display: flex;
  flex-direction: column;
  align-items: stretch;
}

main {
  flex-grow: 1;
}

header, main, footer {
  flex-shrink: 0;
}

.footer {
  background-color: green;
}
Run Code Online (Sandbox Code Playgroud)
<html>
  <body>
    <article>
      <header></header>
      <main>
        <div class="maincontents">
          Main contents1 <br />
          Main contents2 <br />
          Main contents3 <br />
          Main contents4 <br />
          Main contents5 <br />
          Main contents6 <br />
          Main contents7 <br />
          Main contents8 <br />
          Main contents9 <br />
          Main contents10 <br />
          Main contents11 <br />
          Main contents12 <br />
          Main contents13 <br />
          Main contents14 <br />
          Main contents15 <br />
          Main contents16 <br />
        </div>
      </main>
      <footer>
        <div class="footer">
          Footer1 <br />
          Footer2 <br />
          Footer3 <br />
        </div>
      </footer>
    </article>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

希望这对您有帮助。