CSSASSCSSASSCSSASS

三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之
三人行必有我师焉,择其善者而从之,其不善者而改之

“CSS”目录存档

浅谈辄止:line-height和vertical-align

2010年01月5号,星期二

line-height可以应用在所有元素上。
但尽管line-height可以加在block元素上,实际起作用的却是内部的inline元素或textnode节点。

另外,line-height属性可继承。

非可置换inline元素没有height;每一行的高度就由line-height决定。
而对于可置换inline元素,他本身其实是有内在高度的,将不受line-height影响(ie7是个例外)。

但这点性质,似乎正在改变。
css2.1也如是说:对于block,inline-block(可置换inline元素就是天生的inline-block元素), line-height是做为其minimal height的。那当高度小于line-height时,是理应起作用的。
我们使用html5的doctype声明:

在上面的例子里,除了ie6,这里的line-height在其他浏览器都能起作用。
总之,单纯设置外层height=line-height使image等可置换元素垂直居中,在ie6下是行不通的——如果要考虑ie6,请记住这一点。
那么,如何才能做到inline元素(包括可置换inline元素)的垂直居中,并且推而广之应用在block元素上呢?我们可以利用vertical-align属性。

现在先摘要说下vertical-align属性。
在CSS Specification中,line-height属性和vertical-align属性就是放在一起做介绍的。
Line height calculations: the ‘line-height’ and ‘vertical-align’ properties

vertical-align的默认值是baseline;
与line-height不同,vertical-align只能用在inline元素(还有’table-cell’ 元素)上
vertical-align属性在各个浏览器下都有不少的差异。参见:http://www.mikkolee.com/13

不过,我们要用到的属性middle在各个浏览器解释中却没有什么差异(或只有微小的差异)。
让同行的inline元素按中间线对齐,我们给各个inline元素加上vertical-align:middle;

接着我们要相对外层做垂直居中。
假如,内部的一个inline元素(当然是可置换inline元素,或是设置了inline-block的元素——这二者其实是一样的)的高度也达到外层的高度,那么就可以保证内层所有的inline元素都垂直居中了。
所以我们可以设置这样一个空元素pillar。

是不是很熟悉啊,我们“未知尺寸元素的垂直居中”的一个方法就是从这里衍生而来的——那是针对block元素的居中:http://www.cssass.com/blog/index.php/2008/36.html
做法就是将block元素变成inline-block,或者干脆使用某一inline元素包住block元素(尽管这不符合标准),然后再使用上面的方法。

关注标准CSS之外的世界

2009年10月23号,星期五

如果你打开w3.org,你一定会发觉这个W3C网站已经经过了改版,一改往日古董级的UI。
各个标准也一样,如果不是什么大的变化,我们往往忽视他们的不断扩展。

CSS标准,从1.0到2.0到2.1,特别到现在火热的CSS3(尽管没有普遍实现),已经增加了很多的东西。
而很多扩展的内容,他们从哪来的?还不是各个浏览器厂商制定和实施的各种非标准的私有属性——所以说有时候浏览器大战还是有积极的一面的,如果光靠W3C,或单独一个组织闭着关想,指不定想出啥中看不中用的东西来呢。

所以,我提供几个路口,希望大家一起看看标准css之外的世界。

————–
微软ie支持的CSS属性(包括标准和非标准)
对比下这个(css2中文手册)
有很多当年MS的推荐属性,已经成为W3C的CSS3属性了。

微软的扩展属性(非标准,不过一些已在W3C审议中)

ie8要成为一个标准浏览器,也将自己的扩展属性带上了前缀-ms-。不过,不带前缀在ie8下解释也是可以的,向后兼容(backward)么。
如:
zoom:10;可以写成-ms-zoom:10;
(这个属性可不是光用来触发haslayout的。所以对抛弃了haslayout的ie8来说,也是有用的。)
filter: alpha(opacity=20); 可以写成 -ms-filter: “alpha(opacity=20)”;
(对于滤镜属性比较特殊,注意后面的引号。)

————–

Mozilla/FireFox支持的css属性(包括标准和非标准)

Mozilla/FireFox的扩展属性

Mozilla的扩展属性成为css3属性最有名的就是-moz-opacity
现在可以直接写成:opacity了。在safari,opera,chrome等浏览器上均支持。
不过在ie上还是不支持,而使用自己的滤镜filter: alpha(opacity=20);。

————–
webkit/Safari支持的css属性(包括标准和非标准)

webkit/Safari的扩展属性
webkit/Safari的扩展属性中文资料(很详细)
————–

Opera9.5的css支持表

列一个opera扩展属性的例子:文字超出显示省略号

说说HTML5

2009年09月4号,星期五

html5如何而来?
HTML isn’t a very good language!它亟待改进。
因此,1999年W3C停止了HTML的工作,2000年发布xhtml的第一个推荐版本。
2002年W3C发布XHTML 2.0第一个草案,令人吃惊的是:XHTML2.0不是向后兼容的Web 的未来:XHTML 2.0(2003.1.1))。
随着XHTML的越来越火,绝大多数人都认为它将是web的未来。然而终于有些人坐不住了,面对W3C对HTML的持续冷淡,2004年,由Apple, Mozilla Foundation 和Opera Software组成了The Web Hypertext Application Technology Working Group (WHATWG),致力于发展HTML和创建Web applications所需的APIs。他们开始制定Web Applications 1.0 规范,这也就是后来HTML5。
WHATWG的努力没有白费,这份规范的草案在2007年通过了W3C的审核。
W3C组织了HTML工作组,并在2008年1月22日公开了第一份草案。
2009年7月2日,W3C宣布在年内停止XHTML 2的工作,而将资源投入转向HTML5工作组。(XHTML 2 Working Group Expected to Stop Work End of 2009, W3C to Increase Resources on HTML 5
在标准化的春风吹满神州之际,xhtml2却溘然而止,HTML5取代上位,我们广大的web工作者是不是需要做什么呢?

我们不需要做什么!
HTML5 的目标是保持HTML当前标准HTML4.01和HTML的XML版本XHTML1.0 向后兼容。
同以前的HTML4一样:它没有名称空间或模式、元素不必结束、浏览器会宽容地对待错误。
对于XHTML1,它也没有什么排斥。
相反的,XHTML2才是不向后兼容的。
所以,我们并不需要非得做什么改变,才能适应在HTML5下面的页面工作。
当然HTML5不会仅仅如此而已,只是HTML5是想让不支持它的浏览器中能够平稳地退化。
随着浏览器的缓慢升级,HTML5的真正好处才会开始慢慢体现,当别人的网页通过html5实现了越来越多的功能之后。到时,你再虑是不是需要做什么——理论上讲,也是不晚的。
我们不需要做什么,但我们可以做的更多

HTML5能做什么?
一句话:很多!HTML5还在草案阶段,他的功能仍将扩展。
首先,我们应该知道,html5已经不只是Hypertext Markup Language,它更是一种Web Hypertext Application Technology。

1. html5增加了一些结构性(Sections)元素:header,footer,nav,section,article,aside,用来替代千篇一律的div布局,非常语义化。

2. 还有meter(数值尺),progress(进度表),mark(标记)这些语义内联元素。通过自带的属性,可以进行很直接地描述。

3.一些交互元素。details(脚注),datagrid(网格控件——可动态显示树、列表和表格),menu和command(可以做交互菜单)

4. 媒体元素video,audio,source。不需要借助第三方插件,页面就能播放多媒体。

5. canvas元素。脚本绘图,它的最终目标是flash般的动画展示和交互体验。不要以为很遥远,canvas在FireFox1.5就有了,opera,safari也是一样支持甚早(这个标签是就是苹果的发明)。

6. 表单处理功能。HTML5吸收了WHATWG之前的Web Forms 2.0。验证数据是如此简单。

7. 页面元素的拖曳和编辑。

8. HTML5的离线存储技术 http://dev.w3.org/html5/webstorage/

好了, HTML5能做的够多了,但他还处在草案阶段,那关键是现在我们能做什么呢?

我们能做什么?
HTML5估计能在2012年之前成为W3C的候选推荐标准,不过在这之前,只要浏览器支持,我们都可以使用html5的功能。

1. HTML5新元素布局。
除了ie系列浏览器外,其它大多数浏览器都能识别HTML5的那些新元素标签,可以对其进行style,这就意味着它们可以使用HTML5的新元素标签进行页面布局。
但问题是ie系列浏览器是无法对其不承认的元素添加样式的,而缺少了IE的支持,大多数人都会束手束脚。解决这个问题的方法早已经了:HTML5 Shiv
很简单:

  1. <script>
  2. document.createElement("元素名称")
  3. </script>

创建文档元素。
批量创建的方法:

  1. (function(){
  2.     if(!/*@cc_on!@*/0) return;    
  3.     var html5 = "abbr,article,aside,audio,bb,canvas,datagrid,datalist,details,dialog,event,source,figure,footer,hgroup,header,mark,menu,meter,nav,output,progress,section,time,video".split(',');   
  4.     for(var i = 0, len = html5.length; i < len; i++ ) {       
  5.     document.createElement(html5[i]);  
  6.     }
  7. })
  8. ();

现在在IE里也可以对HTML5元素进行布局了。
不过,在此之前,我们还需要对这些新元素定义基本的Display style,
这个工作本来一般是由浏览器完成的,比如FireFox的html.css。
现在只能自己对引进的HTML5元素进行定义了。
那么哪些需要定义成display:block;哪些又是不需要呢?这个我们可以看下W3C是怎么定义的:display-types

  1. address, article, aside, blockquote, body, center, dd, dialog, dir,
  2. div, dl, dt, figure, footer, form, h1, h2, h3, h4, h5, h6, header,
  3. hgroup, hr, html, legend, listing, menu, nav, ol, p, plaintext, pre,
  4. section, ul, xmp { display: block; }

刨除HTML老元素,以下这些元素:
article,aside,dialog,figure,footer,header,hgroup,nav,section可以定义为{display:block;}
这篇针对HTML 5 Reset Stylesheet的文章也可以参考下:http://html5doctor.com/html-5-reset-stylesheet/。文章在Eric的CSS Reset的基础上考虑HTML5新元素及W3C规范推荐下对元素进行了style reset。当然reset CSS本身就存在争议的,一般来说,reset CSS是你自己的style,很多东西都可以按你的意愿来定,当然不要太偏离W3C的元素设计本意。
接下来,使用HTML5新元素进行布局就可以随心所欲了(还是悠着点好)。

2. Drag & drop
Drag & drop是浏览器支持度比较高的HTML5内容:

3. canvas
我们先看一些canvas的示例:
http://www.agustinfernandez.com.ar/proyectos/canvas/
http://www.whatwg.org/demos/2008-sept/color/color.html
网上还有一些互动性蛮强的Demo.
canvas应用的发展无疑将威胁到也行进在富Web之路上的Flash和Silverligth这些Web插件。

canvas在safari,firefox,opera很早就有了支持,但IE缺迟迟不予支持,尽管他在ie8中已经开始支持多个HTML5功能。MS的同志很有理由这么做:“HTML 5标准制定之前,某些功能确实已经得以实现,例如Google Gears实现了离线应用程序功能,Flash和silverlight实现了类似Canvas API的功能.在下一代HTML规范中设置这些内容未必非常必要”。要知道MS在silverlight是花了很大力气。事实上,MS在参与HTML5之事上一直非常谨慎,并且希望精简HTML5。
Flash的所有者,HTML5参与者之一Adobe则表现的很轻松:“canvas还很弱,HTML 5 + CSS 3 可能要 10年的时间才能定稿,在这期间,Flash 会持续发展,并提供更好的用户体验”。

尽管IE没有支持canvas功能,但我们可以使用JS模拟达到:
http://excanvas.sourceforge.net/
这是其中的一个Demo,试试你的IE:
3Dcanvas_For_IE.html

4. audio and video
使用FireFox3.5看看下面这个Video Demo。

我们没有引入flash播放器就能播放swf。

在下面这个页面里罗列了各浏览器所支持的HTML5功能:
Implementations in Web browsers
随着浏览器的升级,翻新,他们支持的东西会越来越多,提供给我们前端工作者发挥的空间也越来越大。

关于ie8和它的ie developer tools

2009年08月23号,星期天

ie developers tools对于页面工作者来说,是个不错的调试html,css,js的有利工具,特别是ie8下的ie developers tools,已有媲美Firefox下的Firebug之势。
许多开发者担心升级ie8后,将无法使用ie7预览页面,其实根本不用担心这点,ie8下的ie developers tools可以选择浏览器模式来切换预览ie7的页面效果。

装上ie8后,按F12可以打开i developer tools(这个工具在ie8正式版下是附带的)。它的菜单栏的最后两项便是:浏览器模式和文本模式。
我们可以试一段代码:

你可以试着切换各种模式查看页面效果。
mode.jpg

IE developer tools可以说已经是今非昔比了。Firebug的很多好东西他学会了,而且还具备了很多firebug所没有的一些实用工具。下面我一一道来:

1. CSS的选择性修改和预览。以前的ie developer tools可以增加样式,但要修改原有样式,需要写新样式来覆盖。而且,样式不能选择性屏蔽。现在的这项功能虽然界面上很绌,但同firebug一样方便有效。
style.jpg

2 DOM结构修改。这个也是ie8下developer tools新招,尽管firebug早就有了。
除了HTML元素标签,都可以直接修改(相比firebug,ie8还可以直接修改class,id及其它html属性项),使用alt+E则可以进去修改全部(包括HTML元素标签——同Firebug)。
edit.jpg

3 DOM结构的查找。不过没有高级搜索,搜索范围是所有html标签,id、class名,textNode,即整个源文件。查找的的会高亮显示。
search.jpg
firebug上有个扩展插件叫Firefinder,查找起来应该更有针对性。

4.ie developer tools上还有三个额外的工具:一个是浏览器屏幕尺寸调整工具,一个是取色器,还一个是标尺工具。
tools.jpg

5.还有,ie developer tools的js调试功能也已经可以媲美firebug了。

关于ie8的一些事:
1. 装了ie8后,你原来的傲游,世界之窗等浏览器会使用什么内核?
我相信是ie8内核,但他们对于html+css的解释,应该是按ie7浏览器模式(或则更有可能是ie8兼容模式)来解释的。
傲游浏览器可以在max:config的高级选项中进行设置更改是否采用ie8标准渲染模式。

2. 关于针对ie8的hack
对区别ie6,ie7,ie8来说,前面的测试代码里已经可以看出,”_”和”*”在ie8下都不能识别,那剩下就是怎么区别ie8和FF了。其实,对于html+css的解释,ie和ff很少会出现差异。当然,留这么一手,还是有必要的。
“_”hack针对于ie6;”*”或”+”hack针对于ie6,ie7;”\9″hack则针对于ie6,ie7,ie8有效,剩下的没加hack的就是给FF的了。
测试如下:

3.用ie8浏览网页,在地址栏后头还可能跟着一个按钮——兼容性视图按钮(浏览本地页面文件似乎不会出现这个按钮)。点击这个按钮,网页就进入ie8浏览器兼容模式下的ie7文本模式。
compatible.jpg
如果网页中被加入了<meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE7″ />这句,说明网页已经采用ie8浏览器兼容模式下的ie7文本模式进行渲染了,就不会出现这个按钮。

4.ie8抛弃了haslayout私有属性?
前面说ie和ff很少会出现差异,我觉得很大原因因为是ie8抛弃了haslayout。
我们看一个由于haslayout引起的各浏览器的差异显示:

大家都知道,浮动元素应该是脱离文档流的,但是zoom:1会触发haslayout。所以在ie下,原本是应该脱离文档流的浮动元素仍然占据着文档空间,除非去除zoom:1;(注意对比FF和IE看看背景色的位置)。
然而我们会发现,ie8的效果一直同FF保持一致,并没有受haslayout影响。
可以再参考下这里ie私有属性haslayout的困扰

5.还发现ie8的一个小功能,是Firefox3.5所没有的。ie8可以忽视当前页签下的alert弹出框,在不关闭此弹出框的情况下就可以切换页签。
这个功能在遨游2.5和sougou浏览器也拥有。

斯芬克斯之谜续——IE下失效的margin-left/right

2009年05月26号,星期二

margin-left/right也会失效?
一般很多人遇到的margin失效都是纵向上面的:
一种情况是元素的确不支持margin-top/bottom(参看:关于margin-top/bottom在inline元素(non-Replaced)上不起作用的解释);
另一种情况则是元素产生了margin叠加(参看:如何避开麻烦的margin叠加(margin collapsing))。

那么margin-left/right怎么又会失效的呢?假如看过斯芬克斯之谜-IE私有属性haslayout的困扰那篇文章的童鞋,就会了解了:哦,又是haslayout啊。

我们来看看具体的失效代码:

我们会发现:.cont的margin:0 30px再IE下失效了。。。
好,既然说haslayout的问题,那么,我们知道,height属性会触发haslayout。去除.cont的height试试,果然margin-left/right起效了。
不过,不要急,我们可以消除触发子级元素的haslayout来解决失效,也可以给父级元素触发haslyout来解决这个问题:在.wrap上增加属性:zoom:1;
那么,所有谜团都在这里了吗?
我们试试,不改动其他属性,去除父级.wrap上的border。我们发现,margin-left/right也不会失效了…
(看来,border这个属性,还得多加研究啊。之前也遇到过类似border引起的问题的。。。)
haslayout的一点资料可以看这里:On having layout抄录

HTML的dir属性和<bdo>标签及其他一些CSS文字排版属性、滤镜

2009年04月14号,星期二

先看一下HTML4.0中定义的dir属性.对应有两个值ltr(默认值)和rlt。分别表示文本从左向右显示(dir=ltr)和文本从右向左显示(dir=rtl)。
文本从右向左显示的情况(dir=rtl)是考虑到一些特殊的文字书写方式(如古中文,希伯来文——但是我们古中文可不止是从右到左,还是从上到下书写的呢)。
先看一下Test

从这里看,觉得这和css的属性text-align:right,或则HTML中不推荐使用的属性align=right并没有什么区别啊。

这是因为受到了“各种用于语言编码的和显示的Unicode和ISO标准”的影响。整段文落都当成一个不可分割的整体了(不管是什么文字的)。
象数字和一些符号就能按空格分隔反排,体现出“从右向左”的显示:

除此之外,这个属性还能在ie下改变滚动条的位置,你见过滚动条显示在滚动内容的左侧的吗?
用ie看看下面的效果吧:

综上也可以看出,dir这个属性其实并不怎么好用。幸好我们也基本用不上这个属性。
要用我们也最好结合<bdo>这个标签来使用。

<bdo>标签必须要带dir属性一起使用。他产生的效果就不论是什么文字字母符号,都以单个字符为单位,颠倒顺序,从右往左显示(我们可以称为“反排效果”),很彻底啊,我们可以看到,连连续书写的英文字母都被反写了。

现如今web标准化的春风吹遍大江南北,我们也要与时俱进,贯彻落实结构和表现分离的思想方针,加快发展可扩展性良好的web建设。
所以,除了语义化的结构外,我们还推荐将结构之外的表现用CSS属性来实现。
前面提到的html属性dir和<bdo>标签所能达到的反排效果,我们也可以使用两个CSS标准属性来实现。
第一个CSS属性:direction : ltr | rtl | inherit ——效果对应HTML属性dir。
第二个CSS属性:unicode-bidi : normal | bidi-override | embed——其中的bidi-override属性值效果对应<bdo>标签。

之前我们还说道古中文的写法并非只是单单的从右往左书写,同时也是由上往下书写的。那么有没有html属性或css属性能达到这个效果(可以称作文字竖排效果吧)呢?
css属性倒的确有,还不止一个。但很遗憾,都只是MS的推荐属性,并非W3C的标准属性。所以只有IE系列(ie5.5+)浏览器支持。
这两个属性分别是:
writing-mode : lr-tb | tb-rl ;
layout-flow : horizontal | vertical-ideographic ;

稍微演示一下

个人觉得这两个属性,几乎没什么差别。。。
另外,当其高度不设定时。如何自适应的高度,很是令人迷惑。

再提一个不标准的东西——镜像翻转滤镜——只做了解,不建议使用。
前面我们有一个文字反排效果,那是排版上的。而使用这个滤镜呢,不单是排版上反过来了。连文字的显示都反过来了(镜像翻转效果)。——当然只支持ie系列(ie4+)。
滤镜有两个,一个是水平翻转滤镜:fliph。一个事垂直翻转滤镜flipv。
注:使用这个滤镜需要触发haslayout.

提到这个翻转镜像效果,倒想起了自己之前的一个娱乐之作:重型7级absolute单层1像素真实web2.0渐变风格倒影字效果(全兼容)

文章到这里,我们已经提到了关于页面,文字排版相关的html属性,html标签,CSS属性以及CSS滤镜。除此之外,可以改变文字排版方式(文字反排)的还有一个RLO符。
请看:

这个RLO符的unicode编码是:202E 。字符实体编号是:8238
可以参考这篇后文:JS实现字符unicode编码信息查询

最后,我们还要提一个由字体产生的文字侧倒的效果。
运行下如下代码:

这个相信一些修改过QQ聊天字体的童鞋们也发现过,选择QQ聊天字体里这类前面带@符的字体就能打出侧倒的文字。
不过,这浏览器下显示,会有一些差异。比如FF下不支持,(我的)safari下不支持@宋体。
另外,还有些人反映自己的自己上根本没有效果。