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对单选框(radio)操作的小例子
Apr 25 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
Aug 22 Javascript
js实现touch移动触屏滑动事件
Apr 17 Javascript
javaScript中push函数用法实例分析
Jun 08 Javascript
AngularJS实现全选反选功能
Dec 08 Javascript
Knockoutjs 学习系列(二)花式捆绑
Jun 07 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
Jan 12 Javascript
Vue拖拽组件开发实例详解
May 11 Javascript
详解如何webpack使用DllPlugin
Sep 30 Javascript
详解使用angular框架离线你的应用(pwa指南)
Jan 31 Javascript
详解基于Vue/React项目的移动端适配方案
Aug 23 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
Dec 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经典的给图片加水印程序
2006/12/06 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
destoon二次开发入门示例
2014/06/20 PHP
php中chdir()函数用法实例
2014/11/13 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
python删除过期log文件操作实例解析
2018/01/31 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
会计核算科岗位职责
2014/03/19 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
匿名检举信范文
2015/03/02 职场文书
大客户经理岗位职责
2015/04/09 职场文书
司机岗位职责范本
2015/04/10 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js