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 相关文章推荐
根据分辨率不同,调用不同的css文件
Aug 25 Javascript
如何用javascript判断录入的日期是否合法
Jan 08 Javascript
利用JS延迟加载百度分享代码,提高网页速度
Jul 01 Javascript
js导入导出excel(实例代码)
Nov 25 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
Apr 03 Javascript
javascript常见数据验证插件大全
Aug 03 Javascript
js与jquery分别实现tab标签页功能的方法
Nov 18 Javascript
剖析Angular Component的源码示例
Mar 23 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
Jul 29 Javascript
小程序实现横向滑动日历效果
Oct 21 Javascript
Vue最新防抖方案(必看篇)
Oct 30 Javascript
weui中的picker使用js进行动态绑定数据问题
Nov 06 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 注册时输入信息验证器的实现详解
2013/07/05 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
深入解析JavaScript编程中的this关键字使用
2015/11/09 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
使用javascript插入样式
2016/03/14 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
python程序如何进行保存
2020/07/03 Python
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
硕士研究生个人求职信
2013/12/04 职场文书
学校端午节活动方案
2014/08/23 职场文书
股权投资协议书
2016/03/23 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书
2019学生会干事辞职信
2019/06/27 职场文书