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中使用$(#form).submit()重写提交表单无效原因分析及解决
Mar 25 Javascript
css配合jquery美化 select
Nov 29 Javascript
php读取sqlite数据库入门实例代码
Jun 25 Javascript
js实现漂浮回顶部按钮实例
May 06 Javascript
JS模态窗口返回值兼容问题的完美解决方法
May 28 Javascript
JS实现控制文本框的内容
Jul 10 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
Oct 20 Javascript
JavaScript中立即执行函数实例详解
Nov 04 Javascript
Angular如何在应用初始化时运行代码详解
Jun 11 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
Apr 12 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
May 16 Javascript
vue更改数组中的值实例代码详解
Feb 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
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
php读取XML的常见方法实例总结
2017/04/25 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
js初始化验证实例详解
2016/11/26 Javascript
Vue 仿百度搜索功能实现代码
2017/02/16 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
python中global用法实例分析
2015/04/30 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
美国批发零售网站:GearXS
2016/07/26 全球购物
美国在线印刷公司:PsPrint
2017/10/12 全球购物
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
儿科护理实习自我鉴定
2013/09/19 职场文书
护理自荐信
2013/10/22 职场文书
旅游市场营销方案
2014/03/09 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
房屋公证委托书
2014/04/03 职场文书