【问题标题】:How to create a sticky footer in CSS inside an absolutely positioned div?如何在绝对定位的 div 内的 CSS 中创建粘性页脚?
【发布时间】:2016-01-11 21:28:41
【问题描述】:

我想在一个绝对定位的 div 元素内部创建一个粘性页脚。

我的方法是绝对定位页脚 div - 在一个额外的相对定位的“页面” div 内(它将包含页面的实际内容):

<div class="content">
   <div class="page">
      ...Some Lorem ipsum content...
      <div class="footer">Some footer</div>
   </div>
</div>

具有以下样式:

.content {
     position: absolute;
     top: 60px;
     right: 0;
     bottom: 0;
     left: 0;
}

.page {
    position: relative;
    min-height: 100%;
}

.footer {
    height: 30px;
    position: absolute;
    right: 0;
    bottom: 0;
    left: 0;
}

此方法效果不佳,因为当您调整页面大小时,页脚会在一定程度上与文本重叠。 我怎样才能摆脱这种重叠的行为?

具有完整布局的更详细的工作示例:https://jsfiddle.net/8nrukse9/2/

【问题讨论】:

  • 绝对定位实在是太多了……还有更灵活的布局方法。
  • 谢谢,您能否给我一些提示,您更喜欢哪种布局方法而不是绝对定位?我通常在我的项目中使用 this 布局示例作为起点,因为我通常创建 Web 应用程序,其中每个页面都有一些固定的布局元素(菜单、标题等)
  • 这表示不能使用当前布局完成?
  • 哦...我怕你会提到flexbox...可惜我也要支持IE9,所以我没用过...:(

标签: html css


【解决方案1】:

这里我能想到的唯一方法是flexbox,而不是绝对定位。

  .page {
    position: relative;
    min-height: 100%;
    display: flex;
    flex-direction: column;
  }

  .footer {
    margin-top: auto;
    height: 30px;
    color: brown;
    border: 1px solid brown;
    background: rgba(255,255,255,0.5);
  }

body {
  color: white;
}

nav {
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  width: 200px;
  overflow: hidden;
}
nav .logo {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 60px;
  background-color: salmon;
}
nav .navmenu {
  margin: 0;
  position: absolute;
  top: 60px;
  left: 0;
  right: 0;
  bottom: 0;
  overflow-y: auto;
  padding: 10px 20px;
  background-color: pink;
}

.content-wrapper {
  position: absolute;
  top: 0;
  left: 200px;
  bottom: 0;
  right: 0;
  overflow: hidden;
}
.content-wrapper .header {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 60px;
  background-color: pink;
}
.content-wrapper .content {
  position: absolute;
  top: 60px;
  left: 0;
  right: 0;
  bottom: 0;
  overflow-y: auto;
  padding: 10px 20px;
  background-color: rosybrown;
}
.content-wrapper .page {
  position: relative;
  min-height: 100%;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -webkit-flex-direction: column;
      -ms-flex-direction: column;
          flex-direction: column;
}
.content-wrapper .footer {
  margin-top: auto;
  height: 30px;
  color: brown;
  border: 1px solid brown;
  background: rgba(255, 255, 255, 0.5);
}
<nav>
  <div class="logo">Logo</div>
  <ul class="navmenu">
    <li>Start page</li>
    <li>Menu item 1</li>
    <li>Menu item 2</li>
    <li>Menu item 3</li>
  </ul>
</nav>
<div class="content-wrapper">
  <div class="header">
    Header
  </div>
  <div class="content">
    <div class="page">

      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore quis, temporibus, accusamus facere exercitationem molestiae reprehenderit alias dignissimos quo voluptates deleniti consequatur sunt sequi doloremque dolorem voluptatem ea voluptatum qui.
      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore quis, temporibus, accusamus facere exercitationem molestiae reprehenderit alias dignissimos quo voluptates deleniti consequatur sunt sequi doloremque dolorem voluptatem ea voluptatum
      qui. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore quis, temporibus, accusamus facere exercitationem molestiae reprehenderit alias dignissimos quo voluptates deleniti consequatur sunt sequi doloremque dolorem voluptatem ea voluptatum
      qui. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore quis, temporibus, accusamus facere exercitationem molestiae reprehenderit alias dignissimos quo voluptates deleniti consequatur sunt sequi doloremque dolorem voluptatem ea voluptatum
      qui. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore quis, temporibus, accusamus facere exercitationem molestiae reprehenderit alias dignissimos quo voluptates deleniti consequatur sunt sequi doloremque dolorem voluptatem ea voluptatum
      qui. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore quis, temporibus, accusamus facere exercitationem molestiae reprehenderit alias dignissimos quo voluptates deleniti consequatur sunt sequi doloremque dolorem voluptatem ea voluptatum
      qui.

      <div class="footer">Some footer - it shouldn't overlap with the content if you resize the page</div>
    </div>
  </div>
</div>

【讨论】:

  • 这在 IE9 下有效吗?我猜不是,因为flexbox...
【解决方案2】:

更改 CSS

    .page{height: 100%;}
  .page-inner {
    margin-bottom:-30px;
    min-height: 100%;


  }
  .page-inner:after{height:30px;
  content: "";
  display: block;
}
  .footer {
    height: 30px;
    color: brown;
    border: 1px solid brown;
  }

https://jsfiddle.net/8nrukse9/5/

【讨论】:

  • 所以你尝试用负边距补偿底部填充?好主意,但正如我所见,它不起作用,我认为因为页脚绝对位于底部...在您的链接中,滚动条会自动出现,这很奇怪,我希望滚动条应该只在需要时出现...
  • 更改最小高度 .page (min-height: 96%;)
  • 使用 min-height: 96% 是一种非常临时的解决方法,我需要一个合适的解决方案。
  • 注意:我只选择这个作为解决方案,因为 IE9 支持。否则我会使用 flexbox 方式。
【解决方案3】:

随着浏览器窗口大小的调整,CSS 中的页脚height 会动态变化。 Flexbox 可以解决这个问题,旧的 CSS 布局无法做到这一点。

如果必须支持 IE9,我会通过计算 .footer 的高度来动态确定脚注 min-height 与 jQuery 的偏移量。

var footerHeight = $( "footer" ).height();
$(".page").css("min-height", footerHeight);

【讨论】:

  • 我现在看到了问题,感谢您的解释。不幸的是,IE9 支持对我来说正式是必须的.​​.....虽然我认为没有人真正使用它:) 我想我会使用@Lalji Tadhani 的解决方法,因为我觉得它比 JS 更正更干净。在此解决方法中,页脚的高度由附加元素的边距补偿。有关实际解决方案,请参阅他的答案。
  • 是的,他的回答很好,Paulie_D 的回答也很好。所有这三种方法实际上都会起作用。
猜你喜欢
  • 2011-10-18
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2014-11-09
相关资源
最近更新 更多