修正IE6不支持position:fixed的bug
众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著。前些天我做自己的博客模板的时候,遇到了这个问题。当时就简单的无视了IE6——尽管有几个使用IE6的朋友,一起BS我……但是对于大项目或商业网站,如果有用到这个属性的时候,是不可能直接无视的。
你是如何让position:fixed在IE6中工作的?
本文所使用的技巧是用了一条Internet Explorer的CSS表达式(expression)。你不可以直接使用该表达式,因为它可能会因为缓存而不更新。解决这一点的最简单的方式是使用eval
包裹你的语句。
如何解决“振动”的问题?
显然IE有一个多步的渲染进程。当你滚动或调整你的浏览器大小的时候,它将重置所有内容并重画页面,这个时候它就会重新处理css表达式。这会引起一个丑陋的“振动”bug,在此处固定位置的元素需要调整以跟上你的(页面的)滚动,于是就会“跳动”。
解决此问题的技巧就是使用background-attachment:fixed
为body或html元素添加一个background-image。这就会强制页面在重画之前先处理CSS。因为是在重画之前处理CSS,它也就会同样在重画之前首先处理你的CSS表达式。这将让你实现完美的平滑的固定位置元素!
这个方案并不是我提供的。我是在网上的某个地方读到这些的。如果你知道是谁原创了这个方法,请告诉前端观察。
我发现的另外一个小技巧是,你根本无需一个真实的图片!你可以使用一个about:blank
替代一个spacer.gif图片,而且它工作的同样出色。
CSS Code
/*让position:fixed在IE6下可用! */ .fixed- top /* 头部固定 */ { position : fixed ; bottom : auto ; top : 0px ;} .fixed- bottom /* 底部固定 */ { position : fixed ; bottom : 0px ; top : auto ;} .fixed- left /* 左侧固定 */ { position : fixed ; right : auto ; left : 0px ;} .fixed- right /* 右侧固定 */ { position : fixed ; right : 0px ; left : auto ;} /* 上面的是除了IE6的主流浏览器通用的方法 */ * html,* html body /* 修正IE6振动bug */ { background-image : url (about:blank); background-attachment : fixed ;} * html .fixed- top /* IE6 头部固定 */ { position : absolute ; bottom : auto ; top :expression(eval(document.documentElement.scrollTop));} * html .fixed- right /* IE6 右侧固定 */ { position : absolute ; right : auto ; left :expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-this.offsetWidth)-(parseInt(this.currentStyle.marginLeft, 10 )|| 0 )-(parseInt(this.currentStyle.marginRight, 10 )|| 0 ));} * html .fixed- bottom /* IE6 底部固定 */ { position : absolute ; bottom : auto ; top :expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop, 10 )|| 0 )-(parseInt(this.currentStyle.marginBottom, 10 )|| 0 )));} * html .fixed- left /* IE6 左侧固定 */ { position : absolute ; right : auto ; left :expression(eval(document.documentElement.scrollLeft));} |
更新: 添加border、padding 和margin 支持!
Note: 如果你不需要支持margin,可以将所有的`parseInt`部分去掉。
Note: 我只在标准模式下进行了测试。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2009-12-07 (转)Google Closure: 糟糕的JavaScript
2009-12-07 tabIndex属性