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 相关文章推荐
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
Nov 05 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
May 15 Javascript
RequireJS使用注意细节
May 15 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
Oct 04 Javascript
bootstrap模态框实现拖拽效果
Dec 14 Javascript
jQuery Dom元素操作技巧
Feb 04 jQuery
vue-router的HTML5 History 模式设置
Sep 08 Javascript
实例分析编写vue组件方法
Feb 12 Javascript
原生JavaScript实现的无缝滚动功能详解
Jan 17 Javascript
Vue设置长时间未操作登录自动到期返回登录页
Jan 22 Javascript
JS面试题中深拷贝的实现讲解
May 07 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
第十二节--类的自动加载
2006/11/16 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
python实现折半查找和归并排序算法
2017/04/14 Python
实例讲解python中的协程
2018/10/08 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
自我鉴定200字
2013/10/28 职场文书
公司综合部的成员自我评价分享
2013/11/05 职场文书
采购内勤岗位职责
2013/12/10 职场文书
自主招生自荐信指南
2014/02/04 职场文书
《自然之道》教学反思
2014/02/11 职场文书
热爱祖国演讲稿
2014/05/04 职场文书
个人担保书范文
2014/05/20 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript