Archive

Email中的CSS支持统计

在各种Email客户端中,很多CSS是不支持的,有人做了个统计,可供参考一下:

http://spreadsheets.google.com/ccc?key=pcUq0qEaamjm9E_brKwXECQ

浏览器解析CSS

浏览器是怎么解析CSS的呢?
首先让我们来认识一下CSSStyleDeclaration,DOM CSS的一员,也是分量最重的一个。所有的CSS都会被解析到CSSStyleDeclaration中,你可以通过它去读取CSS属性更改CSS属性。

无论你在哪里写CSS,无论你写了什么CSS,浏览器最后都会解析成一个或数个styleSheet,每个styleSheet又包含一个或多个cssRule,每个cssRule又包含零个或一个或多个style(即CSSStyleDeclaration)。这些CSSStyleDeclaration会和其他styleSheet中CSSStyleDeclaration以及相应标签中的CSSStyleDeclaration进行比较,根据权重的不同,最后生成computedStyle即最终我们所看到的样式。

举个例子:
<style type=”text/css”>
@import url(print.css);
b{color:yellow;}
</style>

上面的代码就会生成一个styleSheet,这个styleSheet中有两个cssRule,分别是“@import url(print.css);”和“b{color:yellow;}”,第一个cssRule中没有style(会有一个子styleSheet),第二个cssRule中包含一个style是“color:yellow;”。
注意:每个style标签都会生成一个独立的styleSheet。

另外需要说明的一点,也是容易混淆的一点:
其他标签中的style属性中的CSS不能看作是真正的CSS本身,如:<b style=”color:red”></b>,它只是标签style属性的数值,浏览器会根据这个值去更改真正的CSSStyleDeclaration。

其实大家平时经常在和CSSStyleDeclaration打交道,比如:this.style.display=”none” ,这条JS通常我们会简单的理解成更改this对象的style属性中的值,即style=”display:none”,事实上没那么简单。
从底层来说,这条JS是用来更改CSSStyleDeclaration的,这条语句中的style实际就是CSSStyleDeclaration,浏览器首先通过这条JS更改CSSStyleDeclaration中display的值,然后CSSStyleDeclaration的cssText值会跟着被修改,最后才传达到this标签的style属性。
这也是为什么this.style.color=”red!important”无法更改color值的原因,!important只是在生成computedStyle时比较CSS权重用的,CSSStyleDeclaration中的color值不会有!important的,如果给它了,会被认为是非法值,因此this.style.color=”red!important”是无效的。

更改CSSStyleDeclaration可以有多种方式,上面的this.style.display=”none”就是一种,也是最常用的最简单的一种,在某些特殊情况下我们也可以这样来改变:this.style.cssText=”display:none” 或者 this.setAttribute(”style”,”display:none”)(不过IE不支持setAttribute(”style”,”"))。
这里this.setAttribute(”style”,”display:none”)又是另外一种情况了,它先去更改style属性的值,然后再更改CSSStyleDeclaration的值。

[说的有点混乱,有什么问题就一起探讨吧,希望都能有所收获]

FF3 Input height bug?

在Firefox3中发现一个灵异的现象,如果给input设置了height和padding,在普通情况下不会有什么问题,但是如果input出现在iframe里的页面中有时候就会导致input的height不正常。

在项目中,我把程序生成的页面另外保存了一份,iframe设置同样的src,里面的input居然正常了。检查了文件编码和HTML代码,以及CSS,没有发现任何异常。

在官方的bugzilla中也找到了某人提的bug,但没有出来解决方法,你可以用Firefox3访问这个地址:
https://bugzilla.mozilla.org/show_bug.cgi?id=398959
https://bugzilla.mozilla.org/attachment.cgi?id=341749
https://bugzilla.mozilla.org/show_bug.cgi?id=403558
https://bugzilla.mozilla.org/attachment.cgi?id=288409

测试:

更灵异的事情发生了,以上测试,单独写一个页面是不会出现问题的,点击上面的“View”弹出的页面中,无论FF3还是FF2都会出现height不正常。

单独写一个页面是什么效果?可以看这个:
http://blog.xhlv.com/lab/ff_input_height_bug/index.html
http://lab.xhlv.com/ff_input_height_bug/index.html

两个一模一样的页面,在不同服务器上,有的会出现bug,有的不会出现,有时会出现,有时不会出现,郁闷。。。。

Why???

(暂时的处理方法是:去掉height,只用padding….)

display,position,float有啥特殊关系?

float,display,position是啥东西,这里就不说了,主要来谈一下几个比较特殊,也比较有意思的关系。

一、当float为left或right时,无论是否设置display:block,浏览器都会当成block来处理。当浮动对象有左右margin且display:block时,IE6中会有双倍margin的bug,这时需要加display:inline来解决这个问题。

二、当positon为absolute时,float的属性就会失效,display的属性也会变成block。

三、如果是body,html,会出现上述情况吗?测试发现,即使不给它们float:left或position:absolute,也会类似出现上述情况。也就是说,就算你给body一个display:inline属性,并且float:auto;position:static,body也不会乖乖的inline的;只给一个float:right,也是无效的。

非collapse border的empty-cells该如何show?

当border-collapse:separate时,对一个空的td,在IE中是显示不了边框的,如果想让他显示边框,加“&nbsp;”是一个不错的选择,那么还有其他方法可供选择吗?

在td不是很多的时候,还可以这样处理: