在各种Email客户端中,很多CSS是不支持的,有人做了个统计,可供参考一下:
http://spreadsheets.google.com/ccc?key=pcUq0qEaamjm9E_brKwXECQ
在各种Email客户端中,很多CSS是不支持的,有人做了个统计,可供参考一下:
http://spreadsheets.google.com/ccc?key=pcUq0qEaamjm9E_brKwXECQ
浏览器是怎么解析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的值。
[说的有点混乱,有什么问题就一起探讨吧,希望都能有所收获]
在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….)
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,也是无效的。
按钮的样式有很多,比较简单也比较实用的就是“背景色(或平铺背景图片)+边框”的形式,这里就不讨论这种方式了,比较简单,“background+border”。
让我们来思考一下这种按钮:两边是圆角,中间平铺背景图片。
这种显然不是一个input就能解决的,能想到的有三种方法:
一、<a><span></span></a>
给a一个背景,给span一个背景,然后给a添加按钮行为的JS,在处理表单时比较麻烦(每个按钮都需要添加额外的脚本控制)。
二、<input/><div></div>
给input一个背景,给div一个小背景,需要“float:left”,这种应该更是用些(不需要额外的脚本),也能满足大部分需求(圆角比较小时),是比较推荐的。但是当圆角比较大时,<div>的区域就比较大,虽然模拟出来整个按钮了,但当用户点击<div>区域时是没有响应的,需要另外的脚本控制,和第一种方法相比较就没有多大优势了。
三、<button type=”button”><b></b></button>
这种结构也可以实现,但是发现一个问题,在IE里,button之间加空格“ ”不起作用,加“ ”又间隔太大,暂时还没有找到很好的解决方法。
总结,当圆角比较小时使用第二种结构,当圆角比较大时使用第一种结构。
HTML和CSS都比较简单,这里就不出demo了。