Actually,simplicity is not simple

CSS的优先权

优先权问题其实就是一个冲突解决的问题,当同一个元素(或内容)被CSS选择符选中时,就要按照优先权取舍不同的CSS规则,这其中涉及到的问题其实很多。

首先就是CSS规则的specificity(特殊性),CSS2.1有一套关于specificity的计算方式,用一个四位的数字串(CSS2是三位)来表示,最终specificity越高的规则越特殊,在优先级判定时也就越有优势。关于specificity的具体计算在各种情况下的数字加成有如下一般规则:style

  • 每个ID选择符(#someid),加 0,1,0,0。
  • 每个class选择符(.someclass)、每个属性选择符(形如[attr=”"]等)、每个伪类(形如:hover等)加0,0,1,0
  • 每个元素或伪元素(:firstchild)等,加0,0,0,1
  • 其他选择符包括全局选择符*,加0,0,0,0。相当于没加,不过这也是一种specificity,后面会解释。
  • 按这些规则将数字串逐位相加,就得到最终计算得的specificity,然后在比较取舍时按照从左到右的顺序逐位比较。

举一些例子吧:

[CSS]
h1 {color: red;}
/* 只有一个普通元素加成,结果是 0,0,0,1 */
body h1 {color: green;}
/* 两个普通元素加成,结果是 0,0,0,2 */
/*0,0,0,1 小于 0,0,0,2 ,后者胜出*/

h2.grape {color: purple;}
/* 一个普通元素、一个class选择符加成,结果是 0,0,1,1*/
h2 {color: silver;}
/*一个普通元素,结果是 0,0,0,1 */
/*0,0,1,1 大于 0,0,0,1 ,前者胜出*/

html > body table tr[id=”totals”] td ul > li {color: maroon;}
/* 7个普通元素、一个属性选择符、两个其他选择符(子选择符 >),结果是0,0,1,7 */
li#answer {color: navy;}
/* 一个ID选择符,一个普通选择符,结果是0,1,0,1 */
/*0,0,1,7 小于 0,1,0,1,后者胜出*/

除了specificity还有一些其他规则

  • HTML文件内的样式优先级为1,0,0,0,所以始终高于外部定义。这里文内样式指形如blah 的样式,而外部定义指经由< link>或< style>标签定义的规则。
  • 有!important声明的规则高于一切。如果!important声明冲突,则比较优先权。
  • 如果优先权一样,则按照在源码中出现的顺序决定,后来者居上。
  • 由继承而得到的样式没有specificity的计算,它低于一切其他规则(比如全局选择符*定义的规则)。
  • 关于经由@import载入的外部样式,由于@import必须出现在所有其他规则定义之前(如不是,则浏览器应该忽略之),所以按照后来居上原则,一般优先权冲突时是占下风的。

这里需要提一下IE,IE是可以识别位置错误的@import的,但无论@import在什么地方,它都认为是位于所有其他规则定义之前的,这可能会引发一些误会。

所以优先权问题虽然看起来简单,但其背后还是有蛮复杂的机制的,需要多多留意。

文章来自old9, 过不了GFW自己想办法吧!

fixed 定位在 IE6 下的实现技巧一则

从蓝色理想看到这贴:固定在右下角的离奇方法

受上面帖子的启发,也做了一个demo:ie6_fixed_position.html

代码:

[HTML]
<div id="a" style="width: 300px; height: 100px; background: red">test</div>
<script>
    var ie6 = !window.XMLHttpRequest;

    var a = document.getElementById('a');
    a.style.position = ie6 ? 'absolute' : 'fixed';
    a.style.right = 0;
    a.style.bottom = 0;

    if (ie6) {
        window.onscroll = function() {
            a.className = a.className;
        };
    }
</script>

原理分析: * position: absolute的元素,直接放在position:static的 body 中时,绝对定位的参考物是 body 的 viewport 部分。这使得元素 a 在窗口 resize 时,自动就能准确定位到右下角。注意:body 的 position 不能为 relative 等值,否则失效。 * onscroll 时需要特殊处理一下,使得滚动时,也让绝对定位元素 a 的参考物能更新为当前的 viewport. 上面的a.className = a.className就是这样一个 hack: 使得 a 的定位参考物动态更新为当前的 viewport. 类似的 hack 还有a.style.background = 'red'. 这些 hack 会引发 reflow, 但反之不一定,进一步的规律没找到,不过有一个 hack,也就够用了。

耐心总结,快乐分享,欢迎讨论。

转自岁月如歌

局部变量对全局变量修改出现的问题

[javascript]
var x = [1,2,3], o = [];
document.body.onclick = function(){
o[0] = ‘new’;
o = x;
alert(o);
}

这样一段代码你觉得多次输出的结果是一样吗?如果不一样知道为什么吗?

结果是不一样,有点意思噢,第一次结果[1,2,3],但再次点击后结果为['new',2,3]

导致结果不一样又是指针搞的鬼,这不去认真看真不会发觉,第一次o=x后,由于o与x相同,x o被改成同一指针的引用了,相当于o=x=[1,2,3]

要解决这问题把var x = [1,2,3], o = [];这样的全局变量放到内部去就可以了。

[javascript]
document.body.onclick = function(){
    var x = [1,2,3], o = [];
    o[0] = ‘new’;
    o = x;
    alert(o);
}

这样多少点击后的结果也是一样的。

JS中创建RegExp时偷懒可是要受折磨的

我以前做JS的匹配时总是这样使用:

[javascript]
// 比如下面对数字进行匹配的语句
function email(value){
return /^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$/ig.test(value);
}

而不是:

[javascript]
// 比如下面对email进行匹配的
function email(value){
var reg=new RegExp(“^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*(.){1}[a-zA-Z]{2,4})+$”, ‘ig’);
return reg.test(value);
}

这样写,一般下好像没什么问题,但今天我遇到个“很有意思”的问题:在多次刷新看返回结果后,发现结果总是在true、false之间轮回。

如何导致的我到现在也没弄明白,但解决的办法就是像上面那样先用new RgExp创建正则对象,这样返回的结果就没有问题了。可点Demo查看例子(注意,例子中只有email是有问题的!要看到“特效”,你得先在email处写上个正确的 ^ _^////)

我对jQuery、mootools的理解

我接触的第一个JS框架是jQuery,当时还刚发布没多久,版本是1.1.3。使用后我就爱了它,很多东西不用自己去写了,很方便,尤其是对DOM的操作,真的没得说。

但在去年的七月份了解到mootools的存在,并很快喜欢上了;去了解其它的框架也是因为对jQuery越来越不满了,使用jQuery所写的代码在过几个月去查看或除bug时时件很郁闷的事,得看段时间才能明白一行代码都干了些什么,因为jQuery的链式的,一行中有所进行的操作可能有很多。而且jQuery为了“傻瓜化”,对多个与单个之间的区分越来越不明显了;写代码是舒服了,但性能却是越来越糟糕了。看看现在的新手写的代码(其实我自己也是新手 ^_^!),有时让我哭笑不得。

mootools就完全不一样了,对不同类型提供不同的操作函数,代码的可读性、性能等方面更多的是取决于编码的作者,而不是框架本身的优化。mootools是OOP化的,与jQuery是不同概念的物质。用个比喻来比较下两者的话那就是公交车与车零部件的区别:

jQuery是提供了一条又一条公交线路,要到目的地上不同的公交车就可以了,但如果你要去的地方公交线路上没有,你就没办法了,只有坐交公车到离目的地最近的一个站台然后自己想办法;而mootools就不同了,它提供的是车轮子、车门等配件,得自己组装成一辆车,前期可能会辛苦,但一担组装完成了,那想去哪都可能了。

几个星期前有一项目让我真正的使用起mootools,还是有很大的不适应啊!^_^//// 给我最大的感触是mootools的选择器没有jQuery强大,性能也没有jQuery好;mootools中的$、$$、$E、$ES等函数有点晕,感觉有点繁琐了!潜意识又向jQuery倾斜了,哇哈哈!谁叫我最先用的是它呢!(思路跑到可恶的微软上了,让我习惯上了、依赖上了,现要进入linux世界真不容易,谁叫我了解计算机时只知道个windows)

现在工作中愈加发现OOP的思想的好,不管在修改、分离方面都强于一般的纯函数方式。^_^!