背景

最近要给豆瓣直租加上版权、备案信息,这些信息通常放在页脚。而页脚的具体放置也有些讲究,具体希望达到的效果是这样的:

  • 对于长页面(视口无法放下全部内容,需要向下滚动),希望页脚放在正文结尾的下方,即 position: static; 效果。
    豆瓣直租主页(长页面)
  • 对于短页面(视口可以放下全部内容,且页面底部还留有许多空白),希望页脚放在视口底部,即 position: fixed; bottom: 0; right: 0; 效果。
    豆瓣直租帮助页面(短页面)

实现方法

为了方便下文表述,我们定义 HTML 结构如下(headermainfooter 分别代表网页的顶部标题栏、主体/正文、底部页脚):


	
		
header
main
footer

原以为需要用 JavaScript 获取 main 的位置和视口大小,根据它们的相对关系,设置 position 实现。但跟朋友讨论了下,用 CSS 的 min-height 应该可以实现类似的效果。自己也由此想到了一些衍生方法。

设置 main 属性 min-height: 100vh;

vh 是 viewport height 的缩写,表示视口高度。也不必须是 100vh,也可能是 98vh/99vh 等。

这个方法的思路是,将 mainheight 置成足够大的值,这样即使是短页面,也能保证页脚出现在页面底部。

这个方法对于短页面,也有缺点:

  • 如果 min-height 值偏小,则页脚位置距页面底部可能会比较高;
  • 如果 min-height 值偏大,则当前视口无法完整显示页脚内容,需要向下滚动屏幕。比如说 min-height: 100vh; 一定会导致需要滚动页面才能看到页脚;而对于一个短页面来说,页面本身是有大量空白的,却需要滚动页面才能完整地看到页脚,这显然是不合理的。

对页面美观程度要求不高的话,可以用这个方法。

参考:

下面介绍另一个目前看起来效果完美的方法,当然实现上会更复杂些。

利用 flex 布局的 flex-grow 属性,自动调整 mainheight

该方法思路与上面方法类似,优化点在于:不去手动指定 mainheight,而是将整个 div 设定为 display: flex;,而 headerfooter 的高度是确定的,利用 flex-grow 属性,自动调整 mainheight

相关 CSS 代码:

div {
	height: 100vh;
	display: flex;
	flex-direction: column;
	justify-content: center;
	align-items: center;
}

header {
	flex: none;		// 等价于 flex: 0 0 auto;
}

main {
	flex: auto;		// 等价于 flex: 1 1 auto;
}

footer {
	flex: none;		// 等价于 flex: 0 0 auto;
}

CodePen 链接:CSS flex-grow to fit screen (codepen.io)

参考:

利用 grid 布局的 grid-template-rows 属性 auto 值,自动调整 mainheight

思路与上述用 flexbox 一样,只是改用 grid 布局实现。

相关 CSS 代码:

div {
div {
  height: 100vh;
  display: grid;
  display: -webkit-grid;
  grid-template-rows: 50px auto 50px;
}

header {
  height: 50px;
}

main {
}

footer {
  height: 50px;
}

CodePen 链接:CSS grid-template-rows auto to fit screen (codepen.io)

参考:

Leave a Reply

Your email address will not be published. Required fields are marked *