IE 浏览器中 CSS Expression 特性的最大的问题:会反复执行,每秒钟可能执行了成百上千次,有严重的性能问题。
如何对 CSS Expression 进行优化呢?
至少:如果我们将 CSS Expression 在匹配的元素中仅执行一次,性能将会提升很大。
old9 在 《CSS Expression Reloaded》一文中提供了一个解决方案:
在 CSS Expression 语句体里,将触发该 Expression 的 CSS 属性重置。
例如:
div { zoom: [removed]function(el){el.style.zoom = "1"; ale
**CSS Expression 优化详解**
CSS Expression 是 Internet Explorer 浏览器特有的一种特性,它允许开发者在CSS中使用JavaScript表达式动态计算样式值。然而,Expression 的主要缺点是其性能问题,因为它会在页面渲染和用户交互时频繁执行,可能导致页面响应变慢,特别是在大量使用或者复杂的表达式中。
优化 CSS Expression 的核心思想是减少其不必要的重复执行。在描述中提到的解决方案来自 old9 的文章《CSS Expression Reloaded》。这个方法是通过在Expression的语句体内部,将触发Expression的CSS属性重置为初始值,从而降低执行频率。例如:
```css
div {
zoom: expression(function(el){el.style.zoom = "1"; alert(el.tagName);}(this));
}
```
在这个例子中,`zoom`属性的Expression被设置为一个函数,这个函数在首次执行时会改变`zoom`属性的值,然后立即将其重置回"1"。这样,Expression 就不会在后续的页面渲染中再次执行。
补充几点关于 CSS Expression 的知识:
1. **执行时机**:CSS Expression 在任何匹配规则的元素上都会执行,无论是在页面加载还是在用户交互(如滚动、点击等)时。
2. **上下文环境**:在Expression内部,`this`关键字引用当前匹配的HTML元素,可以用于操作元素属性。
3. **选择触发属性**:为了避免与其他样式冲突,建议选择不常用或自定义的CSS属性来触发Expression,并在执行后重置为默认值。
尽管有这些优化策略,但 CSS Expression 仍然存在性能隐患。在 Dion Almaer 提供的示例中:
```css
div {
-singlex: expression(this.singlex ? 0 : (function(t) { alert(t.tagName); t.singlex = 0; } )(this));
}
```
尽管减少了不必要的执行,但每次触发条件满足时,仍然会执行Expression脚本,这在某些情况下(如鼠标滚轮滚动)仍可能导致性能问题。
值得注意的是,尽管我们可以通过以上方式优化 CSS Expression,但这并不意味着它们没有其他潜在问题。Expression 可能导致浏览器兼容性问题,因为它们不是W3C标准的一部分,并且只在旧版本的IE中支持。此外,它们还可能导致代码可读性和维护性下降,因此,最佳实践是尽可能避免使用 CSS Expression,转而使用更现代的技术,如CSS Variables(CSS 自定义属性)或JavaScript中的事件监听器来实现动态样式更新。