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 相关文章推荐
jQuery对象与DOM对象之间的转换方法
Apr 15 Javascript
客户端js性能优化小技巧整理
Nov 05 Javascript
javascript匿名函数应用示例介绍
Mar 07 Javascript
javascript自定义函数参数传递为字符串格式
Jul 29 Javascript
angular中使用路由和$location切换视图
Jan 23 Javascript
JavaScript编程中容易出BUG的几点小知识
Jan 31 Javascript
jQuery增加自定义函数的方法
Jul 18 Javascript
基于javascript实现tab切换特效
Mar 29 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
Jul 05 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
Apr 11 Javascript
Bootstrap实现的标签页内容切换显示效果示例
May 25 Javascript
在bootstrap中实现轮播图实例代码
Jun 11 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代码
2013/11/19 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
详解vue 组件的实现原理
2020/11/12 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
Django中URLconf和include()的协同工作方法
2015/07/20 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
python 连接各类主流数据库的实例代码
2018/01/30 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
宿舍卫生检讨书
2014/01/16 职场文书
婚庆司仪主持词
2014/03/15 职场文书
超级礼物观后感
2015/06/15 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
创业计划书之干洗店
2019/09/10 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python