概述

  css expression(css表达式)又称Dynamic properties(动态属性)是早期微软DHTML的产物,以其可以在Css中定义表达式(公式)来达到建立元素间属性之间的联系等作用,从IE5开始得到支持,后因标准、性能、安全性等问题,微软从IE8 beta2标准模式开始,取消对css expression的支持。

使用

  微软提供了4个css expression方法:getExpression、recalc、removeExpression、setExpression。有兴趣可以参考msdn

  一般最常用的是直接在css中使用expression,例如:

1 .toTop{
2 top:expression(eval(document.documentElement.scrollTop + document.documentElement.clientHeight - 60)));
3 }

  这是一个返回顶部按钮css代码的截取,用css来将元素定位到屏幕底部的位置。

优点

  css exprssion技术达到了可以使用表达式或公式来定义css属性的目的,msdn上给出了它的几个优点:减少页面上的代码,使设计师无需学习javascript就能实现一些DHTML的效果。个人认为,减少页面上的代码实际上只是减少了相关javascript的代码,而css expression中的代码本身与js是及其类似,设计师无需学习js就能实现DHTML效果这个优点也很牵强,或曰鸡肋。

缺陷

  • .不符合web标准
    css表达式这种在表现(css)中插入行为(js)代码,有悖于web标准的结构、表现、行为相分离的理念。
  • .效率低下
    一个css表达式会反复执行,甚至执行成百上千次。这会大大消耗计算机的硬件资源,极端情况下会导致浏览器的崩溃。
  • .带来安全隐患
    css表达式暴露了一个脚本执行的上下文,可能带来脚本注入的隐患。

  基于以上原因,微软最终从IE8 beta2(标准模式下)开始放弃对css表达式的支持。

实际应用

  早期很多开发人员利用css expression实现了许多效果,比如将元素相对鼠标指针进行定位,根据一个定时器来移动元素等等。当然这些效果能够使用js来实现。

  虽然css表达式问题很多,但是我们依然能够在网上看到它们的影子,甚至在一些成熟的商业网站上。最常见的一个应用就是悬浮在页面上的某个模块(比如导航、返回顶部)。

  我们来看一个常见的返回顶部按钮的代码实现:

  html:

<!doctype html>
<html>
<head>...</head>
<body>
<div id="top">...</div>
...
<a href="#top" id="toTopBtn">返回的顶部</a>
</body> </html>

  css:

#toTopBtn{
position:fixed;
bottom:10px;
right:10px;
_position:absolute;
_top:expression(eval(document.documentElement.scrollTop + document.documentElement.clientHeight - 60));
...
}

  _position和_top是对IE6的hack,因为IE6不支持position:fixed。这里的css表达式的作用是模拟position:fixed,即在将返回顶部按钮固定在页面的底部,不管页面是否滚动、缩放。正是因为css exprssion会执行多次,所以这个按钮元素才会一直定位在页面的底部。当然,我们可以使用javascript来模拟ie6的position:fixed,但细心的同学可能会发现这样一个问题,IE6下的返回顶部按钮会在你滚动页面的时候有较为明显的抖动。而我们使用css expression,这要在css加入以下规则,抖动的现象就会消失:

html{
_background-image:url(about/blank);
_background-attachment:fixed;
}

  而使用js来模拟的,加上这句css规则也是没有效果的。这也应该是很多成熟商业网站现在还在使用css expression的原因。若有较好的实现方案,欢迎讨论。

  但是,根据YSlow提供的网页优化建议:Avoid CSS Expressions,也由于css expression的各种问题,个人不建议使用css表达式。可以和产品人员协商,容忍ie6下这点抖动的瑕疵,或者采用动画来美化这个抖动效果,或者使用另外的一种方式来实现position:fixed,比如:固定页面的高度,让页面内部的内容可滚动,然后将返回顶部按钮绝对定位到底部(采用这种实现方式要慎重,因为或对页面布局和结构造成较大的影响)。

总结

  CSS expression作为web时代临时解决方案的产物,在被其创建者无情的抛弃后,我们更应该摈弃这种较为丑陋的代码方式,采用更优的解放方案。

参考

  About Dynamic Properties

  Ending Expressions

