首页 > 代码库 > 一个常见布局问题的讨论

一个常见布局问题的讨论

须要实现的是一个简单的左右布局页面,左側是一个固定定位的导航栏,右側是主体内容。当中右側下部须要实现一个footer,这个页脚须要在浏览器上下拉伸的时候始终固定在右側下方,同一时候。当页面缩放到小于右側主题内容高度时,footer不会超过主体内容。

详细见下图:

技术分享

上述的html结构例如以下:

<body>
	<div class="nav">左側固定导航栏</div>
	<div class="content">
		<div class="text">我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br>我是内容<br></div>
	</div>
	<div class="footer_con"><span class="footer">我是footer</span></div>
</body>

这在实现上。也没有其它特别的难度:

首先,左側导航栏使用fixed定位,设置top 、 bottom 、 left都为0。

                              .nav{
					width: 120px;
					height: 100%;
					position: fixed;
					left: 0px;
					bottom: 0px;
					background-color: green;
			}
右側内容部分是实际内容大小撑开,下部的footer測试须要依据浏览器的上下拉伸固定在页面底端,这首先会想到用fixed,可是会出现例如以下问题,
技术分享
也就是会覆盖上面的主体内容,这要就会使用绝对定位:

                            .footer{
					position: absolute;
					left: 0px;
					right: 0px;
					bottom: 0px;
					z-index: 100;
					background-color: red;
					margin-left: 120px;
			              }

这要设置后,会发现另外一个问题,假设设置以body为据对定位基准,设置body的position为relative,或者以footer类的父元素定位position为relative,都会出现直接接在内容部分后面,而不会一直保持在底部。例如以下:

技术分享

为此。还是选用以body为绝对定位基准,由于须要的效果是一直保持在页面底部。此时假设将body的高度设置为浏览器当前窗体高度,那么就能够将footer撑究竟部。

当中涉及到一个浏览器处理页面的问题:

浏览器默认都将html、body元素设置为高度为0,假设不设置高度的话。此时body的正常文档流的子元素的实际高度会撑开body而使得body的高度也是此实际高度。假设设置了body的高度,则会以此高度显示。假设设置了html的高度,则能够以min-height:100%的方式来设置body的高度继承html元素的高度而实现全屏显示。min-height的定义例如以下:

描写叙述
length定义元素的最小高度。默认值是 0。

%定义基于包括它的块级对象的百分比最小高度。

inherit规定应该从父元素继承 min-height 属性的值。
必须是min-height。不能使用height。由于设置height为100%时就是设置height为浏览器当前窗体的高度。就也会出现覆盖主体内容的问题。

此处,就是要实现内容元素全屏显示。而footer元素脱离了文档流,同一时候以body为绝对定位基准,因此假设body为整个窗体大小,那么footer的bottom:0就会固定在页面的底部。同一时候。因为页面最低高度为100%,设置footer的直系父元素footer-con的高度和footer的高度同样。那么当减小浏览器窗体的高度时,footer-con和内容部分是body的正常文档流,小于此高度时,也就是body的100%高度,浏览器就会出现滚动栏,而此时body的底部一直会是footer-con元素的底部,那么footer设置的bottom为0就会停留在foote-con元素的底部,从而就不会超出而往上覆盖主体内容部分。

这就是这里使用绝对定位实现的效果。

终于的效果例如以下,当浏览器往上缩小高度使得footer达到主体内容时。不会跟着浏览器继续往上:

技术分享

整个分析也是对巧妙使用绝对定位实现特殊效果的一个锻炼,有时候看似简单的东西中间都能够蕴含值得思考的内容。


一个常见布局问题的讨论