固定头和底,中间部分自适应布局
这个问题08年在蓝色理想论坛就有牛人们讨论过了:http://bbs.blueidea.com/thread-2860887-2-1.html
在此,只是整合一下之前搜集到的资料。在腾讯发布web2.0QQ在线版的时候,我发现其采用的自适应的布局,相信不久之后,大部分的桌面软件搬到WEB上都会采用这样的布局,例如office的在线版本等等。这篇文章:http://bbs.blueidea.com/thread-2818595-1-1.html,比较详细地分析了为什么要采用宽高自适应的布局。
固定头和底,中间部分自适应布局,即中间高度和宽度自适应,这样的布局,其实是比较麻烦的,对于高度自适应,出现的困难主要是体现在IE6上,由此可以演化出两种布局方式:1,JS实现;2,怪异模式。其他方式如expression等对资源消耗过大的方法在此就忽略吧。
实际上,腾讯web2.0QQ在线版在兼容IE6的方法上,就是采用了JS的方式(如果检测没错的话),我个人也比较倾向与这种方式,毕竟并不是所有纯CSS布局都显得优雅。
在非IE6的浏览器下,大部分可以采用绝对定位的left,top等属性来设定宽高的自适应,例如:当一个DIV被设定为绝对定位后,宽高默认为0,这时候如果设定left:20px;right:20px;则这个DIV将根据父DIV的宽度,距离左边20px,右边20px,宽度自动拉长,如下图:
请点击这里查看示例。
同理,如果设置top,bottom等属性的话,高度也会自适应拉伸,但是有个问题,在IE6上不会出现自适应的效果。处理IE6的兼容性问题上,主要有两种方式:
【JS方法】
先判断浏览器是否为IE6,当浏览器是IE6的时候,用JS自动调整需要自适应的宽高。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>固定头和底,中间部分自适应布局-橡树小屋</title>
<script type="text/javascript">
function id(elem){
return document.getElementById(elem);
}
//确定视口的宽度和高度
function windowHeight(){
var de=document.documentElement;
return (de&&de.clientHeight)||document.body.clientHeight;
}
function resetStyle(){
var clientWidth=document.body.clientWidth;
var clientHeight=windowHeight();
var rightWidth=clientWidth-id("left").offsetWidth-2;
var rightHeight=clientHeight-id("top").offsetHeight-id("footer").offsetHeight;
if(rightWidth<=0) rightWidth=0;
id("right").style.width=rightWidth+"px";
id("right").style.height=rightHeight+"px";
id("left").style.height=rightHeight+"px";
}
window.onload=function(){
var b_v=navigator.appVersion;
var IE6=b_v.search(/MSIE 6/i);
if(IE6!=-1){
resetStyle();
window.onresize=resetStyle;
}
}
</script>
<style type="text/css">
html,body{ margin:0; padding:0;}
#top{ position:absolute; top:0; height:70px; width:100%; background:#CCC}
#left{ position:absolute; width:298px; left:0; top:70px;bottom:35px;border:1px solid #900 }
#right{ position:absolute; top:70px; bottom:35px; left:300px;right:1px;border:1px solid #063}
#footer{ position:absolute; bottom:0; height:35px; width:100%; background:#CCC}
</style>
</head>
<body>
<div id="top"></div>
<div id="left"></div>
<div id="right">当浏览器伸缩的时候,可以自适应</div>
<div id="footer"></div>
</body>
</html>
请点击这里查看示例。
【纯CSS方法】
纯CSS方法是用了怪异模式,在IE6的情况下,在文件头用语句触发怪异模式
1 | “ <!-- hi IE,please go to Quirks Mode--> ” |
通常怪异模式触发的情况:
- 没写DOCTYPE,这个最常见
- 写了DOCTYPE,但是在<!DOCTYPE …>代码之前字符输出
怪异模式是IE6之前的CSS呈现模式,它对盒子模型的解析比较奇怪。在标准模式下,盒子模型是这样的:
在怪异模式下,盒子模型是这样:
width包括了padding和border,所有,当设定height:100%,再设置border-top,border-bottom为相应的值就可以使其自适应了,因为height:100%包括了border的值。
前端设计师 嗷嗷写过相关的例子:http://labs.aoao.org.cn/demo/layout/100x100/。有兴趣的可以查看其代码。
文毕!
参考资料:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架