css expression
概述
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时代临时解决方案的产物,在被其创建者无情的抛弃后,我们更应该摈弃这种较为丑陋的代码方式,采用更优的解放方案。
参考
css expression的更多相关文章
- 实现最小宽度的几种方法及CSS Expression[转]
实现最小宽度的几种方法及CSS Expression[转] 实现最小宽度的几种方法:css表达式尽量不用 支持FF IE7 IE6 .test { background:blue; min-widt ...
- CSS expression属性
expression属性是在IE5版本之后支持使用的,用来把CSS属性和JavaScript脚本关联起来.简单粗暴的说,该属性是用来调用JavaScript代码的. CSS属性后面是一段JavaScr ...
- IE css expression(表达式)
很多时候我们需要对IE6的bug写一些hack,如max-height,absolute元素高度100%等. css里面的 expression(表达式)和js里面的差不多,如: 获取当前元素的高度: ...
- 让IE6支持position:fixed的方法,CSS expression与JavaScript eval讲解
做吸顶效果或是固定效果时,使用position:fixed无非是最方便的,可是万恶的IE6是没有fixed这个属性值的,而我们要使IE6能够像fixed一样固定在浏览器中的某个位置,使用onscrol ...
- css expression explaination
http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx 据说已经被弃用的IE css写法,为了修复一些IE8及老版本 ...
- 你不知道的css中的expression
expression是在IE5版本之后支持使用的,用来把CSS属性和Javascript脚本关联起来,[这里的CSS属性可以是元素固有的属性,也可以是自定义属性.]是动态设置CSS属性的强大方法,但也 ...
- 【干货分享】前端面试知识点锦集02(CSS篇)——附答案
二.CSS部分 1.解释一下CSS的盒子模型? 回答一:a.标准的css盒子模型:宽度=内容的宽度+边框的宽度+加上内边具的宽度b.网页设计中常听的属性名:内容(content).填充(padding ...
- 面试题HTML +CSS
HTML+CSS部分1.行内元素和块级元素?img算什么?行内元素怎么转化为块级元素?行内元素:和有他元素都在一行上,高度.行高及外边距和内边距都不可改变,文字图片的宽度不可改变,只能容纳文本或者其他 ...
- CSS表达式
一直以来我们被教育说CSS Expression是个坏东西,很影响性能,应该禁止使用,但是如果仔细想想CSS表达式影响性能的原因,规避掉影响性能的写法,CSS表达式还是能给我们带来一些惊喜的.CSS表 ...
随机推荐
- error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不匹配值“2”
error: vtkCommon.lib(vtkSmartPointerBase.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不 ...
- mysql 启动错误
错误提示如下: 150815 20:24:40 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended150815 20:2 ...
- 【Python】python list 迭代删除
最好方式使用filter,代码示例: def _filter(self, item): ): return False return True #lambda e:e%!= data['items'] ...
- 【转】windows下安装和调用curl的方法
本文转自:http://1316478764.iteye.com/blog/2100778 curl是利用URL语法在命令行方式下工作的开源文件传输工具.它支持很多协议:FTP, FTPS, HTTP ...
- iOS7 中的statusbar的隐藏和样式更改
ios7以前,如果想要隐藏statusbar,需要用到[UIApplicationsharedApplication].statusBarHidden = YES; 或者在plist文件中设定Stat ...
- codeforces B. Flag Day 解题报告
题目链接:http://codeforces.com/problemset/problem/357/B 题目意思:输入n个人和m场舞蹈,给出每场舞蹈(只有3个人参与)中参与的舞者的编号,你需要为这些舞 ...
- 【python】继承时注意事项
1. __init__ 注意事项 如果父类有__init__函数,子类没有,则子类自动调用父类__init__函数 如果父类有__init__函数,子类也有,则子类必须主动调用父类__init__函数 ...
- 编译qt
进入开始菜单Microsoft Visual Studio 2010,Visual Studio Tools,Visual Studio Command Prompt (2010),需要注意的是,这里 ...
- Interger 与 int
int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...
- List Copy
//要复制的实例必须可序列化,包括实例引用的其它实例都必须在类定义时加[Serializable]特性. public static T Copy<T>(T RealObject) { u ...