js完美解决IE6不支持position:fixed的bug


Posted in Javascript onApril 24, 2015

先来看段代码

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>IE6 position:fixed bug</title>
<style>
*{padding:0;margin:0}
p{height:2000px}
#gs{border:1px solid #000;position:fixed;right:30px;top:120px}
</style>
<!--[if IE 6]>
<style type="text/css">
html{overflow:hidden}
body{height:100%;overflow:auto}
#gs{position:absolute}
</style>
<![endif]-->
</head>
<body>
<div id="rightform">
<p>11111111111111111</p>
<input id="gs" name="gs" type="text" value="" />
</div>
</body>
</html>

以上这段代码在网上很常见,通过设置html{overflow:hidden}和body{height:100%;overflow:auto}来实现ie6下position:fixed效果,但这种办法有个缺陷,那就是:这会使页面上原有的absolute、relation都变成fixed的效果,在这里我就不做demo了,如果有怀疑,可以自己去试验一下。

于是我找了下资料,发现可以通过一条Internet Explorer的CSS表达式(expression)来完美的实现ie6下position:fixed效果,css代码如下:

/* 除IE6浏览器的通用方法 */
.ie6fixedTL{position:fixed;left:0;top:0}
.ie6fixedBR{position:fixed;right:0;bottom:0}
/* IE6浏览器的特有方法 */
* html .ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft));top:expression(eval(document.documentElement.scrollTop))}
* html .ie6fixedBR{position:absolute;left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-this.offsetWidth)-(parseInt(this.currentStyle.marginLeft,10)||0)-(parseInt(this.currentStyle.marginRight,10)||0));top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)))}

上面代码可以直接使用了,如果要设置元素悬浮边距,要分别为设置两次,比如我要让某个元素距顶部10个像素,距左部也是10个像素,那就要这样子写:

/* 除IE6浏览器的通用方法 */
.ie6fixedTL{position:fixed;left:10px;top:10px}
/* IE6浏览器的特有方法 */
* html .ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft+10));top:expression(eval(document.documentElement.scrollTop+10))}

这样一来,IE6下实现position:fixed的效果解决了,而且也不会影响到其他的absolute、relation,但还有一个问题,就是悬浮的元素会出现振动

IE有一个多步的渲染进程。当你滚动或调整你的浏览器大小的时候,它将重置所有内容并重画页面,这个时候它就会重新处理css表达式。这会引起一个丑陋的“振动”bug,在此处固定位置的元素需要调整以跟上你的(页面的)滚动,于是就会“跳动”。
解决此问题的技巧就是使用background-attachment:fixed为body或html元素添加一个background-image。这就会强制页面在重画之前先处理CSS。因为是在重画之前处理CSS,它也就会同样在重画之前首先处理你的CSS表达式。这将让你实现完美的平滑的固定位置元素!
然后我发现background-image无需一张真实的图片,设置成about:blank就行了。

下面附上完整代码

/* 除IE6浏览器的通用方法 */
.ie6fixedTL{position:fixed;left:0;top:0}
.ie6fixedBR{position:fixed;right:0;bottom:0}
/* IE6浏览器的特有方法 */
/* 修正IE6振动bug */
* html,* html body{background-image:url(about:blank);background-attachment:fixed}
* html .ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft));top:expression(eval(document.documentElement.scrollTop))}
* html .ie6fixedBR{position:absolute;left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-this.offsetWidth)-(parseInt(this.currentStyle.marginLeft,10)||0)-(parseInt(this.currentStyle.marginRight,10)||0));top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)))}

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
javascript instanceof 内部机制探析
Oct 15 Javascript
基于jquery的拖动布局插件
Nov 25 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
Dec 31 Javascript
js关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
Nov 28 Javascript
Js与下拉列表处理问题解决
Feb 13 Javascript
js或jquery实现页面打印可局部打印
Mar 27 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
Jun 24 Javascript
JS中对Cookie的操作详解
Aug 05 Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 Javascript
JS完成画圆圈的小球
Mar 07 Javascript
vue webpack重写cookie路径的方法
Jul 10 Javascript
JS实现简单的键盘打字的效果
Apr 24 #Javascript
javascript中replace( )方法的使用
Apr 24 #Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
Apr 24 #Javascript
jQuery中dom元素上绑定的事件详解
Apr 24 #Javascript
原生js制作简单的数字键盘
Apr 24 #Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 #Javascript
Node.js实现Excel转JSON
Apr 24 #Javascript
You might like
PHP 实现explort() 功能的详解
2013/06/20 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
PHP函数引用返回的实例详解
2016/09/11 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
jQuery 位置插件
2008/12/25 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
Python装饰器decorator用法实例
2014/11/10 Python
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
Python 音频生成器的实现示例
2019/12/24 Python
python 如何引入协程和原理分析
2020/11/30 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
个人房屋转让协议书范本
2014/10/26 职场文书
退休欢送会致辞
2015/07/31 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript