本文是HTML及CSS课程的第六课。W3C提倡网页的内容与表现分离,层叠样式表(Cascading Style Sheet)即是网页中的“表现”部分,它描述HTML标签将会显示成什么样子。本文介绍层叠样式表的基本概念,及在层叠样式表中常见的选择器类型等内容
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML或XML等文件样式的计算机语言。
在web开发技术初期,HTML的内容和样式没有分离开,如下:
随着web技术的发展,HTML变的越来越杂乱和臃肿。web开发人员建议,把表示样式的代码从HTML中分离出来,并且创建一种规则来定义HTML元素要显示成什么样子,于是便诞生了CSS语言。
在网页制作时采用层叠样式表技术,可以有效地对页面的布局、字体、颜色、背景和其它效果实现更加精确的控制。只要对相应的代码做一些简单的修改,就可以改变同一页面的不同部分,或者页数不同的网页的外观和格式。
下面是一个简单的列子:
HTML:
<body>
<h1>标题 1h1>
<p>这是段落中的一些文本。p>
<p>这是另外一个段落p>
<hr />
<h2>标题 2h2>
<table>
<tr><th>Nameth><th>E-mailth><th>Phoneth>tr>
<tr><td>Doe, Johntd><td>[email protected]td><td>555-789-7222td>tr>
<tr><td>Smith, Evatd><td>[email protected]td><td>555-324-3693td>tr>
table>
<br />
<hr />
<h3>标题 3h3>
<p>你应具备的知识:p>
<ol><li>HTMLli><li>CSSli>ol>
<p>你最喜欢的饮料:p>
<ul><li>Smoothieli><li>Green teali><li>Coffeeli>ul>
body>
样式表1:
body {font-size:75%;font-family:verdana,arial,'sans serif';background-color:#FFFFF0;color:#000080;margin:10px;}
h1 {font-size:200%;}
h2 {font-size:140%;}
h3 {font-size:110%;}
table,th,tr,td {border: 1px solid #111111}
table {width: 100%}
th {background-color:#ADD8E6;}
ul {list-style:circle;}
ol {list-style:upper-roman;}
样式表2:
body {font-size:75%;font-family:"lucida calligraphy",arial,'sans serif'; background-color:#DCDCDC;color:#8A2BE2;margin:10px;}
h1 {font-size:200%;}
h2 {font-size:140%;}
h3 {font-size:110%;}
table,th,tr,td {border: 1px solid #111111}
table {width: 100%}
th {background-color:#D3D3D3;}
td {background-color:#FFFAF0;}
CSS要修饰HTML页面中的元素,就必须先选择(找到)被修饰的元素,这就需要用到CSS选择器。其次,还需要告诉浏览器修饰被选择元素的哪一种属性,如字体、颜色、边框、背景、位置等。最后,还需要说明将被选择元素的该属性修饰成什么样子,即给该属性赋予属性值。综上,层叠样式表的基本格式为:
选择器 {
属性1: 属性值;
属性2: 属性值;
...
}
对应样式表书写的位置,有三种应用样式的方式,分别是行内样式、内部样式、外部样式。
行内样式是将样式源代码按标签属性的形式书写在所要修饰的标签中,行内样式只能由当前标签使用,不具有复用性。行内样式也被称为内联样式。
下面是一个示例:
<body>
<p>价格:<span style="color:red;font-size:70px;">10span>元p>
body>
style
属性中,style
属性是一个全局属性(几乎所有标签所共有的,具有相同含义的属性称之为全局属性),用以表示元素的行内样式。内部样式将样式源代码写在当前HTML文件中。在当前页面中可以重复使用。
下面是一个示例:
<html>
<head>
<title> 内部样式 title>
<meta charset="utf-8">
<style type="text/css">
span {
color: red;
font-size: 70px;
}
style>
head>
<body>
<p>价格:<span>10span>元p>
<p>价格:<span>23span>元p>
body>
html>
标签部分中,使用
标签定义。
标签中添加属性及对应的值type="text/css"
。span
,表示选择页面中的所有
标签。外部样式是将样式源代码定义在以css为扩展名的独立文件中。HTML文件可以通过标签将外部样式引入。外部样式具有样式代码一次定义,多个HTML页面复用的特点。
下面是一个示例:
编写HTML文件,命名为test.html,HTML源码如下:
<html>
<head>
<title> 外部样式 title>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css" />
head>
<body>
<p>价格:<span>10span>元p>
<p>价格:<span>23span>元p>
body>
html>
创建一个单独的文件,命名为style.css,源码如下:
@charset "utf-8";
span {
color: red;
font-size: 70px;
}
说明:
标签结尾的/
表示标签结束。rel
属性的值为stylesheet
,表示引入的文件是定义页面样式的。href
属性的工作原理和在
标签中的相同,注意相对路径和绝对路径的问题。
标签,引入同一个样式表文件,实现多个HTML页面复用同一份样式表。前面我们已经提到了CSS选择器,它的核心目的即是选择需要被修饰的元素。以下我们将了解一些常见的CSS选择器。
一个完整的HTML页面是有很多不同的标签组成,而标签选择器,则是决定哪些标签采用相应的CSS样式。
下面是一个示例:
<html>
<head>
<title> 标签选择器 title>
<meta charset="utf-8">
<style type="text/css">
p { text-decoration:underline; }
style>
head>
<body>
<p>李白,字太白,号青莲居士,又号“谪仙人”,是唐代伟大的浪漫主义诗人,被后人誉为“诗仙”。p>
<p>李白深受黄老列庄思想影响,有《李太白集》传世,诗作中多以醉时写的,代表作有《望庐山瀑布》《行路难》《蜀道难》《将进酒》《梁甫吟》《早发白帝城》等多首。p>
body>
html>
<>
的标签名。类选择器根据类名来选择被修饰的元素。给标签增加一个class
属性,然后给class
属性填写一个值,这个值叫做类名,之后可以使用.类名
作为选择器选择具有该类名的标签。
下面是一个示例:
<html>
<head>
<title> 类选择器 title>
<meta charset="utf-8">
<style type="text/css">
.nav {
text-decoration: underline;
font-size: 20px;
}
.text-blue {
color: #0d6aad;
}
style>
head>
<body>
<ul class="nav text-blue">
<li>主页li>
<li>校友档案li>
<li>添加校友li>
ul>
<h3>兴趣爱好h3>
<ul>
<li>饮酒li>
<li>赋诗li>
<li>游历山水li>
ul>
body>
html>
.
开头,后面写类名,类名不允许以数字开头,不允许是标签名称。class
属性引用类名。class
属性中可以同时引用多个类名,中间以空格隔开。ID选择器可以为有特定ID的HTML元素指定特定的样式。元素的ID即标签中id
属性指定的属性值。ID选择器的格式为#ID
。
下面是一个示例:
<html>
<head>
<title> ID选择器 title>
<meta charset="utf-8">
<style type="text/css">
#user-name {
width: 300px;
}
#user-desc {
width: 300px;
resize: vertical;
}
style>
head>
<body>
<table>
<caption>添加校友caption>
<tr>
<td><label for="user-name">校友名称label>td>
<td><input type="text" id="user-name" name="userName" />td>
tr>
<tr>
<td><label>校友性别label>td>
<td>
<input type="radio" name="userSex" id="user-male" value="male" checked />
<label for="user-male">男label>
<input type="radio" name="userSex" id="user-female" value="female" />
<label for="user-female">女label>
td>
tr>
<tr>
<td><label for="user-desc">校友介绍label>td>
<td><textarea name="userDesc" id="user-desc">textarea>td>
tr>
table>
body>
html>
#
开头,后接网页元素id
属性的值,用来唯一的修饰该元素。伪类选择器可以在原有选择器的基础上添加一定的限定条件,当某种情况发生时再选择这个标签。
下面是一个示例:
<html>
<head>
<title> 伪类选择器 title>
<meta charset="utf-8">
<style type="text/css">
a {
color: yellow;
}
a:link {
color: blue;
}
a:hover {
color: green;
}
a:active {
color: red;
}
a:visited {
color: gray;
}
style>
head>
<body>
<h1>常用地址h1>
<ul>
<li><a href="https://www.baidu.com">百度a>li>
<li><a href="https://www.1688.com/">阿里巴巴a>li>
<li><a href="https://www.qq.com/">腾讯a>li>
ul>
body>
html>
其他选择器:伪类
。a:link
选择未访问的链接,和a{}
相同并且同时存在时会覆盖a{}
。本例中a { color: yellow; }
不会起作用。a:hover
选择处于鼠标悬停状态的链接。a:active
选择激活状态(鼠标点击未释放)的链接。a:visited
选择已经被访问过的链接。a:hover
必须位于a:link
之后;a:active
必须位于a:hover
之后(建议按事件发生的顺序记忆)。伪类选择器也可以用来缩小标签的选择范围,或者插入简单的内容。
下面是一个示例:
<html>
<head>
<title> 伪类选择器 title>
<meta charset="utf-8">
<style type="text/css">
ul:after {
content: ' 等等';
color: blue;
}
li:first-child {
color: green;
}
style>
head>
<body>
<h3>兴趣爱好h3>
<ul>
<li>饮酒li>
<li>赋诗li>
<li>游历山水li>
ul>
body>
html>
ul:after
选择
元素之后,用以插入内容。li:first-child
选择属于父元素的第一个子元素,且该元素必须是
元素才能被选择。后代选择器又称派生选择器,有些时候也被称作包含选择器,用来选择特定元素或元素组的后代。
下面是一个示例:
<html>
<head>
<title> 后代选择器 title>
<meta charset="utf-8">
<style type="text/css">
ol li {
text-decoration: underline;
color: red;
}
style>
head>
<body>
<h3>主要作品h3>
<ol>
<li>728年:《黄鹤楼送孟浩然之广陵》li>
<li>732年:《行路难三首》li>
<li>749年:li>
<ul>
<li>《寄东鲁二稚子》li>
<li>《送萧三十一之鲁中兼问稚子伯禽》li>
<li>《静夜思》li>
ul>
ol>
body>
html>
选择器1 选择器2 ... 选择器n
。id
属性为a
、b
、c
的三个元素,则后代选择器可以写成#a #b #c{}
的形式,只要对祖先元素的选择在后代元素之前、中间以空格分开即可。子选择器用来选择直接后代。
下面是一个示例:
<html>
<head>
<title> 子选择器 title>
<meta charset="utf-8">
<style type="text/css">
ol>li {
text-decoration: underline;
color: red;
}
style>
head>
<body>
<h3>主要作品h3>
<ol>
<li>728年:《黄鹤楼送孟浩然之广陵》li>
<li>732年:《行路难三首》li>
<li>749年:li>
<ul>
<li>《寄东鲁二稚子》li>
<li>《送萧三十一之鲁中兼问稚子伯禽》li>
<li>《静夜思》li>
ul>
ol>
body>
html>
选择器1>选择器2>...>选择器n
。>
进行选择。下面是一个示例:
属性选择器作用在具有指定属性名及属性值的标签上。
<html>
<head>
<title> 属性选择器 title>
<meta charset="utf-8">
<style type="text/css">
input[type=text] {
width: 300px;
}
#user-desc {
width: 300px;
resize: vertical;
}
style>
head>
<body>
<table>
<caption>添加校友caption>
<tr>
<td><label for="user-name">校友名称label>td>
<td><input type="text" id="user-name" name="userName" />td>
tr>
<tr>
<td><label>校友性别label>td>
<td>
<input type="radio" name="userSex" id="user-male" value="male" checked />
<label for="user-male">男label>
<input type="radio" name="userSex" id="user-female" value="female" />
<label for="user-female">女label>
td>
tr>
<tr>
<td><label for="user-desc">校友介绍label>td>
<td><textarea name="userDesc" id="user-desc">textarea>td>
tr>
table>
body>
html>
页面浏览效果同ID选择器,这里不再展示。
说明:
选择器[属性名=属性值]
。通用选择器用*
表示,作用在所有标签上。如* {font-size:12px}
,表示所有元素的字体大小都是12px。比较简单,这里不再展示页面浏览效果。
当几个元素样式属性一样时,可以共同调用一个声明,便可以使用群组选择器。
下面是一个示例:
<html>
<head>
<title> 群组选择器 title>
<style type="text/css">
h3,div,p,span{color:red;}
style>
head>
<body>
<h3>HTML5h3>
<div>CSS3div>
<p>JAVAp>
<span>SQLspan>
body>
html>
选择器1, 选择器2, ..., 选择器n
。按样式表书写的位置,样式的优先级遵循就近原则的规则,从低到高依次是浏览器默认样式、外部样式、内部样式、行内样式。
下面是一个示例:
外部样式表源码:
@charset "utf-8";
div {font-size: 15px;}
HTML源码:
<html>
<head>
<meta charset="UTF-8">
<title> 样式优先级 title>
<link rel="stylesheet" href="css/style.css" />
<style>
.nav div {font-size: 20px;}
style>
head>
<body>
<div>文字1div>
<div class="nav"><div>文字2div>div>
<div class="nav"><div style="font-size:30px;">文字3div>div>
body>
html>
文字1
只被外部样式div
修饰,因此字体大小为15px。如下:文字2
被外部样式div
和内部样式.nav div
同时修饰,内部样式优先级高于外部样式优先级,因此外部样式被覆盖,显示为内部样式规定的字体大小20px。如下:文字3
被行内样式element.style
、内部样式.nav div
和外部样式div
同时修饰,行内样式优先级高于内部样式优先级和外部样式优先级,因此显示行内样式规定的字体大小30px。如下:按选择器的不同,样式的优先级遵循范围由小到大的规则,从低到高依次是标签选择器、类选择器、ID选择器。
下面是一个示例:
<html>
<head>
<meta charset="UTF-8">
<title> 选择器优先级 title>
<style>
div {height: 50px; border: 5px solid gray; background: lightgreen;}
.d-class {height: 35px; width: 50px; background: lightyellow;}
#d-id {height: 20px; background: lightblue;}
style>
head>
<body>
<div>文字1div>
<div class="d-class">文字2div>
<div class="d-class" id="d-id">文字3div>
body>
html>
文字1
只被标签选择器div
修饰。如下:文字2
被标签选择器div
和类选择器.d-class
同时修饰,类选择器优先级高于标签选择器优先级,因此标签选择器div
中的height: 50px
和background: lightgreen;
分别被类选择器.d-class
中的对应属性覆盖,而标签选择器div
中的border: 5px solid gray;
由于没有其他选择器覆盖,得以保留。如下:文字3
被标签选择器div
、类选择器.d-class
和ID选择器#d-id
同时修饰,ID选择器优先级高于类选择器优先级和标签选择器优先级,因此标签选择器div
中的height: 50px
和background: lightgreen;
、类择器.d-class
中的height: 35px
和background: lightyellow;
,均分别被ID择器#d-id
中的对应属性覆盖,而标签选择器div
中的border: 5px solid gray;
、类选择器.d-class
中的width: 50px;
由于没有其他选择器覆盖,得以保留。如下:若想让优先级低的属性值生效,可以在属性值的后面添加!important
来提升样式的优先级。
下面是一个示例:
<html>
<head>
<meta charset="UTF-8">
<title> 提升样式的优先级 title>
<style>
div {font-size: 20px !important;}
style>
head>
<body>
<div>文字1div>
<div style="font-size:40px;">文字2div>
body>
html>
页面浏览效果:
说明: