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 相关文章推荐
使用onbeforeunload属性后的副作用
Mar 08 Javascript
javascript 星级评分效果(手写)
Dec 24 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
js的正则test,match,exec详细解析
Jan 29 Javascript
jQuery异步验证用户名是否存在示例代码
May 21 Javascript
JS+CSS实现可拖动的弹出提示框
Feb 16 Javascript
JS去除iframe滚动条的方法
Apr 01 Javascript
JS 全屏和退出全屏详解及实例代码
Nov 07 Javascript
js验证手机号、密码、短信验证码代码工具类
Jun 24 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
Dec 08 Javascript
JS精髓原型链继承及构造函数继承问题纠正
Jun 16 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 多行多列显示
2009/08/15 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
python获取图片颜色信息的方法
2015/03/18 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
python获取本机所有IP地址的方法
2018/12/26 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
Django celery异步任务实现代码示例
2020/11/26 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
工商管理实习生自我鉴定范文
2013/12/18 职场文书
八年级语文教学反思
2014/02/11 职场文书
创业融资计划书
2014/04/25 职场文书
书法大赛策划方案
2014/06/04 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
Python合并pdf文件的工具
2021/07/01 Python