你问我答(27)——使用CSS定位页面的“footer”
colorandy读者提出这样一个关于页面布局的问题:
“如果有一个footer层,我想让他固定出现在整个页面的最下方,不随着页面中的内容而变化,CSS中要怎样设?比如里面是一些版权信息。因为我整页的内容比较少,footer老跟着内容跑到上面去,很不美观。”
这个问题如果在以前使用表格布局,并不困难,只要给页面的最外层表格高度设置为100%就可以了,然而,在Web标准的规范中,表格的高度已经属于废止的属性,应该避免使用,而且使用Web标准以后,也不在提倡使用表格布局了,那么是否有办法使用CSS来实现页面的页脚部分固定在浏览器底端呢?
下面就来讲解它的实现方法。
基本思路
首先考虑外层设置一个容器div,id设为#container,使他的高度为浏览器窗口的高度,然后将#footer这个div设置为#container的子div,并使用绝对定位的方式,使他固定到#container的底端,以实现希望的效果。
点击这里察看案例页面效果。 改变浏览器的高度和宽度,可以看到Footer部分的效果。
代码实现
下面先考虑HTML结构,这个演示页面的HTML代码非常简单。
1 2 3 4 5 6 7 8 9 10 11 12 | <body> <div id="container"> <div id="content"> <h1>Content</h1> <p>请改变浏览器窗口的高度,以观察footer效果。</p> <p>这里是示例文字,………,这里是示例文字。</p> </div> <div id="footer"> <h1>Footer</h1> </div> </div> </body> |
然后设置CSS,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | body,html { margin: 0; padding: 0; font: 12px/1.5 arial; height:100%; } #container { min-height:100%; position: relative; } #content { padding: 10px; padding-bottom: 60px; /* 20px(font-size)x2(line-height) + 10px(padding)x2=60px*/ } #footer { position: absolute; bottom: 0; padding: 10px 0; background-color: #AAA; width: 100%; } #footer h1 { font: 20px/2 Arial; margin:0; padding:0 10px; } |
要点分析
1:首先要给html和body元素设置高度(height属性)为100% (第5行),这样先保证根元素的高度撑满整个浏览器窗口,然后下面才能使#container的高度撑满整个浏览器窗口。
至于为什么用同时设置html和body元素,是因为Firefox和IE认为的根元素不一样,因此这里都给他们设置上。
2:然后把#container的高度也设置为100% (第8行),但是要注意,这里使用了“min-height”属性,而不是普通的height属性,这是因为我们要考虑到,如果#content中的内容如果增加了,他的高度超过了浏览器窗口的高度,那么如果把#container的高度仍然是100%,就会导致#footer仍然定位在浏器窗口的下端,从而遮盖了#content中的内容。
而使用min-height属性的作用就是使#container的高度“至少”为浏览器窗口的高度,而当如果它里面的内容增加了,他的高度会也跟随着增加,这才是我们需要的效果。
但是需要说明的是,在Firefox和IE7中,支持min-height属性,而IE6种,并不支持min-height属性,但是“歪打正着”的是,IE 6中,会把min-height属性解释为height属性,但是IE 6中height属性的效果却是min-height本来应该具有的效果,也就是说,在IE 6中,子div的高度会撑大父div的高度。所以这样正好可以实现在IE6、IE7和Firefox中都可以正确实现我们希望的效果了。
3:接下来,将#container设置为相对定位(第9行),目的是使他成为它里面的#footer的定位基准,也就是所谓的“最近的定位过的祖先元素”。
4:然后把#foooter设置为绝对定位(第17行),并使之贴在#container的最下端(第18行)。
5:但是要注意,如果当我们把#foooter贴在#container的最下端以后,他实际上已经和上面的#content这个div重叠了,为了避免覆盖#content中的内容,我们在#contetn中设置了下侧的padding,使padding-bottom的值等于#footer的高度(第13行),就可以保证避免覆盖#content的文字了,这个高度的计算注意代码中的注释中给出的计算方法(第14行)。
6:剩下的就没有更多技术需要解释了。如果读者对上面的解释还不十分理解,说明您对CSS的基本概念还了解得不够,先仔细把CSS的核心原理和基本概念彻底搞清楚,再来看这些代码就是很轻松的了。
案例总结
这个看起来并不复杂的代码,去包含了很多CSS的核心概念和原理,因此这里又回到了我们曾经多次给读者的建议上:一定要扎扎实实把CSS的核心原理搞清楚,特别是CSS的4大核心基石:盒子模型、标准流、浮动、定位。只有把这些核心基础掌握到烂熟于胸的程度,才能游刃有余地进行设计。
6,800


