前边介绍JavaScript的简史,本章我们介绍另一个跟HTML形影不离的技术CSS,它的存在感视乎没有JavaScript那么强。如果说JavaScript是用户交互的发动机,那么CSS应该就是衣服了,主要工作是修饰网页。
当您想到HTML和CSS时,您可能会认为他们是一个共同体。事实上在TimBerners-Lee于1989年首次创建万维网之后的多年中,没有发明过CSS之类的东西,最初的HTML根本无法使用样式修饰网页。
WWW邮件列表的存档中埋藏着一个臭名昭著的帖子,它是由MarcAndreessen(网景浏览器联合创世人)于1994年编写的。在帖子中,Andreessen表示,由于无法用HTML对网站进行样式设置,因此当被问及视觉设计时,他唯一可以告诉Web开发人员的是“很麻烦。”在10年后,CSS逐渐被一个新的网络社区全面采用。这期间发生了什么事?
关于如何修饰网页历史上很多人提出过很多质疑,但是,对于Berners-Lee来说,这并不是优先考虑的事情。相反,很多社区的网页开发人员提出过几种技术选型方案,其中最著名的是Pei-YaunWei,Andreesen和HkonWiumLie。以Pei-YuanWei为例,他于1991年创建了图形化的ViolaWWW浏览器,并且将自己的样式表语言集成到了浏览器中,他期望将语言变成Web的正式标准。虽然最终没有实现,但是为其后的样式表规范提供了一些启发。
ViolaWWW发布的同时,Andreessen在他自己的浏览器NetscapeNavigator中采用了不同的样式实现方法。他没有创建专门用于网站样式的修饰语言,而是仅扩展了HTML标签元素及其属性。不幸的是,这种方式似乎使得HTML的标签变得极其复杂,看起来像这样:
Thiswouldbesomefontbrokenupintocolumns
Lie认为程序员和设计师都将在单独的样式表中定义样式,浏览器可以充当两者之间的一种中介,并协商差异以呈现页面。css刚刚推出时,业界具有很多争议,争议点就在于刚刚提到的宽松性。
在CSS还只是一个草案的时候,网景的浏览器已经支持了上述提到的具有复杂属性标签的HTML元素,如multicol,layer和可怕的blink标签;另一方面,微软的InternetExplorer已经采用了一些CSS零碎的方式。但是他们的支持参差不齐,有时甚至是错误的。在最初的CSS版本推出五年后,还没有完全支持CSS的浏览器。
事情的转机在Tantekelik1997年加入InternetExplorer之后。他成为了渲染引擎的首席开发人员。从2000年开发第5版开始,elik和他的团队将重点放在CSS支持上。在此期间,elik经常使用他们的浏览器与W3C成员和Web设计人员交谈,以确保它们正确无误。最终,在2002年3月,他们交付了用于InternetExplorer5。第一个完全支持CSSLevel1的浏览器。
最后,dom树和stylerules生成新的rendertree渲染树,然后绘制到浏览器中,展示出来。
上边提到浏览器的渲染机制,可以看到CSS模块负责CSS脚本解析,并为每个Element计算出样式。Webkit使用了自动代码生成工具生成了相应的代码,也就是说词法分析和语法分析这部分代码是自动生成的。这期间经历了以下几个步骤:
css的解析遵循2个原则,优先原则和继承原则。
优先原则:后解析的内容会覆盖前边解析的内容;
继承原则-嵌套的标签拥有外部标签的部分样式,子元素继承父元素的样式。
兼容性问题是网站技术中老生常谈的问题,包括HTML、JavaScript、CSS都会出现兼容性问题。导致这个问题的根本原因是不同的浏览器厂商的内核不同,导致对CSS的解析效果不一致,继而显示效果千差万别。这里不去过分讨论内核不兼容的深层次原理,而是讨论一下大的解决思路,主要包括4个方面,浏览器CSS样式初始化、浏览器私有属性,CSShack语法和第三方插件。
由于浏览器的CSS默认的样式都不一致,所以简单有效的方式是手动定义其默认样式。定义默认样式主要针对父元素,因为子元素会继承父元素的样式,直接定义父元素的样式简单便捷,例如:
有些浏览器的内核有自己特有的CSS样式,这种样式只能被自己识别,利用这种特性可以定义一些CSS样式用于兼容特有的浏览器版本,例如:
引入第三方库可以解决一些兼容性问题,方便快捷,成本较低,使用时只需要通过引入其CSS库文件即可,不过具体是否能解决百分之百的兼容性问题还需要具体使用测试。以下列举一些第三库: