body
1 | body{background:#069;} |
则浏览器界面就是完全的#068的背景色。这里看上去是<body>标签下的背景色起作用了,我到不这么认为,这里不是body的background起作用,而是body作为一个根节点起作用了,<html>标签未被激活,body担当类似于根节点的节点,其background背景色被浏览器俘获,浏览器界面背景色为background的背景色,以上是我的推论,这种推论不是我凭空想象出来的,而是有一定的根据的。看下面的一段css代码:
1 | body{background:#069; margin:100px; border:30px solid #093;} |
意思很简明:外边距100像素,边框30像素,背景色#069,按照对一般标签的理解,100像素的外边距应该不含有背景色的,然而显示的结果是(Firefox下表现与此类似):
还有一点可以证明我上面的推论,就是一旦设置了<html>节点的background背景色之后,<body>的背景色将失效。例如下面的简短代码:
1 2 | html{background:#999;}body{background:#069; margin:100px; border:30px solid #093;} |
跟上面的想比,就是添加了html的背景色,结果(截自IE6,Firefox浏览器下表现一致):
结果是什么呢?<body>标签的满屏的背景色不见了,“失效”了。其实,在我看来,不是“失效”,是生效了。当<html>标签无背景样式时,<body>的背景色其实不是<body>标签的背景色,而是浏览器的。一旦html标签含有背景色,则<body>的背景色变成了正常的<body>标签(一个实实在在,普普通通标签)的背景色,而此时的<html>标签最顶级,背景色被浏览器获取,成为浏览器的背景色。
1 2 | html{background:#999;margin:100px; border:30px solid #093;}body{background:#069; margin:100px; border:30px solid #093;} |
这是缩放到500像素宽的图片,仔细看还是会发现IE6下margin没有起作用,顶边的是30像素的边框,Firefox下margin起作用了,可以看到30像素的边框外部还有一段间距。此图<html>标签背景色的全屏显示也进一步证明了我上面有关背景色显示原理的推论。
1 | body{overflow-y:scroll;} |
Firefox下是出现了滚动槽了,但是IE下出现了两个滚动条,如下:
可能有人会想到hack,no,no,no,其实仔细想一想,问题很简单。为什么IE会产生双固定条,里面那一个肯定是<body>的,那么外面的那一个呢?啊,或许您想到了,<html>标签的,就是说默认状态下,IE6下html有个overflow:scroll声明,证明很简单,您设置<html>标签overflow:hidden看滚动条是否没有了(我这里证明是没有了)。所以呢,只要在css中些写上:
1 | html{overflow-y:scroll;} |
就可以让IE和Firefox(包括chrome)浏览器默认产生滚动条的滚动槽了。
1 2 | body{background:url(../image/404.png) no-repeat fixed center center;}div{height:2000px;} |
1 | <body><div></div></body> |
1 2 3 | html{background:white;}body{background:url(../image/404.png) no-repeat fixed center center;}div{height:2000px;} |
1 2 | html{background:white url(../image/404.png) no-repeat fixed center center;}div{height:2000px;} |
1 | body{background:#039; border:50px solid #C00;} |
看边框范围是否高度100%显示,答案是否定的。见下图(截自IE6,Firefox浏览器下表现一致):
那么<body>是否支持height:100%呢?经过我的测试,IE6支持,Firefox浏览器不支持。
要想让Firefox浏览器也支持<body>的height:100%是简单的,就是设置<html>标签height:100%,一旦设置了height:100%则无论哪个浏览器下<body>都支持height:100%了,而<body>内部的容器也可以支持height:100%了。
前段时间看到百度的一道面试题,说什么透明层无论滚动与否都满屏显示,其实就是对<html>和<body>标签做一番手脚,两者高度100%显示,同时溢出隐藏(overflow:hidden),然后用一个<div>高度100%显示,溢出滚动。而这个透明层就使用绝对定位且与这个<div>平级,高宽100%显示,就可以使得无论怎么滚动这个透明覆盖层都是满屏显示的。这其实也就解决IE6下浮动层固定定位的经典方法。
1 2 3 4 5 6 7 8 | body { height: 30px; overflow: hidden;}body > div { height: 300px; background-color: #cd0000;} |
此时body的子元素div依然保持300px高度的显示,如果想要隐藏,需要设置html的overflow:hidden。
并不是说body overflow无效,而是body天然的overflow计算容器是一屏高度,因此,如果div高度很高,例如3000px:
1 2 3 4 | body > div { height: 3000px; background-color: #cd0000;} |
大家可以看到body的子元素div也就显示了屏幕的高度。