Tag Archive for 'css'

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,也是无效的。

圆角按钮样式的实现比较

按钮的样式有很多,比较简单也比较实用的就是“背景色(或平铺背景图片)+边框”的形式,这里就不讨论这种方式了,比较简单,“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之间加空格“ ”不起作用,加“&nbsp;”又间隔太大,暂时还没有找到很好的解决方法。

总结,当圆角比较小时使用第二种结构,当圆角比较大时使用第一种结构。

HTML和CSS都比较简单,这里就不出demo了。

z-index只是IEbug吗?

z-index和stacking context的关系及back-to-front原则就不再阐述了,可以看这个:http://www.w3.org/TR/CSS21/visuren.html#z-index,这里主要是探讨ie中z-index负值不隐藏的bug问题。

在默认情况下,在body的子级标签中设置z-index为负值、position为relative,FF中隐藏了这些子级标签,而IE/opera等其他几个浏览器中仍然显示。

在FF2中,会有一个有意思的现象:如果给body一个”z-index:0;position:relative”则span就会显示出来。

正常情况下,子级会以它的stacking context为基准,z-index小于0也会在root stacking context上面,这个可以参考stacking levels。

( stacking context是如何产生的?根元素会形成root stacking context,其他stacking context形成的条件是position不为static和z-index不为auto;在新版本的css中,其他属性也可能形成stacking context,如opacity。
每个box都属于一个stacking context。
一个stacking context中各元素在z轴上的显示顺序由stack level决定,相同stack level的定位元素才由z-index决定次序。)

测试z-index的默认值:(IE默认为0,其他浏览器为auto)

结论:
1.IE确实存在bug,z-index默认为0,其他浏览器为auto,另外IE形成stacking context和z-index无关(IE中有这个问题,FF2/FF3/Netscape/safari/chrome/opera正常);
2.FF2也存在bug,“z-index值为负值的定位元素”在父级stacking context的背景下面(FF2/Netscape中都有这个问题,FF3/IE/safari/chrome/opera正常)。

<input type=”file”>文件上传按钮美化

由于不同语言界面中

<input type=”file”>始终是系统默认的文字,无法更改,在IE中可以给它一个border来简单美化一下,但是在Firefox中就无能为力了。

在网上找了一些文件上传按钮美化的,都不是很好,不兼容Firefox。

以下是我的方法(非常简单,且各浏览器都有很好表现):

HTML: