css知多少(3)——样式来源与层叠规则

原文:css知多少(3)——样式来源与层叠规则

  上一节《css知多少(2)——学习css的思路》有几个人留言表示思路很好、继续期待,而且收到了9个赞,我还是比较欣慰的。没看过的朋友建议先去看看上一节。

  这一节就开始实践上一节的思路!

1. “层叠”的概念

  CSS——层叠样式表,其中的“层叠”是什么意思呢?层叠就是浏览器对多个样式来源进行叠加,最终确定结果的过程。举一个简单的例子:

   

       上图中有两个样式来源,第一个是引用的css1.css,第二个是自己在style中编写的样式。“层叠”是个叠加的过程,可通过下图表示:

   

      

       上面用一个简单的例子来说明了层叠的过程,形象的体验一下。

       层叠是CSS的核心机制,理解了它才能以最经济的方式写出最容易改动的CSS,让文档外观在达到设计要求的同时,也给用户留下一些空间,让他们根据需要更改文档的显示效果,例如调整字号。——摘自《CSS设计指南》

2.样式来源

       上文中提到,css之所以有“层叠”的概念,是因为有多个样式来源。其实css的样式来源有5个,开发人员只能接触到后面3个。

  

       第一,浏览器默认样式表

       当你不为html设置任何样式时,显示在浏览器上,b标签会显示粗体、p有纵向margin、h1字号比p大一倍……这是为什么呢?

       因为浏览器自带一个默认的样式,如果html中没有为标签设置样式,则浏览器会按照自己的样式来显示。但是浏览器默认样式的级别是最低的,一旦有其他地方设置了标签样式,浏览器默认样式就会被冲掉。

       注意,不同浏览器的默认样式有些地方是不一样的。例如,我们在写css时,都会首先设置 * {margin:0; padding:0;},这是为何?就是因为有浏览器兼容性问题。干脆,全部弄成0,这样各个浏览器就都统一了。

       此处先把默认样式的代码贴出来 ,我们下一节专门解说默认样式,有很多值得玩味的地方。

 1 html, address,blockquote,body, dd, div,dl, dt, fieldset, form,frame, frameset,h1, h2, h3, h4,h5, h6, noframes,ol, p, ul, center,dir, hr, menu, pre { display: block }/*以上列表元素默认状态下一块状显示,未显示的将以内联元素显示,该列表针对HTML4版本,部分元素在XHTML1中将废弃*/
 2 li { display: list-item }/*默认以列表显示*/
 3 head { display: none }/*默认不显示*/
 4 table { display: table }/*默认为表格显示*/
 5 tr { display: table-row }/*默认为表格行显示*/
 6 thead { display: table-header-group }/*默认为表格头部分组显示*/
 7 tbody { display: table-row-group }/*默认为表格行分组显示*/
 8 tfoot { display: table-footer-group }/*默认为表格底部分组显示*/
 9 col { display: table-column }/*默认为表格列显示*/
10 colgroup { display: table-column-group }/*默认为表格列分组显示*/
11 td, th { display: table-cell; }/*默认为单元格显示*/
12 caption { display: table-caption }/*默认为表格标题显示*/
13 th { font-weight: bolder; text-align: center }/*默认为表格标题显示,呈现加粗居中状态*/
14 caption { text-align: center }/*默认为表格标题显示,呈现居中状态*/
15 body { margin: 8px; line-height: 1.12 }
16 h1 { font-size: 2em; margin: .67em 0 }
17 h2 { font-size: 1.5em; margin: .75em 0 }
18 h3 { font-size: 1.17em; margin: .83em 0 }
19 h4, p, blockquote, ul, fieldset, form, ol, dl, dir, menu { margin: 1.12em 0 }
20 h5 { font-size: .83em; margin: 1.5em 0 }
21 h6 { font-size: .75em; margin: 1.67em 0 }
22 h1, h2, h3, h4, h5, h6, b,strong { font-weight: bolder }
23 blockquote { margin-left: 40px; margin-right: 40px }
24 i, cite, em,var, address { font-style: italic }
25 pre, tt, code, kbd, samp { font-family: monospace }
26 pre { white-space: pre }
27 button, textarea, input, object, select { display:inline-block; }
28 big { font-size: 1.17em }
29 small, sub, sup { font-size: .83em }
30 sub { vertical-align: sub }/*定义sub元素默认为下标显示*/
31 sup { vertical-align: super }/*定义sub元素默认为上标显示*/
32 table { border-spacing: 2px; }
33 thead, tbody, tfoot { vertical-align: middle }/*定义表头、主体表、表脚元素默认为垂直对齐*/
34 td, th { vertical-align: inherit }/*定义单元格、列标题默认为垂直对齐默认为继承*/
35 s, strike, del { text-decoration: line-through }/*定义这些元素默认为删除线显示*/
36 hr { border: 1px inset }/*定义分割线默认为1px宽的3D凹边效果*/
37 ol, ul, dir, menu, dd { margin-left: 40px }
38 ol { list-style-type: decimal }
39 ol ul, ul ol, ul ul, ol ol { margin-top: 0; margin-bottom: 0 }
40 u, ins { text-decoration: underline }
41 br:before { content: "A" }/*定义换行元素的伪对象内容样式*/
42 :before, :after { white-space: pre-line }/*定义伪对象空格字符的默认样式*/
43 center { text-align: center }
44 abbr, acronym { font-variant: small-caps; letter-spacing: 0.1em }
45 :link, :visited { text-decoration: underline }
46 :focus { outline: thin dotted invert }
47  /* Begin bidirectionality settings (do not change) */
48 BDO[DIR="ltr"] { direction: ltr; unicode-bidi: bidi-override }/*定义BDO元素当其属性为DIR="ltr"时的默认文本读写显示顺序*/
49 BDO[DIR="rtl"] { direction: rtl; unicode-bidi: bidi-override }/*定义BDO元素当其属性为DIR="rtl"时的默认文本读写显示顺序*/
50 *[DIR="ltr"] { direction: ltr; unicode-bidi: embed }/*定义任何元素当其属性为DIR="ltr"时的默认文本读写显示顺序*/
51 *[DIR="rtl"] { direction: rtl; unicode-bidi: embed }/*定义任何元素当其属性为DIR="rtl"时的默认文本读写显示顺序*/
52 @media print { /*定义标题和列表默认的打印样式*/
53     h1 { page-break-before: always }
54     h1, h2, h3,    h4, h5, h6 { page-break-after: avoid }
55     ul, ol, dl { page-break-before: avoid }
56 }

浏览器默认样式

        第二,用户样式表

       在一些新闻网站中,经常看到可以设置字体大小的快捷菜单,例如下图就是搜狐新闻中的设置。

   

       这些是给一些有视觉障碍的人看的,反正我是没用过,我也有视觉障碍,不过我是通过近视镜来解决的。

       其实浏览器也有这样的设置,例如chrome浏览器中,我们就可以设置字号和字体。

      

       用户在这里设置了字体和字号之后,它们会覆盖掉浏览器默认的样式。

       第三,<link>引用的css文件

       引用css文件,大家应该都比较熟悉了。

       第四,<style>中编写的样式代码

       <style>中编写样式也都比较熟悉。

       第五,<a style=’ ’>中编写的样式代码

       标签style属性中编写样式,也都用过吧。

      

       后面这三种是咱们程序开发中比较常用的,这里就不多说了,不了解的朋友需要去补一补基础知识了。

3.层叠的规则

  由于样式的来源不同,浏览器在加载样式时,需要计算出最终的样式值,这样才能显示出正确的界面效果——浏览器会通过叠加和覆盖这两种方式来生成最终的样式值。

       下面是举例说明:

   

       如上图,不同来源的两个样式,第一个样式设置了font-weight,第二个没有,浏览器会把它叠加在一起,即浏览器会把各个零散的整合成一个整体。第一个样式color:red,第二个样式color:blue,浏览器会让后者覆盖前者,最终结果还是color:blue。

       覆盖的默认规则是后者覆盖前者,但是又一个特殊情况——!important。

   

       如上图。虽然color:blue是后来者,但是它没有居上,因为前者color:red跟着!important。这就像得到一个尚方宝剑,有最高执行权,其他人统统让路,否则佛挡杀佛。

4.总结

  本文主要讲解了css的5个来源,以及浏览器叠加样式的过程和方法,这是学习css最基础的知识。下一节将带领大家一起看看浏览器默认样式到底是什么样子的,我们又能从其中学到些什么东西?其中有很多好玩的东东,敬请期待!

-------------------------------------------------------------------------------------------------------------

欢迎关注我的教程:从设计到模式深入理解javascript原型和闭包系列》《微软petshop4.0源码解读视频》《json2.js源码解读视频

也欢迎关注我的开源项目——wangEditor,简洁易用的web富文本编辑器

-------------------------------------------------------------------------------------------------------------

时间: 2024-11-02 00:36:28

css知多少(3)——样式来源与层叠规则的相关文章

css知多少(2)——学习css的思路

原文:css知多少(2)--学习css的思路 两周之前写过该系列的第一篇,其实当时只是一个想法,这段时间迟迟未更新,是在思考一个解决过程.现在初有成效,就开更吧. 1. 一个段子 开题不必太严肃,写博客也不像写书,像聊天似的写东西是最好的表达方式.        记得之前看过一个段子,也可能是一件真事儿,这不重要.大体内容如下:一个香港的教授说:我们香港的大学和大陆的大学差的很远啊,大陆的大学连看门保安都懂得哲学,因为当你想要进入校园时,保安都会问你一个很哲学的问题"你是谁,你从哪里来,你到哪里

css知多少(5)——选择器

原文:css知多少(5)--选择器 1. 引言 从本节开始,就进入本系列的第二个部分--css和html的结合--说白了就是选择器. CSS中定义了样式,如何将这些样式设置到相应的html节点上?就不得不通过选择器.让浏览器知道css选择了哪一个dom节点,浏览器就会乖乖的把相应的样式渲染成视图. 至于css能把页面渲染成什么样子,这是本系列的第三部分. 第一部分讲css样式的加载和层叠,第二部分讲选择器以及选择器的等级,第三部分讲呈现的各种样式(背景.字体.定位.浮动等).这样一个思路,也正式

css知多少(1)——我来问你来答

原文:css知多少(1)--我来问你来答 1. 引言 各位前端或者伪前端(比如作者本人)的同志们,css对你们来说不是很陌生.比如我,在几年之前上大学的时候,给外面做网站就用css,而且必须用css.这样算下来也得六年多了,有些功能可能轻车熟路,有些功能可能需要上网查查,看似能应付得了工作的事情--我之前也是(现在工作上不做开发了,只是业余还写代码). 世界上没有绝对简单的东西,只是我们认为它是简单的.就像我们公司现在的开发情况,开发的大环境刚刚转入B/S,开发领导以前都是用.net做C/S的,

css知多少(6)——选择器的优先级

原文:css知多少(6)--选择器的优先级 1. 引言 上一节<css知多少(5)--选择器>最后提到,选择器类型过多将导致一些问题,是什么问题呢?咱们直接举例子说明. 上图中,css中的两个选择器都是针对<span>的,而且两个设置的颜色不一样,这里的<span>到底听从谁的命令? 上面还是比较简单的,下面在来一个复杂的: 上图中的<li>该显示成什么颜色呢? 2. 特指度 要解决以上问题,我们需要引入一个概念--特指度(specificity).特指度表

css知多少(8)——float上篇

原文:css知多少(8)--float上篇 1. 引言 对于我们所有的web前端开发人员,float是或者曾经一度是你最熟悉的陌生人--你离不开它,却整天承受着它所带给你的各种痛苦,你以为它很简单就那么一点知识,但却驾驭不了它各种奇怪的现象. 这就是我们又爱又恨的--float.所以,系统的学一学float是非常非常重要的.除了看书和看博客文章之外,我推荐大家去看一个奇葩(声音很有磁性,你懂得)录制的教程<CSS深入理解之float浮动>,讲的很好很透彻. 2. 重新认识float 2.1. 

css知多少(10)——display

原文:css知多少(10)--display 1. 引言 网页的所有元素,除了"块"就是"流",而且"流"都是包含在"块"里面的(最外层的body就是一个"块").在本系列一开始讲<浏览器默认样式>的时候,大家也都看到了浏览器默认样式中规定了html元素哪些属于"块"(剩下的就是"流").这部分知识非常重要也非常基础,因此在所有的前端面试题中,都会问道哪些

css知多少(7)——盒子模型

原文:css知多少(7)--盒子模型 1. 引言 从这一节开始,我们就进入本系列的第三部分--css呈现.本部分将描述css在页面的几种布局和呈现的特性.包括两类:文字.块. 第一类--文字.这部分相对比较简单一些,例如设置字号.字体.颜色.背景色.是否加粗等.重点的地方在于设置字体.设置行高.文字相关的距离都用相对值,这些东西在<css知多少(4)--解读浏览器默认样式>那一节已经说过了.另外还有一个重点,就是web端最流行的字体库fontAwesome,关于它我之前有一篇文章专门讲过,请参

css知多少(9)——float下篇

原文:css知多少(9)--float下篇 float内容比较多,咱们分上.下两篇来介绍,上篇已经写完,这是下篇.建议大家先把上篇看了,再来看下文,精彩内容不要掠过啊. 1. 清除float <上篇>中我们提到,float具有"破坏性",它会导致父元素"坍塌",这将不是所要看到的.如何去避免float带来的这种影响呢(也就是我们常说的"清除浮动") ?方法有很多种,我在这里介绍4中供大家参考,大家可根据实际情况来选择. 先介绍两个比较

[HTML/CSS]uploadify自定义按钮样式

概述 在项目中经常用到uploadify上传插件,但是FLASH按钮的外观往往跟我们网页的设计的主题色不太搭配.这时就需要对其样式进行修改.  样式文件是uploadify.css. 打开这个文件后,你会看见CSS设置的按钮样式.  1 .uploadify-button { 2 background-color: #505050; 3 background-image: linear-gradient(bottom, #505050 0%, #707070 100%); 4 backgroun