css expression的更多相关文章

  1. 实现最小宽度的几种方法及CSS Expression[转]

    实现最小宽度的几种方法及CSS Expression[转] 实现最小宽度的几种方法:css表达式尽量不用 支持FF IE7  IE6 .test { background:blue; min-widt ...

  2. CSS expression属性

    expression属性是在IE5版本之后支持使用的,用来把CSS属性和JavaScript脚本关联起来.简单粗暴的说,该属性是用来调用JavaScript代码的. CSS属性后面是一段JavaScr ...

  3. IE css expression(表达式)

    很多时候我们需要对IE6的bug写一些hack,如max-height,absolute元素高度100%等. css里面的 expression(表达式)和js里面的差不多,如: 获取当前元素的高度: ...

  4. 让IE6支持position:fixed的方法,CSS expression与JavaScript eval讲解

    做吸顶效果或是固定效果时,使用position:fixed无非是最方便的,可是万恶的IE6是没有fixed这个属性值的,而我们要使IE6能够像fixed一样固定在浏览器中的某个位置,使用onscrol ...

  5. css expression explaination

    http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx 据说已经被弃用的IE css写法,为了修复一些IE8及老版本 ...

  6. 你不知道的css中的expression

    expression是在IE5版本之后支持使用的,用来把CSS属性和Javascript脚本关联起来,[这里的CSS属性可以是元素固有的属性,也可以是自定义属性.]是动态设置CSS属性的强大方法,但也 ...

  7. 【干货分享】前端面试知识点锦集02(CSS篇)——附答案

    二.CSS部分 1.解释一下CSS的盒子模型? 回答一:a.标准的css盒子模型:宽度=内容的宽度+边框的宽度+加上内边具的宽度b.网页设计中常听的属性名:内容(content).填充(padding ...

  8. 面试题HTML +CSS

    HTML+CSS部分1.行内元素和块级元素?img算什么?行内元素怎么转化为块级元素?行内元素:和有他元素都在一行上,高度.行高及外边距和内边距都不可改变,文字图片的宽度不可改变,只能容纳文本或者其他 ...

  9. CSS表达式

    一直以来我们被教育说CSS Expression是个坏东西,很影响性能,应该禁止使用,但是如果仔细想想CSS表达式影响性能的原因,规避掉影响性能的写法,CSS表达式还是能给我们带来一些惊喜的.CSS表 ...

随机推荐

  1. error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不匹配值“2”

    error: vtkCommon.lib(vtkSmartPointerBase.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不 ...

  2. mysql 启动错误

    错误提示如下: 150815 20:24:40 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended150815 20:2 ...

  3. 【Python】python list 迭代删除

    最好方式使用filter,代码示例: def _filter(self, item): ): return False return True #lambda e:e%!= data['items'] ...

  4. 【转】windows下安装和调用curl的方法

    本文转自:http://1316478764.iteye.com/blog/2100778 curl是利用URL语法在命令行方式下工作的开源文件传输工具.它支持很多协议:FTP, FTPS, HTTP ...

  5. iOS7 中的statusbar的隐藏和样式更改

    ios7以前,如果想要隐藏statusbar,需要用到[UIApplicationsharedApplication].statusBarHidden = YES; 或者在plist文件中设定Stat ...

  6. codeforces B. Flag Day 解题报告

    题目链接:http://codeforces.com/problemset/problem/357/B 题目意思:输入n个人和m场舞蹈,给出每场舞蹈(只有3个人参与)中参与的舞者的编号,你需要为这些舞 ...

  7. 【python】继承时注意事项

    1. __init__ 注意事项 如果父类有__init__函数,子类没有,则子类自动调用父类__init__函数 如果父类有__init__函数,子类也有,则子类必须主动调用父类__init__函数 ...

  8. 编译qt

    进入开始菜单Microsoft Visual Studio 2010,Visual Studio Tools,Visual Studio Command Prompt (2010),需要注意的是,这里 ...

  9. Interger 与 int

    int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...

  10. List Copy

    //要复制的实例必须可序列化,包括实例引用的其它实例都必须在类定义时加[Serializable]特性. public static T Copy<T>(T RealObject) { u ...