第3章 使用CSS3样式表 学习目标  了解CSS样式表的概念及功能  掌握CSS样式的声明方法  掌握CSS样式的应用方法  理解和掌握CSS的高级语法  熟练使用CSS3的常用属性  通过相关的范例及综合案例深入了解并掌握CSS3在网页样式定义及站点外观统一方面的应用 CSS是Cascading Style Sheets(层叠样式表)的缩写,一般简称为“样式表”,它是由W3C组织制定的一种非常实用的网页元素定义规则。在标准网页设计中,CSS负责网页内容(HTML)的表现。样式就是格式,例如网页中文字的大小、颜色,图片的大小、插入位置等; 层叠是指多个样式可以同时应用到同一个页面或网页中的同一个元素,如果这些样式发生了冲突,则依据层次的先后来处理网页中内容的形式。 1997年,W3C在公布HTML 4.0的同时公布了有关样式表的第一个标准——CSS 1.0,CSS1.0较为全面地规定了文档的显示样式,其大致可分为选择器、样式属性、伪类/对象几个部分。1998年W3C发布了CSS的第二个版本,它包含了CSS 1.0的所有功能,并扩充和改进了很多更加强大的属性。 早在2001年5月,W3C就着手开始准备开发CSS第三版规范。CSS3语言的开发是朝着模块化发展的,把CSS分解为一些小的模块,更多新的模块也被加入进来。现在,W3C的CSS3规范仍在开发,它的新技术将简化网站的开发流程,也会带来更好的用户体验。 CSS的目的就是把结构和样式相分离,网页的结构用HTML的标签定义,网页的外观样式用CSS定义。CSS功能强大,样式设定功能比HTML多,几乎可以定义所有的网页元素。在将样式的定义全部交给CSS后,通过简单地更改CSS文件就可以轻松改变一个或多个网页的整体表现形式,从而减少网页设计人员的工作量。 CSS是一种表现语言,是对网页结构语言HTML的有效补充。网页编辑的一般步骤是: 首先利用HTML定义网页结构和各页面元素的使用,其次使用CSS定义网页的外观并应用到具体的某些页面或某些元素中。 在本章的学习中首先熟悉CSS的定义和使用方法,其次了解一些常用的CSS属性,以及部分最新的CSS3相关属性,同时应用所学的知识对案例网站中的相关页面进行CSS样式的设置。 3.1初识CSS样式表 本节首先通过一个简单的案例实践来快速了解CSS样式表的定义和使用,然后介绍CSS的基本语法和几种创建方法,最后介绍除标签选择器以外的几种常见的CSS选择器,包括组合选择器、后代选择器、类选择器和id选择器。 第 3 章 使用CSS3样式表 网页设计与Web前端开发案例教程——HTML5、CSS3、JavaScript 3.1.1第一个CSS案例 下面通过一个简单的案例实践来快速了解CSS样式表的定义和使用。 【例31】编写一个简单的用CSS控制网页内容外观的例子,其中加粗的部分为CSS代码。在浏览器中的效果如图31所示。 视频讲解 海洋环境问题

海洋污染即污染物进入海洋,超过海洋的自净能力。

海洋污染物绝大部分于陆地上的生产过程。海岸活动,例如倾倒废物和港口工程建设等,也向沿岸海域排入污染物。污染物进入海洋,污染海洋环境,危害海洋生物,甚至危及人类的健康。

图31第一个CSS控制网页外观的例子 在本书的2.1.4节曾经提过,标签中的bgcolor属性和text属性属于被使用了多年但不被推荐使用的属性,这里使用CSS样式定义实现了同样的功能。另外,在段落样式的定义中,除了文本缩进以外,还增加了对文字大小的定义。 由图31可以看到,在部分添加简单的CSS样式后,页面中所有由

