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 disabled=&quot;false&quot;不起作用的解决办法
Jun 26 Javascript
jquery操作HTML5 的data-*的用法实例分享
Aug 17 Javascript
JS辨别访问浏览器判断是android还是ios系统
Aug 19 Javascript
jQuery中unbind()方法用法实例
Jan 19 Javascript
jquery实现触发时更新下拉列表内容的方法
Dec 02 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
Jul 07 Javascript
实例解析jQuery中如何取消后续执行内容
Dec 01 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
Jan 26 Javascript
Vue.js上下滚动加载组件的实例代码
Jul 17 Javascript
jQuery选择器之层次选择器用法实例分析
Feb 19 jQuery
浅析vue-router实现原理及两种模式
Feb 11 Javascript
原生js实现日期选择插件
May 21 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中用文本文件做数据库的实现方法
2008/03/27 PHP
php微信支付之APP支付方法
2015/03/04 PHP
php动态绑定变量的用法
2015/06/16 PHP
PHP 微信扫码支付源代码(推荐)
2016/11/03 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/06/05 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
浅谈python import引入不同路径下的模块
2017/07/11 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
numpy中矩阵合并的实例
2018/06/15 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
python中的decimal类型转换实例详解
2019/06/26 Python
Python3内置模块random随机方法小结
2019/07/13 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
前台接待岗位职责
2013/12/03 职场文书
创业计划书的写作技巧及要点
2014/01/31 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js