在用到那个定位的时候。绝对定位~相对定位~固定定位~浮动定位要怎么理解。什么时候用到绝对定位。。
什么时候用到相对定位。什么时候用到固定定位。和浮动定位
小陈,
这个问题并非一两句话可以说清的,也没有一个标准答案。
大致原则是,如果在标准流中搞不定的事情,考虑用相对定位和绝对定位,如果需要左右分列,考虑用浮动。
[…] 原文地址:http://learning.artech.cn/20080328.css-footer-position.html […]
老师您好!
我不晓得弧度在网页中的运用,您能给我一个事例吗?
赶美超印,
抱歉,不知道您说的“弧度”是什么意思?您有什么具体的页面用到吗?把URL贴过来,我看一看?
老师啊
有个网页反面的问题困饶我好久了
就是在网页中怎样添加一个斜线而非图片
或者说添加一个斜区块,如三角行区块,五边行之类的!
你能告诉我吗??
fan_ni ,
您是希望在把文字放在一个多变形区域内,自动填充这个区域,来进行页面的布局吗
这个据我所知,即使CSS3也不支持~~~
您是不是以前是做平面设计排版的,比如Indesign、Pagemaker之类用惯了?至少目前,网页上还实现不了。
当然,如果硬要做,个别的要求可以,比如说,你可以用若干个矩形盒子拼成一个斜的形状,利用浮动形成文字环绕效果。不过没有通用的方法。
温老师啊
还有XHTML*CSS书中有一点讲道
弧度的运用,没有具体的实例,我现在还不明白!
你能不能给个实例!
我想可以用它可以设置个斜区块,您说呢?
抱歉,这个我不知道怎么搞。
你好,老师!
我不是学平面设计的,现在没从事艺术了,不过我还是非常喜欢艺术方面的专业!尤其是对网页美工
方面感兴趣,所以………
以后还要望老师多多指教!
指教不敢当,大家多交流。找一个自己喜欢的方向,多发掘!
欢迎常来这里交流。
我暂时用了个较笨的JS解决,希望能有CSS解决方案
JS代码:
<script type="text/javascript">
<!–
window.onload=function(){
var addheight=document.getElementById("footer").scrollHeight;
var addel=document.createElement("div");
addel.style.cssText="height:"+addheight+";padding-top:20px";
document.getElementById("container").appendChild(addel);
};
// –>
</script>
BlackOut ,
我不确认您是否理解了上面文章的意思。在这种方案中,footer是压住了contetn的一部分,所以用padding-bottom让出这个footer盖住的空间。
至于您说的文字内容超过满屏,我试了似乎没有问题啊,我不确认您到底遇到的问题是什么,希望实现的效果是什么?测试的时候您不需要加长测试页面,只需要把浏览器窗口变窄,变短一些,就可以出现滚动条了,就看到文字长度超过浏览器窗口高度的情况了。
我说的就是这个问题,footer的高度如果经常调整呢?不能总是手动地改padding-bottom吧?不过用js改padding-bottom似乎比插入元素的方法要好一些^_^,看来用CSS解决不了这个问题了.再次感谢您的回答!
哦,我这就明白您的意思了!
谢谢您的补充,很不错!我觉得用纯CSS好像无法实现自动调整padding。用JS调整padding-bottom似乎是最好的解决方法了,如果你的页面上用了jQuery的话,改这个属性一行代码就可以了。
对于大多数网站,footer似乎是最稳定的部分了,高度一般不会经常改变,当然要是能够自动适应,是最好了。
如果#content的高度超过一屏(100%),那么下面的内容就会被#footer挡住了,解决办法希望发到我的邮箱,谢谢.
BlackOut ,
你在浏览器中试验过上面文章里的那个测试页面吗?内容超过浏览器窗口高度,也不会挡住的footer的,你再仔细试验一下?我在IE6/IE7/Firefox/safari测试都没有问题。
font: 12px/1.5 arial; 怎么得出font-size是20个像素呢?就是/*20px(font-size)x2(line-height) + 10px(padding)x2=60px */中的20px(font-size)?
aiis,
这是为#footer计算高度,要以#footer中的尺寸计算,请参见CSS代码第24行。
我是问计算#footer的高度 那一行代码为什么是20px?
请参见CSS代码第24行,这是font属性的简写形式。如果不熟悉,可以查一下CSS的相关内容,一般的资料上都有。