zoukankan      html  css  js  c++  java
  • 避免使用CSS表达式

    http://www.cnblogs.com/chenxizhang/archive/2013/05/01/3053439.html

    这一篇我来和大家讨论个原则:Avoid CSS Expressions  (避免在CSS中使用表达式)

    最早的CSS是不支持所谓的表达式的,微软的IE从5.0开始引入了这种概念,意思是希望我们拥有定义动态的CSS样式的能力,详细的文章请参考http://msdn.microsoft.com/en-us/library/ms537634(v=VS.85).aspx,下面有一个简单的例子:

    background-color: expression((new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );

    这里可以使用一个特殊的expression函数,其实这是一个javascript的函数。它可以进行根据一个表达式进行计算,动态地决定background-color的值。

    看起来是一个相当不错的功能,但我们可能不会想到这个表达式会运算很多次(这个具体的次数可能远远超过你的想象)

    我随便定义了一个界面,并添加了如下的样式定义

        <style>
            body {
                
            }
        </style>

    打开之后,只是鼠标动来动去,或者滚动条上下拖动几下,就会执行1865次。如下图所示

    很显然,这是很可观的一些成本。这还是比较简单的表达式,试想一下,如果有更加复杂的表达式呢?这些函数需要一次一次的执行,毫无疑问地会拖累页面执行的效率,乃至浏览器的性能。

    正因为如此,不光是其他浏览器都不支持,同时w3c标准组织也不支持这种方式。鉴于此,微软方面也于2008年(彼时发布了IE 8)的时候,正式终止了对这种功能的支持。下面这篇文章是当时所发出的声明:

    http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx

    文中提到的三点不再支持CSS表达式的原因,显然是很中肯的(更加符合标准,更加有利于性能提升,以及减少受攻击面

    Why end support for expressions ?

    • To comply with standards
      • Expressions are proprietary to Internet Explorer and as such not interoperable.
      • A common use-case for expressions was to fix IE bugs or to emulate those CSS 2.1 features not yet supported by the browser, for example, min-width and max-width. We have not only worked hard to fix these bugs in IE8 but our new layout engine supports the missing features natively.
    • To improve performance
    • To reduce the browser attack surface
      • Because they expose a script execution context, CSS expressions constitute a possible script injection attack vector.

    那么,情况已经很清楚了,如果你根本不了解CSS表达式,那么恭喜你,你不需要再了解它了。如果你以前用过CSS表达式,而且对它还比较喜欢,那么我也希望你能慎重地考虑一下这条建议,并且毅然地选择放弃这种功能,拥抱标准吧。

    好吧,你可能已经同意了我的提议,但是仍然有一个疑问,那么如果我们真的希望实现动态的CSS,怎么办呢?例如上面这个例子,我们希望根据当前的时间,来决定显示什么背景颜色。(小时为单数时显示一种颜色,为复数时显示另外一种颜色)。

    你在想这个问题是吗?那我们为什么不像下面这么做呢?

        <script src="Scripts/jquery-2.0.0.min.js"></script>
        <script>
            $(function () {
                $("body").css("background-color", (new Date()).getHours() % 2 ? "#B8D4FF" : "#F08A00");
            });
        </script>

    我们不光发现调用次数少了,而且这种代码在所有主流浏览器都能实现一致的用户体验,何乐而不为呢?

  • 相关阅读:
    (二)Maven的使用--安装配置
    (一)Maven介绍
    (二)Monkey自动化脚本
    App测试--专项测试
    Java基础--(三)运算符
    Vue.js 介绍入门
    NodeJS 入门第三天(Express框架)
    NodeJS 入门第二天(EJS模板)
    《前端架构设计》读后感
    NodeJS 入门第一天
  • 原文地址:https://www.cnblogs.com/AmilyWilly/p/4791697.html
Copyright © 2011-2022 走看看