CSS表达式(expression)解决IE6 position:fixed无效问题

   2015-12-20 0
核心提示:IE6 position:fixed无效在做兼容时,很是头疼,本例通过一条Internet Explorer的CSS表达式(expression)来完美的实现ie6下position:fixed效果,有需要的朋友可以参考下
废话不多说,先看一下下面这段代码:

复制代码
代码如下:

<!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)))}
 
标签: IE6 Position fixed
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 不刷新页面更改CSS样式(IE6、7、FireFox)
    function addCss(path) {    var css = document.createElement("link");    css.setAttribute("type", "text/css");    css.setAttribute("rel", "stylesheet");    css.href = path;    document.body.appendChild(css)
    03-08
  • IE6/7不读取CSS样式,或不能正常显示背景图片问
    最近在做网页的时候出现网页的CSS竟然无法识别,网页显示乱七八糟的,后面竟然发现是因为我在的头部描述当中写了引文引号导致CSS文件无法正确读取,无法识别CSS文件还可能存在其他的问题。网页采用了UTF-8编码格式,这本来没有什么问题,问题是外部CSS文件默
    03-08
  • IE6、IE7、IE8、Firefox、Opera CSS hack区分
    针对样式名如果只让ie6看见用*html .head{color:#000;}如果只让ie7看见用*+html .head{color:#000;}如果只让ff看见用:root body .head{color:#000;}如果只让ff、IE8看见用html/**/body .head{color:#000;}如果只是不让ie6看见用htmlbody .head{color:#000;}
    03-08
  • 华丽的bootstrap3碰到土鳖IE6
          之前由于看好很容易上手的bootstrap,然后用这个框架写了个网站,对于不会美工和细致设计的攻城师来说,bootstrap是个界面设计的瑞士军刀,三下五除二就能搞定个不算太丑的页面。      吭哧吭哧工作了一阵,网站功能基本完工,最后要发布时发
    02-08
  • 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解
     让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在chrome,firefox,safari,opera,360浏览器(极速模式)、搜狗浏览器等浏览器下均没有问题,而在IE8及IE11下发现样式无法显示,
    02-08
  • 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解
    首先需要确保你的HTML页面开始部分要有DOCTYPE声明。DOCTYPE告诉浏览器使用什么样的HTML或XHTML规范来解析HTML文档,具体会影响:对标记attributes 、properties的约束规则对浏览器的渲染模式产生影响,不同的渲染模式会影响到浏览器对于CSS代码甚至JavaScrip
    02-08
  • css 实现层半透明,且块内文字不透明(兼容ie6等各种浏览器)
    css 实现层半透明,且块内文字不透明(兼容ie6
    兼容各浏览器且效果一致,有两种方法:一、使用 opacity + Alpha Filter其实见到这个的时候,我们的第一想法当然是 background + opacity,在不支持 opacity 的 IE 再使用 filter 的 alpha 滤镜来实现。但是如果仅仅只是如此,这个最外层,最内层和文字,
    02-08
  • CSS针对IE6实现网页图片底部留出空白的方法
    又到了对付IE6兼容的时间了,要让img底部留出空白,普通的li写法在IE6下往往会出问题, 下面就关于CSS针对IE6实现网页图片底部留出空白的方法给出一些经验,需要的朋友可以参考下
    05-26 cssIE6留白
  • 使用语义化标签去写你的HTML 兼容IE6,7,8
    下面小编就为大家带来一篇使用语义化标签去写你的HTML 兼容IE6,7,8。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧
  • 让IE6支持兼容min-width、max-width CSS样式属
    这篇文章主要介绍了让IE6支持兼容min-width、max-width CSS样式属性的方法,需要的朋友可以参考下
点击排行