定义的段落文本首行全部向右缩进了两个字符的空格。如果使用HTML的方法,则只能在每个段落的前面增加两个空格字符。如果下次希望每个段落缩进一个字符,只需对此样式表进行修改就可以了。 如果希望段落以外的其他元素(例如标题3)设置首行缩进,只需要复制上面的CSS定义,并把p改为h3即可。 3.1.2CSS基本语法 由上一节的案例可以看到,CSS的样式定义都是由一些最基本的语句构成的。它的基本语句的结构格式为: 选择器{属性: 属性值;} 选择器(selector)通常是需要定义的HTML元素或标签; 属性(property)是希望改变的元素属性,并且每个属性都有一个值。属性和值被用冒号分开,并由大括号包围,这样就组成了一个完整的样式声明(declaration)。例如: p {text-indent: 2em;} 上面这行代码的作用是将p元素内的文字缩进两个字符。在上述例子中,p是选择器,而包括在花括号内的部分是声明。声明依次由属性和值两个部分构成,这里textindent为属性,2em为属性值。属性值的数值和单位之间不能有空格。 CSS样式的定义还需要符合以下几点语法要求。 (1) 如果值为若干单词,则要给值加引号。例如: p {font-family: "sans serif";} (2) 如果要定义不止一个声明,则要用分号将每个声明分开。其格式为: 选择器{属性: 属性值; 属性: 属性值;… } 例如上一节中选择器的定义,简写的形式如下: body {color: #000000; background-color: #FFFFFF;} 3.1.3CSS的创建 要想在浏览器中显示出所定义的CSS样式效果,需要让浏览器识别并调用。当浏览器读取样式表时,要依照文本格式来读。将CSS样式应用到HTML页面中可以有3种方法,即内部样式表、外部样式表和内联样式表。 1. 内部样式表 内部样式表是把样式表放到页面的…内,这些定义的样式就应用到页面中了。样式表是用 … 其中,用来说明所要定义的样式; type属性指定样式表属于CSS文本类型。 注意: 有些低版本的浏览器不识别中为依据CSS样式声明的语法定义一个以上的选择器样式。 /*…*/为CSS的注释符号,主要用于注释CSS的设置值。注释内容不会显示或被引用在网页上。 例如在3.1.1节中案例页面的部分所添加的就是内部样式表。 内部样式表可用于一个文档具有独一无二的样式的时候。如果多个文档使用同一个样式表,那么外部样式表会更适用。 2. 链入外部样式表 链入外部样式表是把样式表保存为一个样式表文件(.css),然后在页面中用标签链接到这个样式表文件,这个标签必须放到页面的…内。其格式为: … 标签表示浏览器从“样式表文件名.css”文件中读出定义的样式表。rel="stylesheet"是指在页面中使用外部样式表。type="text/css"是指文件的类型是样式表文本(该属性可以省略)。href属性用于定义.css文件的URL。 样式表文件可以用任何文本编辑器(例如记事本)打开并编辑,一般样式表文件的扩展名为.css。内容是定义的样式表,不包含HTML标签。样式表文件的格式为: @charset 'utf-8'; 选择器1{属性:属性值; 属性:属性值; … } /*注释内容*/ 选择器2{属性:属性值; 属性:属性值; … } … 选择器n{属性:属性值; 属性:属性值; … } 其中,第1行通常用@charset 'utf8'来声明此CSS文件使用utf8编码。 视频讲解 【例32】将例31改为链入CSS外部样式表控制网页内容的外观,其中包括一个HTML文件ch0302.html及一个放在HTML案例所在文件夹下CSS文件夹中的CSS文件ch0302.css。在浏览器中的效果不变。 (1) ch0302.html文件,只需修改ch0301加粗部分的代码如下: (2) CSS文件夹中的ch0302.css文件。 @charset 'utf-8'; body { color:blue;/*定义网页文字颜色*/ background-color:#EEE; /*定义网页背景颜色*/ } p { text-indent:2em; /*文本向右缩进两个字符*/ font-size:14px; /*定义段落文字大小*/ } 一个外部样式表文件可以应用于多个页面。当这个样式表文件被改变时,所有相关的页面样式都会随之改变。这在制作大量相同样式页面的网站时非常有用,不仅减少了重复的工作量,而且有利于以后的修改、编辑,在浏览时也减少了重复下载代码。另外,浏览器显示时会保存外部样式表文件到缓冲区中,从而加快了显示网页的速度。 3. 导入外部样式表 导入外部样式表是指在内部样式表的里导入一个外部样式表,在导入时使用@import。其格式为: … “外部样式表文件名”指出要导入的样式表文件,其扩展名为.css,注意使用正确的格式及外部样式表路径。导入外部样式表和链入外部样式表在功能上基本没有区别,但由于它是在网页加载完以后再加载样式,可能会因此导致不能及时显示网页的样式。一般较小的CSS文件用导入的方法,而较大的CSS文件用链入的方法。 视频讲解 【例33】将例31改为导入CSS外部样式表控制网页内容的外观,其中包括一个HTML文件ch0303.html及一个放在HTML案例所在文件夹下CSS文件夹中的CSS文件ch0303.css。在浏览器中的效果不变。 (1) ch0303.html文件中的CSS样式(其中加粗部分为导入外部CSS文件的代码)。 (2) CSS文件夹中的ch0303.css文件。 @charset 'utf-8'; body { color:blue; /*定义网页文字颜色*/ background-color:#EEE; /*定义网页背景颜色*/ } 这里ch0303.css中的样式仅定义了body元素的样式。 注意其他的CSS规则应该仍然包括在style元素中,但所有的@import声明必须放在样式表的开始部分。导入样式表的优先级低于后面定义的其他样式表的声明。 4. 内联样式表 内联样式表(或行内样式表)是混合在HTML标签里使用的,用这种方法可以很简单地对某个元素单独定义样式。内联样式表的使用是直接在HTML标签里加入style参数,而style参数的内容就是CSS的属性和值。其格式为: <标签 style="属性:属性值; 属性:属性值 … "> style参数后面的引号里的内容相当于样式表大括号里的内容。 例如,可以将某页面标签中的HTML代码: 用内联样式表的方法改为: 可以看到,除了要按照特有的格式定义内联样式表以外,为同一标签(例如)定义同一功能的CSS属性名和HTML属性名并不总是相同,而且用CSS样式可以定义更多的样式属性。 如果用内联样式表的方法来定义例31中head部分的CSS样式,就会比较麻烦,需要在所有用

定义的段落(如“海洋污染即污染物进入海洋,超过海洋的自净能力。”)进行重定义。例如:

海洋污染即污染物进入海洋,超过海洋的自净能力。

海洋污染物绝大部分于陆地上的生产过程。海岸活动,例如倾倒废物和港口工程建设等,也向沿岸海域排入污染物。污染物进入海洋,污染海洋环境,危害海洋生物,甚至危及人类的健康。

… 因为和需要展示的内容混合在一起,内联样式表会失去一些其他样式表的优点,所以这种方法应该尽量少用,一般仅用在对页面内某个标签的具体微调上。 3.1.4组合选择器 可以把相同属性和值的选择器组合起来书写,用逗号将选择器分开,这样可以减少样式的重复定义。其格式为: 选择器1, 选择器2, …, 选择器n{属性: 属性值; 属性: 属性值;… } 例如,下面CSS声明中所有段落和列表项的首行文本都向右缩进两个字符,并且大小都是14px。 p,li { text-indent:2em; font-size:14px;} 3.1.5后代选择器 后代选择器(descendant selector)可以选择作为某元素后代的元素,它允许根据文档的上下文关系来确定某个标签的样式。通过合理地使用后代选择器,可以使HTML代码变得更加整洁。后代选择器的样式定义格式为: 选择器1 选择器2 … 选择器n{属性: 属性值; 属性: 属性值;… } 这里大括号中所定义的样式只能应用于各选择器从左到右依次向后包含的情况,因此后代选择器有时又被称为包含选择器。 例如表格内链接的文字大小为12px,而表格外链接的文字仍为默认大小,可以这样定义一个后代选择器: table a { font-size: 12px } 3.1.6类选择器的创建和引用 在用CSS进行网站设计时,大家可能会遇到一种情况: 相同的标签可能需要在不同的地方设置成不同的显示效果。一种解决办法是采用3.1.3节所介绍的内联样式表,逐一进行属性设置,但如果此类标签在页面中应用得比较多,在设置时就会显得比较烦琐,修改时也不够方便,较好的解决办法就是采用类选择器。 类选择器,顾名思义是样式的分类选择器,它可以根据不同的风格需要对某一类型的标签设置几种不同的CSS属性,也可以将整个风格分成几个类,而不是只针对某一种类型的标签。 1. 类选择器的创建 类选择器可在内部样式表和外部样式表中创建,但不能在内联样式表中创建。用类选择器能够把相同的元素分类定义为不同的样式,在定义类选择器时,在自定类的名称前面加一个点号。类选择器的创建方法有两种,一种是可以定义针对某种HTML元素的类选择器样式,其格式为: 元素名.类选择器名{属性:属性值; 属性:属性值 … } 在这种方式中,可以对某一类型的HTML标签创建类选择器,例如: p{font-family:'宋体'; font-size:10pt; color:red} p.left{text-align:left} p.right{text-align:right} p.center{text-align:center} 在上面的例子中,所有段落标签的字体都为宋体,大小为10pt,颜色为红色,由于排版的需要又分成了3个类选择器,分别具有不同的排版属性。层叠样式表之所以为层叠,其意义也在于此。 类选择器还有一种用法,即在选择器中省略HTML标签名,这样可以把几个不同的元素定义成相同的样式。其格式为: .类选择器名{属性:属性值; 属性:属性值 … } 或 *.类选择器名{属性:属性值; 属性:属性值 … } 例如下面规定了3个类选择器,几乎所有的HTML标签都可以引用它们。 .isleft{font-family:'宋体'; font-size:10pt; color: red; text-align:left} .isright{ font-family:'宋体'; font-size:10pt; color: red; text-align:right} .iscenter{ font-family:'宋体'; font-size:10pt; color: red; text-align:center} 2. 类选择器的引用 类选择器的引用很简单,只需在标签后面设置class属性值为类选择器名即可,引用格式如下: <标签 class="类选择器名"> 例如在一个段落标签中引用之前第一种方式创建的类选择器:

应用了类选择器设置左对齐的段落

红色左对齐的段落

红色右对齐的段落

3.1.7id选择器的创建和引用 通过设置HTML标签中的class属性可以对相应的元素进行分类,而id属性则可以对某个单一元素进行识别。因此,当某种样式说明仅对应于一个独特的元素时,可以通过创建和引用id选择器来实现。 1. id选择器的创建 CSS的id选择器就是元素的id标识,它可以为标有特定id的HTML元素指定特定的样式。定义id选择器要在id名称前加上一个“#”号。和类选择器相同,定义id选择器的属性也有两种方法,一种是定义针对某种HTML元素的id选择器样式,其格式为: 元素名#id选择器名{属性:属性值; 属性:属性值 … } 这里的“id选择器名”就是元素的id标识,由网页设计者定义。id选择器的样式可应用于用id属性定义的HTML标签样式。 例如下面这个例子,id属性只匹配id="green"的段落元素: p#green {color:green;} 更常见的id选择器定义方法为在选择器中省略HTML标签名,其格式为: #id选择器名{属性:属性值; 属性:属性值 … } 这里的“id选择器名”就是元素的id标识,由网页设计者定义。id选择器的样式可应用于用id属性定义的HTML标签样式。 例如下面的两个id选择器,第一个定义元素的颜色为红色,第二个定义元素的颜色为绿色。几乎所有的HTML元素都可以应用这两个id,但id属性只能在每个HTML文档中出现一次。 #red {color:red;} #green {color:green;} 2. id选择器的引用 id选择器的引用和类选择器类似,只要把class换成id即可。其引用格式如下: <标签 id="id选择器名"> 例如前面用第二种方式创建的id选择器分别被一个

标签和

标签引用:

应用了id选择器设置红色的段落

名为p1的盒子
名为p2的盒子
页面效果如图311所示。 图311外边距垂直叠加 在图311中,相邻盒子p1和p2在垂直方向上的间隔最终为20px,即为盒子p2上外边距的值。 【例314】有两个盒子,名称分别为p1和p2,其中p1的右外边距为10px,p2的左外边距为20px,页面的完整定义如下,页面效果如图312所示。 外边距水平相加
名为p1的盒子
名为p2的盒子
图312外边距水平相加 在图312中,盒子p1和p2在水平方向上的外边距值相加在一起,使其之间的距离变为了30px。 4. 负外边距值 与其他属性不同,外边距属性(margin)可以取负值。页面中的两个相邻元素,若其中的某个外边距取负值,仍会发生重叠,则此时垂直方向和水平方向的重叠规则相同,即两个元素之间的距离是正的外边距值减去负的外边距值的绝对值,或者表示为正的外边距值和负的外边距值之和。 【例315】仍为p1和p2两个盒子,其中p1的下外边距为10px、p2的上外边距为-20px,样式和盒子的定义如下,页面效果如图313所示。 #p1{/*p1与p2不同样式部分的定义,用于区分这两个盒子*/ margin-bottom:10px; border: 1px solid #666; } #p2{ margin-top:-20px; border: 2px solid #666; }
名为p1的盒子
名为p2的盒子
图313负外边距垂直重叠 在图313中,边框较粗的是盒子p2,较细的是盒子p1。由于p1的下外边距为10px、p2的上外边距为-20px,所以两个盒子垂直方向上的间距(下边框与上边框之间的距离)最终为-10px,在图中显示为p2向上移动了20px,导致最后两个盒子在边框范围内重叠了10px。 3.2.6外边距合并 外边距合并指当两个盒子的垂直外边距相遇时它们将形成一个外边距。 发生外边距合并有3种情况: ①垂直相邻的兄弟元素; ②空块元素; ③块级父元素与其第一个/最后一个子元素。其中,第一种情况即垂直相邻兄弟元素的外边距合并问题,已在上一节进行介绍。这里主要介绍后两种情况的外边距合并,并解决最后一种情况,即避免有包含关系的外边距合并的思路。 1. 空块元素的外边距合并 如果存在一个空的块级元素,其border、padding、inline content(内嵌的内容)、height、minheight(最小高度)都不存在,则它的上、下外边距将会合并。 【例316】在两个段落之间有一个空的div盒子,其中段落没有外边距,空的div盒子的上外边距为20px、下外边距为50px,样式和盒子的定义如下,页面效果如图314所示。 p { background:yellow; } div{ /*div为空块元素*/ margin-top: 20px; margin-bottom: 50px; }

段落一

段落二

图314空块元素的外边距合并效果 这里段落一与段落二之间的距离为中间空的div盒子上边距与下边距中的较大者“50px”。 2. 块级父元素与其第一个/最后一个子元素的外 边距合并 在块级父元素中不存在bordertop、paddingtop、inline content、清除浮动这4个属性,那么这个块级元素和其第一个子元素的上边距就会挨到一起,即发生上外边距合并现象。换句话说,就是这个父元素的外边距将直接变成这个父元素和其第一个子元素的margintop的较大者。 与之类似,若块级父元素的marginbottom与它的最后一个子元素的marginbottom之间没有父元素的borderbottom、paddingbottom、inline content、height、minheight、maxheight分隔,就会发生下外边距合并现象。 【例317】编写一个父元素与子元素上外边距合并的例子,样式和盒子的定义如下,页面效果如图315所示。 图315父元素与子元素的 上外边距合并 .wrapper { width: 100px; height: 100px; margin-top: 20px; background: red; } .div1 { width: 50px; height: 50px; margin-top: 30px; margin-left: 20px; background: yellow; }
这里父div的上外边距将为其与子div的margintop的较大者“30px”,且子div的上边距的上边距被合并后,与父div上部挨在一起。 【例318】编写综合的外边距合并的例子,其中第一个红色的父div盒子中有3个黄色的子div盒子,第二个红色的父div盒子中有一个黄色的子div盒子,样式和盒子的定义如下,页面效果如图316所示。 .wrapper { width: 100px; margin-top:10px; margin-bottom: 20px; background: red; } .div1,.div2,.div3{ width: 50px; height: 50px; margin-left: 20px; background: yellow; } .div1 { margin-top:30px; margin-bottom: 30px; } .div2 { margin-top:40px; margin-bottom: 50px; } .div3 { margin-top:30px; margin-bottom: 50px; }
div1
div2
div3
div1
div3
图316外边距合并综合 这里父div的上外边距将为其与第一个子div的margintop的较大者“30px”,并与第一个子div发生上外边距合并; 父div的下外边距将为其与最后一个子div的marginbottom的较大者“50px”,并与最后一个子div发生下外边距合并; 并且两个父div之间和各子div之间均发生了垂直相邻的兄弟元素外边距合并的现象。 注意: 不发生外边距合并的两种情况如下。 (1) 设置了overflow:hidden属性的元素,不和它的子元素发生margin合并。 (2) 只有块级元素之间的垂直外边距才会发生外边距合并。行内元素、浮动元素或绝对定位元素之间的垂直外边距不会合并。 overflow属性和其他类型的元素将在后面的章节进行介绍。 3. 避免有包含关系的外边距合并的思路 解决有包含关系的块元素外边距合并的主要思路如下: (1) 给块级父元素添加border属性,即可避免子元素与父元素的外边距合并。 (2) 用父元素的padding属性来取代子元素的margin属性设置,能更有效地实现所需的布局效果。 在实际应用中,用得较多的是第二种方法。其不需要给父元素额外添加border属性,而是换一个角度,从父元素的padding属性的设置来解决网页中父子元素的间距问题,这也是初学者在网页布局方面需要强化的一种制作思路。 3.2.7盒模型案例实践 1. 案例要求 利用盒模型的边框及其他各种属性绘制一个如图317所示的倒三角形,并放在一个居中的父盒子中。 图317利用盒模型边框绘制倒三角形 2. 思路提示 在本例中使用了一种利用盒子边框制作三角形的技巧。 根据盒模型的原理可知,对盒子可以设置内容区宽度、高度以及边框。如下代码: div{ width:100px; height:100px; border: 10px solid #F00283; } 在浏览器中的显示效果如图318所示,看起来好像跟三角形也没什么关系。 但是若把每一条边的颜色设置成不一样的颜色,就能看出来一些端倪了。代码如下: div{ width:100px; height:100px; border:10px solid #F00283; border-color: #000 #AAA #333 #999; } 如图319所示,可以看到,当每一条边的颜色都不一样的时候,每两条边交汇的地方是一个斜角。其实这个斜角一直都存在,只是当两条边的颜色一样的时候看不出来而已。尽管有了斜角,但看起来和三角形好像还是没有太大的关系。接下来把盒子的宽高慢慢地减小,如图320所示为4个盒子的宽高分别是100px、80px、40px、10px、0px的时候盒子在浏览器中的显示效果。 图318带边框的盒子显示效果图 图319盒子效果图 图320调整盒子宽高的边框效果图 可以看到盒子内容区在慢慢变小,边框虽然没有发生变化,但是当斜角慢慢靠近的时候,最终的边框形成了4个三角形。以下是图320中实现的最后一个盒子的代码: div{ width:0; height:0; border:10px solid #F00283; border-color: #000 #AAA #333 #999; } 这时候三角形已经出来了,但是有4个,而通常情况下只需要一个,所以需要把其他3条边框隐藏起来。设置其他3条边框为透明色(transparent),就可以剩下其中一个。 例如现在需要一个尖角朝上的三角形,那么4个三角形里面只需要下边框就可以了,其他3条边框的颜色都改成透明的。实现代码如下: div{ width:0; height:0; border:10px solid transparent; border-top-color: #333; } 图321利用边框实现 三角形 可以看到这时候只剩下一个三角形了,如图321所示。以上就是利用边框实现三角形的原理。 图321中的三角形虽然width和height属性都是0,但由于4个方向都有4条宽度为10px的边框(其中3条边框的颜色是透明的),实际占用的尺寸宽、高均为20px。如果希望实际的高度不包括隐藏的上边框的宽度,可将上边框设置为无,其他边框的属性不变,这样就可以使得三角形实际占用的尺寸与其外观所在的空间更加一致。其他方向的三角形样式定义的原理类似。 3. 参考代码 参考代码文件名为pra031.html。 盒模型边框绘制倒三角形
4. 案例改编及拓展 仿照以上案例,自行编写及拓展类似的网页效果,例如实现放在父元素不同位置的其他方向三角形等效果。 3.3列表标签及样式 使用列表能够有效地表达出并列、排序关系的网页内容,为访问者阅读网页提供方便。HTML为用户提供了无序列表、有序列表和定义列表3种形式。 图322用无序列表制作的 商品分类列表 通过上述列表的相互嵌套,还可以进一步丰富列表的表现形式。 结合使用CSS样式的列表可以大量地用在具有并列布局元素的网页布局中。例如图322所示的天猫网站首页中的商品分类列表部分,它主要是使用无序列表制作的。 3.3.1无序列表 当网页内容出现并列选项时,可以采用无序列表(Unordered List,也称项目列表)。无序列表中每一个表项的前面是项目符号(例如●、■等符号)。无序列表始于