引入与分类
参考:样式与link标签。如
<head>
<title>test---html</title>
<meta charset="utf-8" />
<!--引入外部样式表,定义了p标签的样式-->
<link rel="stylesheet" type="text/css" href="./test.css">
<style type="text/css">
span{font-size: 50px;color: green}
</style>
</head>
<body>
<p>这是外部样式表</p>
<span>这是内部样式表</span>
<p style="font-size:60px;color:blue">这是内联样式</p>
</body>
在上面的代码中,通过三种方式分别引进了样式。通过link引进的称为外部样式表,通过<style>标签声明的称为内部样式表,直接在标签内部通过style属性声明的称为内联样式。这三咱样式的优先级依次增大,即:内联样式会覆盖内部样式表,内部样式表会覆盖掉外部样式表,外部样式表会覆盖掉浏览器自带的默认样式表。
不同的css之间可以通过@import url()的形式导入。如@import url(test1.css);
语法
CSS规则由两个主要的部分构成:选择器,以及一条或多条声明。其中选择器指的就是要改变样式的html标签,声明就是要改变的属性和该属性的值。每一条声明都是用冒号进行赋值,不同的声明之间需要用分号分隔开(虽然最后一条声明不需要加上分号,但最好还是加上),并且将所有的声明用一个{}括起来。如
声明
声明的值是不需要加引号的,但如果声明的某个值由多个单词组成,就需要给这个值加上引号。如果声明的值是多个,这些值之间用逗号隔开。如
p{font-size: 40px;在上面的样式中,最后一条声明的值是多个,中间使用逗号进行分隔;并且第二个值是由多个单词组成的,所以需要使用引号。
</span>color: red;
/*由两个值构成,中间用逗号隔开;第二个值由多个单词组成,所以用引号引起来*/
font-family: Times,"Times New Roman";
}
声明也是可以分组的,如上面的p标签,完成可以拆分成三个样式(一个样式中只有一条声明)。注意,对声明分组,一定要在各个声明的最后使用分号。
选择器
选择器就是要改变样式的html标签。
元素选择器
就是以html的标签做为选择器。它会匹配该文档该标签的所有实例 。因此,也可以为xml文档中的标签设置样式。如
<style type="text/css">
test{color:yellow;}
</style>
<body>
<test>imyaxml</test>
</body>
分组
可以将选择器进行分组,这样多个选择器可以使用同一条声明,只需要将不同的选择器用逗号分开即可。如
h1,h2,h3,h4,h5,h6 {
color: green;
}
在分组选择器中有一类很特殊的选择器:通配符选择器。该选择器可以与文档中的任何元素匹配。这个选择器等同于列出文档中所有的标签的一个分组选择器,并用*代表所有的标签。如
* {color:red;}
继承
在css规则中,子标签从父标签继承属性,如果子标签不想使用父标签的样式,那么需要给子标签重新添加样式。如
body {
font-family: Verdana, sans-serif;
}
p {
font-family: Times, "Times New Roman", serif;
}
类选择器
基础
类选择器允许以一种独立于文档标签的方式来指定样式。为了将类选择器的样式与标签关联,必须将标签的clas属性指定为一个适当的值。然后在类名前面加点(.),即可定义一个类选择器。<head>
<title>test---html</title>
<meta charset="utf-8" />
<style type="text/css">
.test{font-size: 50px;color: rgb(180,23,78);}
</style>
</head>
<body>
<p class="test">imyaxml</p>
<p>mfdafa</p>
</body>
结合元素选择器
类选择器也可以和元素选择器结合使用。只需要在点号(.)前加上标签名即可。如:p.test,该选择器会匹配class属性包含test的所有p标签。 虽然span标签的class值也为test,但在定义类选择器时结合了p标签,因此这个选择器对span是无效的。 这点要与后代选择器区分开:后代选择器不同的选择器之间用[空格]隔开,而结合选择器却是直接写在一起的。多类选择器
class属性可以为词列表,不同词之间用空格隔开即可。因此,可将类选择器结合,如.demo.test,此时便要求class属性值中必须含有demo和test两个记号,否则不会被选择。 要注意:类选择器可能区分大小写,因此最好还是一致。id选择器
类似于类选择器,但以#开头,并且引用标签中id属性的值。 不同于class属性,id属性不支持词列表,因此id选择器不能结合使用,即无法写成#id1#id2形式。 也要注意区分大小写,也支持与元素选择器结合使用。 一个文档中,id是唯一的,因此id选择器在一个文档中最多只会使用一次。(谷歌,safari是可以同名id)属性选择器
根据标签的属性和属性值选择标签。简单选择
只需要标签拥有该属性,而不考虑属性值是什么,此时就可以使用简单的属性选择器。其格式为 标签名[属性名1][属性名2]{声明1;声明2} 如<style type="text/css">该选择器只对第一个img标签有用,对第二个无效。因为第二个img标签并没有设置alt属性。
img[alt]{border: 5px solid red;}
</style>
</head>
<body>
<img src="./bg.png" alt="test"/><img src="./bg.png" />
</body>
如果想根据多个标签进行选择,只需要在后面跟上别的属性即可。如img[alt][width],这个选择器不会选择只定义了alt属性的标签。
根据属性值选择
除了根据属性选择外,还可以进一步缩小选择范围——含有特定属性值的属性的标签才能被选择。基本格式为 标签名[属性名1="属性值1“][属性名2="属性值2“]{声明1;声明2} 如<style type="text/css">上面的选择器只对第一个img标签有用,对第二个无效,因为第二个img标签的alt属性值不是test---html不满足属性选择器。 在上面的例子中,属性和属性值必须完全匹配才能被选择。
img[alt="test---html"]{border: 5px solid red;}
</style>
</head>
<body>
<img src="./bg.png" alt="test---html" />
<img src="./bg.png" alt="test--html">
</body>
部分属性值选择
如果属性值是词列表,并且只要词列表中存在某个词,该标签就会被选择。在此种情况下,需要使用部分属性值选择。格式 标签名[属性名~=属性值][属性名~=属性值]{声明1;声明2}<style type="text/css">上述选择器会作用于第一个标签,不会作用于第二个标签。因为第一个标签的class属性值含有test词,而第二个没有。 这点类似于与元素选择器结合使用时的类选择器,如p.test表示只要class属性值中有test词即可,完全等同行img[class~="test"],但后者的适用范围更广,不但能用于class属性,还可用于别的属性,前者却只能使用于class属性。
img[class~="test"]{border: 5px solid red;}
</style>
</head>
<body>
<img src="./bg.png" class="test demo ha" />
<img src="./bg.png" class="demo" />
</body>
匹配规则
第三种指的是:属性值列表中必须包含有指定的value,而不是包含以value开头的词。如
<style type="text/css">这个属性选择器可以选择第一个,但不能选择第二个。因为第二个h1标签的alt属性值并不包含normal单词。
h1[alt~="normal"]{color: red;font-size: 60px}
</style>
</head>
<body>
<h1 alt="normal fadf">span下的em标签</h1>
<h1 alt="normal1 fadf">span下的em标签</h1>
第四个只会匹配以value-开头的属性值(将属性值当作整个单词)或者属性值为value的标签。如
<style type="text/css">上述的选择器只会匹配前两个标签,不会匹配最后一个标签。
h1[alt|="normal"]{color: red;font-size: 60px}
</style>
</head>
<body>
<h1 alt="normal- demo">span下的em标签</h1>
<h1 alt="normal">fdaf</h1>
<h1 alt="normala">span下的em标签</h1>
</body>
其中后三者可按如下理解
不管属性值是词列表还是单个单词,前后是否有空格,在^$*时,都按一整个单词(空格也算)匹配。如[class^="test"]是可以匹配class属性值为"test- demo ---haha"的标签的,但无法匹配" test"标签。
后代选择器
将父标签与后代标签通过空格连接组成的选择器。具体可以理解为:在父标签下的某个后代标签才会被选择,否则不会被选择。如h1 em{color:red;}只会作用于h1标签下的em标签,并不会作用于p标签下的em标签。
后代标签与父标签的层级间隔可以无限。
可以和其它选择器结合使用,如
h1[alt^="normal"] em{color: red;}它表示alt属性值以normal开头的h1标签下的em标签才会被选中,其余的都不会被选中。
子元素选择器
类似于后代选择器,但子元素选择器只能选择做为某标签子标签的标签,并且用>进行连接。如
h1>em{color: red;}它表示做为h1的子标签的em标签才会被选中。
相邻兄弟选择器
两标签具有相同的父标签,并且两标签相邻,且标签出现的顺序和样式中定义的顺序一致,第二个标签才会被选中。如
p + h1 {margin-top:50px;}它会作用于
<p>This is paragraph.</p>
<h1>This is a heading.</h1>
但如果将样式改写成h1+p,那么不会作用于下面的代码。
伪类选择器
所谓的伪类就是一个状态,比如鼠标悬停,已点击过等。类似于android中的selector。格式为
selector : pseudo-class {property: value}常用的伪类如下:
最常用的就是:hover,鼠标悬停时的状态。如:
h1:hover{color: red;font-size: 60px}
active:鼠标点上去尚未放开时的状态,该状态一般不写。hover:鼠标放上去,但未点击时的状态;visited:已经访问过的状态。写这几种状态时,一定要按lvha顺序进行操作,其中a:link可以简写成a。
优先级
总体来说,谁的范围越精确,最后的结果就按哪个选择器进行。因此,类选择器比元素选择器的优先级高,即使元素选择器是后代选择器,兄弟选择器,子元素选择器。而属性选择器又比类选择器优先级高,但id选择器比属性选择器优先级高(因为id是唯一的,而属性可以不唯一)。如果说
关系如下:
元素选择器 < 类选择器 < 属性选择器 < id选择器