CSS之选择器
一、CSS介绍 概念: CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行渲染 语法:每个CSS样式由两个组成部分:选择器和声明。声明又包括属性和属性值。每个声明之后用分号结束 span {width: 1000px;background-color: red} 注释:/*注释内容*/ 二、CSS的引入方式 1、行内样式 行内式是在标签的style属性中设定CSS样式。 <p style="color: red;font-size:20px">Hello World!</p> 2、内部样式 嵌入式是将CSS样式集中写在网页的<head></head>标签对的<style></style>标签对中。格式如下: <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css"> p {color:green;font-size:20px} </style> </head> 3、外部样式 外部样式就是将css写在一个单独的文件(.css文件)中,然后在HTML页面进行引入。 <link rel="stylesheet" href="Mystyle.css"> # 可以在任意位置声明,但一般在head标签内部声明 三、CSS基本选择器 1、元素选择器:直接赋予某元素一些样式,直接选中这个元素标签 p {color: "red";} 2、ID选择器:赋予某ID一些样式,#代表ID选择器选中这个ID #i1 {background-color: red;} 3、类选择器:赋予某类class一些样式,.代表类选择器选中这个class .c1 {font-size: 14px;} p.c1 {color: red;} # 这个是代表有c1这个类的p元素 <p class="c1">我是有c1的p元素</p> # 样式生效 <i class="c1">我是有c1的i元素</i> # 样式不生效 注意: 样式类名不要用数字开头(有的浏览器不兼容) 标签中的class属性如果有多个,要用空格分隔。 4、通用选择器:所有的标签都可以使用这个样式(但是优先级高的会覆盖这个通用样式) * {font-size:24px;} 四、组合选择器 1、儿子选择器:只找儿子,孙子不要 /*选择div下的a标签*/ div>a {font-size: 25px} <div> <a href="">我是儿子a</a> <a href="">我也是儿子a</a> <p> <a href="">我是孙子a</a> <!-- 孙子a字体没有变大--> </p> </div> 2、后代选择器:子子孙孙 /*在ID值为d1的标签中找p标签*/ #d1 p {color: green} <div id="d1"> <p>我是儿子P标签</p> <p>我也是儿子P标签</p> <a href=""> <p>我是孙子P标签</p> </a> </div> 3、毗邻选择器 /*选择紧接着<div></div>元素之后的一个<p></p>元素*/ div+p {color: deeppink} <div></div> <p>div下的第一个P</p> <!--变粉色--> <p>div下的第二个P</p> <!--没有变粉色--> 4、弟弟选择器 /*ID值为d2的标签后面所有的兄弟p标签*/ #d2~p{color:purple} <div id="d2">d2</div> <p>我是d2的弟弟p</p> <!--样式生效--> <a href="">我是d2的弟弟a</a> <!--样式不生效--> <p>我也是d2的弟弟p</p> <!--样式生效--> 5、注意 儿子、孙子代表的是在某个标签内的其他标签,是被某个标签包含的,例如: <div> <p>div的儿子</p> </div> 而毗邻和弟弟并不是包含关系,是同级的,例如: <div></div> <p>div的弟弟(毗邻)</p> <p>div的弟弟</p> 五、属性选择器 1、常用的: /*用于选取带有指定属性的元素*/ /*找到所有带title这个属性的p标签*/ p[title] {color: red;} <p title="">p1</p> <p title="">p2</p> <p title="123">p3</p> p1、p2、p3都生效 /*用于选取带有指定属性和值的元素。*/ /*找到title属性值是'hello'的p标签*/ p[title="hello"] {color: green;} <p title="">p1</p> <p title="">p2</p> <p title="hello">p3</p> 只有p3生效 2、不常用的 /*找到所有title属性以hello开头的div元素*/ div[title^="hello"] { color: red; } /*找到所有title属性以hello结尾的div元素*/ div[title$="hello"] { color: yellow; } /*找到所有title属性中包含(字符串包含)hello的div元素*/ div[title*="hello"] { color: red; } <div title="helloworld">helloworld</div> <div title="hello world">hello world</div> 都生效 /*找到属性值按照空格分割得到的列表中包含指定的值的div元素*/ div[title~="hello"] { color: green; } <div title="helloworld">helloworld</div> <div title="hello world">hello world</div> 只有第二个生效 六、分组和嵌套 1、分组 当多个元素的样式相同的时候,我们没有必要重复地为每个元素都设置样式,我们可以通过在多个选择器之间使用逗号分隔的分组选择器来统一设置元素样式。 例如: div, p { color: red; } 上面的代码为div标签和p标签统一设置字体为红色。 2、嵌套 多种选择器可以混合起来使用,比如:.c1类内部所有p标签设置字体颜色为红色。 .c1 p { color: red; } 七、伪类选择器
根据标签不同状态给标签设置不同样式
伪类选择器格式:标签:状态 {样式} 例如: /* 未访问的链接 */ a:link { color: red } /* 已访问的链接 */ a:visited { color: blue } /* 鼠标移动到链接上 */ a:hover { color: yellow } /* 点击链接的那一瞬间 */ a:active { color: pink } /*鼠标移上去之后*/ span:hover {color: purple} /*input输入框获取焦点时样式*/ input:focus { background-color: green } 八、伪元素选择器
通过CSS操作HTML内容
1、first-letter /*常用的给首字母设置特殊样式*/ div:first-letter { font-size: 48px; color: red; } 2、before /*在每个<p>元素之前插入内容*/ p:before { content:"*"; color:red; } 3、after /*在每个<p>元素之后插入内容*/ p:after { content:"[?]"; color:blue; } before和after多用于清除浮动。 4、例如 /*css样式*/ <style type="text/css"> div:first-letter{ font-size: 28px; color: red; } p:before { content: "*"; color: red; } p:after { content: "?"; color: deeppink; } </style> /*body部分代码*/ <body> <div>幽谷茶香,感叹生命的茁壮</div> <div>幽谷茶香,感叹生命的茁壮</div> <p>幽谷茶香,感叹生命的茁壮</p> <p>幽谷茶香,感叹生命的茁壮</p> <p>幽谷茶香,感叹生命的茁壮</p> </body> 九、选择器的优先级 1、选择器的优先级:浏览器是根据不同选择器的权重来决定选用哪个样式的,具体的选择器权重计算方式如下 内联样式(1000) > id选择器(100) > 类选择器(10) > 元素选择器(1) > 继承(0) 内联样式的权重为:1000 --> <p style="color: red;">内联样式</p> id选择器的权重为:100 --> <p id="d1">id选择器</p> 类选择器的权重为:10 --> <p class="c1">类选择器</p> 元素选择器的权重为:1 --> <p>元素选择器</p> 继承的权重为:0 例子: /*css样式*/ <style> /* p1权重100 */ #p1 {color: orange} /* .c1>.c2权重10+10=20 */ .c1>.c2 {color: yellow} /* c2权重10 */ .c2 {color: green} /* p权重1 */ p {color: red} </style> /*body部分代码*/ <div class="c1"> <p class="c2" id="p1" >c1内部的p标签</p> </div> /*最终颜色是orange*/ 注意:权重计算永不进位 也就是说想.c1>.c2这样每个类选择器权重是10(两位数),两个就是20,虽然权重可以相加, 但是权重计算不会进位,也就是说就算有11个类选择器相加,也不会进位,不会变成3位数, 因此无论多少个类选择器相加权重也是一样没有一个id选择器的权重大,只是可以在类选择器中占的权重大, 比如.c1>.c2>.c3权重比.c1>.c2权重大 不讲道理的important: 通过添加!important方式来强制让样式生效,但并不推荐使用。因为如果过多的使用!important会使样式文件混乱不易维护。 万不得已的情况下才使用!important 2、css继承 继承是CSS的一个主要特征,它是依赖于祖先-后代的关系的。 继承是一种机制,它允许样式不仅可以应用于某个特定的元素,还可以应用于它的后代。 例如一个div定义了的字体颜色值也会应用到div的后代中。 /*css样式*/ <style> .c {color: red} </style> /*body部分代码*/ <body> <div class="c"> abc <p>def</p> <div> <p>gh</p> </div> </div> <p>qwe</p> </body> 上面的代码中abc def gh 都会变成红色 而qwe则不会变 然而CSS继承性的权重是非常低的,是比普通元素的权重还要低的0, 我们只要给对应的标签设置字体颜色就可覆盖掉它继承的样式。 /*css样式*/ <style> .c {color: red} p {color: blue;} </style> /*body部分代码*/ <body> <div class="c"> abc <p>def</p> <div> <p>gh</p> </div> </div> <p>qwe</p> </body> 上面的代码中只有abc会变成红色 而 def gh qwe则变成蓝色 注意: 继承是CSS重要的一部分, 但CSS继承也是有限制的, 有一些属性不能被继承, 如:border, margin, padding, background等。