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 TextArea动态显示剩余字符
Oct 22 Javascript
jQuery源码分析之Callbacks详解
Mar 13 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
Aug 06 Javascript
JavaScript多线程详解
Aug 12 Javascript
jQuery实现的经典滑动门效果
Sep 22 Javascript
基于Javascript实现倒计时功能
Feb 22 Javascript
JavaScript必知必会(七)js对象继承
Jun 08 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
Feb 27 Javascript
JS实现动态添加DOM节点和事件的方法示例
Apr 28 Javascript
vue环境搭建简单教程
Nov 07 Javascript
vue项目中导入swiper插件的方法
Jan 30 Javascript
jQuery实现穿梭框效果
Jan 19 jQuery
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
ninety plus是什么?ninety plus咖啡好吗?
2021/03/04 新手入门
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
PHP生成自适应大小的缩略图类及使用方法分享
2014/05/06 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
php strftime函数的详细用法
2018/06/21 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
php实现session共享的实例方法
2019/09/19 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
Python中asyncore的用法实例
2014/09/29 Python
Python 中的with关键字使用详解
2016/09/11 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
英国在线购买轮胎、预订汽车、汽车维修和装配网站:Protyre
2020/04/12 全球购物
自我鉴定怎么写
2014/01/12 职场文书
就业协议书范本
2014/10/08 职场文书
幼儿教师辞职信
2015/02/27 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
公司职员入党自传书
2015/06/26 职场文书
财务年终工作总结大全
2019/06/20 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python