CSS中expression使用简介

来源:互联网 发布:下载录制视频软件 编辑:程序博客网 时间:2024/05/22 16:55

  IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javas cript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性。就是说CSS属性后面可以是一段Javas cript表达式,CSS属性的值等于Javas cript表达式计算的结果。 在表达式中可以直接引用元素自身的属性和方法,也可以使用其他浏览器对象。这个表达式就好像是在这个元素的一个成员函数中一样。

 

  给元素固有属性赋值

  例如,你可以依照浏览器的大小来安置一个元素的位置。

#myDiv {
position: absolute;
width: 100px;
height: 100px;
left: expression(document.body.offsetWidth - 110 + "px");
top: expression(document.body.offsetHeight - 110 + "px");
background: red;
}

  给元素自定义属性赋值

  例如,消除页面上的链接虚线框。 通常的做法是:

<a href="link1.htm" onfocus="this.blur()">link1</a>
<a href="link2.htm" onfocus="this.blur()">link2</a>
<a href="link3.htm" onfocus="this.blur()">link3</a> 

  粗看或许还体现不出采用expression的优势,但如果你的页面上有几十甚至上百个链接,这时的你难道还会机械式地Ctrl+C,Ctrl+V么,何况两者一比较,哪个产生的冗余代码更多呢?

  采用expression的做法如下: 

<style type="text/css">
a {star : expression(onfocus=this.blur)}
</style>
<a href="link1.htm">link1</a>
<a href="link2.htm">link2</a>
<a href="link3.htm">link3</a> 

  说明:里面的star就是自己任意定义的属性,你可以随自己喜好另外定义,接着包含在expression()里的语句就是JS脚本,在自定义属性与expression之间可别忘了还有一个引号,因为实质还是CSS,所以放在style标签内,而非s cript内。OK,这样就很容易地用一句话实现了页面中的链接虚线框的消除。不过你先别得意,如果触发的特效是CSS的属性变化,那么出来的结果会跟你的本意有差别。例如你想随鼠标的移进移出而改变页面中的文本框颜色更改,你可能想当然的会认为应该写为 

<style type="text/css">
input 
{star : expression(onmouseover=this.style.backgroundColor="#FF0000";
onmouseout=this.style.backgroundColor="#FFFFFF")}
</style>
<style type="text/css">
input {star : expression(onmouseover=this.style.backgroundColor="#FF0000";
onmouseout=this.style.backgroundColor="#FFFFFF")}
</style>
<input type="text">
<input type="text">
<input type="text">

  可结果却是出现脚本出错,正确的写法应该把CSS样式的定义写进函数内,如下所示:

<style type="text/css">
input {star : expression(onmouseover=function()
{this.style.backgroundColor="#FF0000"},
onmouseout=function(){this.style.backgroundColor="#FFFFFF"}) }
</style>
<input type="text">
<input type="text">
<input type="text"> 

  注意

  不是非常需要,一般不建议使用expression,因为expression对浏览器资源要求比较高。

案例:

图虫一直以来有一个严重的IE6崩溃漏洞,困扰了我很久,大概表现为,在IE6下,某些页面点击链接后浏览器crash,是彻底的crash,不是javascript报错。

为此我测试了网页的标签完整性,通过了W3C的XHTML Transitional测试,仍然无济于事。前不久,我逐行检查了一遍javascript,发现将.addEvent(’click’),改成.onclick=function()就能解决。但是仅仅是解决个别出错的情况,还有很多地方会发生crash。

研究了很久才发现,罪魁祸首是ie6.css中使用了expression。

原来,我为了解决IE6不支持position:fixed属性,而添加了一段expression:

left:expression(eval(document.compatMode && document.compatMode==’CSS1Compat’) ?
documentElement.scrollLeft + (documentElement.clientWidth-this.clientWidth) – 1
: document.body.scrollLeft + (document.body.clientWidth-this.clientWidth) – 1);
top:expression(eval(document.compatMode && document.compatMode==’CSS1Compat’) ?
documentElement.scrollTop : document.body.scrollTop);
这段css能帮助IE6把div定位到窗口右上角,并且当滚动条发生滚动的时候,div也跟着移动,并保持在右上角的位置。

虽然这段使用CSS的expression能够解决position:fixed问题,抹平浏览器之间的差异,但是事实上是它导致了IE6在点击链接后崩溃。于是我只能将这段expression去掉,改成在javascript中执行。虽然说在javascript中进行定位,就很难实现滚屏时即时修改div位置,但是考虑用户不会没事找事滚滚屏,同时IE7以及更高版本都是用CSS方式实现,所以javascript解决IE6的方案是可行。

同时还有一个问题是,在IE6下,鼠标移动到链接上之后,a:hover的CSS效果需要等1秒左右才能出现,Firefox没有问题,这也让我很费解。

链接反应迟缓的原因,是由于我对所有a都添加了“hide-focus:expression(this.hideFocus=true)”,如果去掉,链接的反应速度就会即时响应。

以上两个导致IE6迟缓甚至崩溃的问题,都是由于expression引起的。在《高性能网站建设指南——前端工程师技能精髓》一书,规则7避免CSS表达式一章中写道,“在这之后,对于各种时间,如改变大小、滚动、鼠标移动,该CSS表达式都会被求值10次。在页面上来回移动鼠标可以很轻易地产生10000次以上的求值。在这个例子里CSS的危险显而易见。最郁闷的是,在Internet Explorer中单击这个页面中的文本框之后,你就不得不终止这个进程了。”

可见,在CSS中使用expression是web前端的一大忌,尤其是在IE6中,expression可能导致各种不可预见的问题,加之expression不是W3C标准,因此就更加不推荐使用它了。为了避免使用expression而实现相同的效果,在javascript中编写脚本是最佳的解决方案。

为什么尽量不要使用CSS Expression


CSS Expression也称为CSS表达式,它是动态设置CSS属性的强大方法,但也存在着一定的危险性。

在CSS Expression中使用JavaScript表达式。CSS属性根据JavaScript表达式的计算结果来设置。

CSS Expression在其它浏览器中不起作用,因此在跨浏览器的编码中单独针对IE设置时会比较有用。

从IE5开始支持CSS Expression。我们看下面的代码:

background-color: expression( (new Date()).getHours()%2 ? "#F00" : "#00F" );

上面的代码是使用CSS Expression,实现隔一个小时切换一次背景颜色。

CSS Expression的问题就在于它的计算频率要比想象的多出很多。不仅仅是在页面显示和缩放时,就是在页面滚动、乃至移动鼠标时都会要重新计算一次。给CSS Expression增加一个计数器可以跟踪表达式的计算频率。在页面中随便移动鼠标都可以轻松达到10000次以上的计算量。

一个减少CSS Expression计算次数的方法就是使用一次性的表达式,它在第一次运行时将结果赋给指定的样式属性,并用这个属性来代替CSS Expression。

如果样式属性必须在页面周期内动态地改变,使用事件句柄来代替CSS表达式是一个可行办法。如果必须使用CSS Expression,一定要记住它们要计算成千上万次并且可能会对你页面的性能产生影响。不要让您的用户感觉打开你的页面,机器会变的很慢。