CSS选择器【关于选择器看这一篇就够了!】

27 篇文章 1 订阅

目录

选择器分类

标签选择器

ID选择器

class选择器

通配符选择器

复合选择器

后代选择器

交集选择器

并集选择器

复合选择器

伪类选择器

元素关系选择器

子选择器

相邻兄弟选择器

通用兄弟选择器

序号选择器

:first-child选择第一个子元素

:nth-child(n)选择某一序号子元素

:nth-of-type(n)将选择第n种标签的子元素(类)

属性选择器

CSS3新增伪类

:empty选择为内容为空的p标签

:focus选择当前焦点的表单元素

:enabled选择当前有效的表单元素

:disabled 选择当前无效的表单元素

:checked 选择当前已经勾选的单选按钮或复选框

:root 选择根元素,即

标签

CSS3新增:伪元素

 ::before

::after

::selection

::first-letter

CSS选择器的权重计算

层叠性

层叠性的冲突处理

复杂选择器权重计算

!important提升权重

选择器分类

对于CSS选择器的类型分为“CSS2.1传统选择器”和“CSS3新增选择器

传统CSS2.1选择器

  • 标签选择器和id选择器
  • class(类)选择器
  • 符合选择器
  • 伪类

CSS3新增选择器

  • 元素关系选择器
  • 序号选择器
  • 属性选择器
  • CSS3新增伪类
  • 伪元素

标签选择器

标签选择器也叫:“元素选择器”、“类型选择器

  • 它直接使用元素的标签名当做选择器,将选择页面上所有该种标签
  • 标签选择器将选择页面上所有该种标签,无论标签所处位置的深浅
/* 选中当前页面上所有的h1标签和p标签 */
h1 {
    color:blue;
    font-size:30px;
}

p {
    color:black;
    backgroun-color:18px;
}

 标签选择器的作用:

  • 标签选择器的覆盖面非常大,通常用于标签样式的初始化
ul {
    /* 去掉无序列表左侧小圆点 */
    list-style:none;
}

a {
    /* 去掉超链接下划线 */
    text-decoration:none;
}

ID选择器

ID选择器使用HTML元素的id来选择特定的元素

  • 元素的id在HTML中是唯一的,因此ID选择器用于选择一个唯一的元素
  • ID的名称只能由字母、数字、下划线、短横线构成,不能以数字开头,字母区分大小写
  • 名称最好是:“见名知意,多一个英文单词之间用‘-’分隔”
  • 要选择具有特定id的元素,在id前面写一个井号(#),后跟该元素id

 下面的代码,用于选择id为“desc”标签

<style>
  #desc {
    background-color: black;
    color: aliceblue;
    font-size: 20px;
  }
</style>

<body>
  <p id="desc">定义一个id属性</p>
</body>

class选择器

class属性表示“类名”

  • 类名的命名规范和id选择器相同
  • 类选择器以“.”前缀开头
  • 多个标签可以定义相同的类名,因此class选择器通常用来选择“一群”标签

下面的代码用来选择类名为“desc”的标签,共选择了“<p>和<div>”两个标签

<style>
  .desc {
    font-size: 30px;
    color: skyblue;
  }
</style>

<body>
  <p class="desc">定一个class属性</p>
  <div class="desc">我是一个div标签</div>
</body>

同一个标签也可以同时属于多个类,类名之间用空格隔开

<style>
  .desc {
    font-size: 30px;
    color: skyblue;
  }

  .para {
    background-color: beige;
  }
</style>

<body>
  <!-- 同时属于两个类 -->
  <p class="desc para">定一个class属性</p>
</body>

原子类

  • 在网页项目前,可以将所有常用字号、文字、颜色、行高、外边距、内边距等等都设置为单独的类
  • HTML标签就可以快速的通过给它们添加类名,来实现快速地添加一些样式
  • 应用场景:组件化开发
  • (不建议乱用,否则后续开发会乱套)

一个使用原子类的例子:

<style>
  .fs12 {
    font-size: 12px;
  }
  .fs14 {
    font-size: 14px;
  }
  .fs16 {
    font-size: 16px;
  }
  .fs18 {
    font-size: 18px;
  }
  .fs20 {
    font-size: 20px;
  }
  .fs22 {
    font-size: 22px;
  }

  .color-red {
    color: red;
  }
  .color-black {
    color: black;
  }
  .color-green {
    color: green;
  }
  .color-blue {
    color: blue;
  }
</style>

通配符选择器

  • 代表页面当中所有的元素
  • 基本不用,对性能消耗过大
* {
    /* 设置所有元素的颜色为红色 */
    color:red;
}

复合选择器

后代选择器

  • 在CSS中,使用“空格”表示“后代”
  • 后代并不一定是“儿子”
  • 后代选择器可以有很多空格,隔开好几代
<style>
  /* .box p 这种新式的选择器,称之为 “后代选择器” */
  .box p {
    color: skyblue;
    font-size: 20px;
  }
  /* 多个空格形式 */
  .box ul li p a {
    color: red;
  }
</style>

<body>
  <div class="box">
    <p>我是div中的段落标签</p>
    <p>我是div中的段落标签</p>
    <ul>
      <li>
        <p>我是 ul li 中的 <a href="#">p标签</a></p>
      </li>
    </ul>
  </div>
</body>

效果:

交集选择器

交集选择器,通常用于筛选带有某个“类”或“id”或“属性”的标签

  • 如:选择有.box类的h1标签
<style>
  h1.box {
    color: skyblue;
    font-size: 30px;
  }
</style>

<body>
  <h1 class="box">交集选择器</h2>
</body>

并集选择器

并集选择器也叫“分组选择器”,逗号表示分组

  • 并集选择器常用来选择,不同类型的元素
ul,
ol,
p {
  font-size: 12px;
  color: red;
}

复合选择器

  • 选择器可以任何搭配、结合,从而形成复合选择器,但是我们必须要能一目了然的看出选择器代表的含义

 

		<style>
			div.box ul li p.para span {
				color: red;
			}
		  </style>
		  
		  <body>
			<div class="box">
				<ul>
					<li>
						<p class="para">
							<span>我是最终被选择到的元素</span>
						</p>
						<p>我没有被选择到</p>
					</li>
				</ul>
			</div>
			<div>
				我也没有被选择到
			</div>

效果:

伪类选择器

伪类是添加到选择器的描述性词语,指定要选择的元素的特殊状态

超链接拥有四个特殊状态

  • a:link:没有被访问的超链接
  • a:visited:已经访问过的超链接
  • a:hover:正被鼠标悬停的超链接
  • a:active:正被激活的超链接(按下按键,但还没有松开按键)

爱恨准则

  • a标签的伪类书写,按照“爱恨准则”的顺序(LOVE HATE),否则伪类不生效
  • link > visited > hover > active 
  <style>

    /*
      顺序不能乱 ,爱恨准则 LOVE HATE
      :link  -> :visited -> :hover -> :active
    */

    a:link {
      color:red;
    }
    a:visited {
      color:blue;
    }
    a:hover {
      color: green;
    }
    a:active {
      color:yellow;
    }

  </style>

</head>
<body>

<h1>伪类</h1>

<p>
  <a href="https://baidu.com">百度一下,你就知道 !</a>
</p>

</body>

注:

伪类“hover”不仅可以用在a标签上,还可以用在其它标签上

元素关系选择器

子选择器

  • 当时用 > 符号分隔两个元素时,它只会匹配那些作为第一个元素的直接后代元素
  • 子选择器只能选择“父子元素”,不能跨级选择孙子,但是后代选择器“使用空格隔开”可以选择某一元素的所有后代
		<style>
			/* 子选择器 :两个标签为 父子元素 */
			.box > p {
			  color: red;
			}
		  
			/* 后代选择器:不一定限制是子元素
			.box p {
			  color: skyblue;
			} */
		  </style>
		  
		  <body>
			<h1>元素关系选择器</h1>
			<h2>子选择器</h2>
		  
			<div class="box">
			  <p>我是div的第一个子元素,也是一个段落标签</p>
			  <p>我是div的第二个子元素,也是一个段落标签</p>
			  <ul>
				<li>
				  <p>我是一个段落标签</p>
				</li>
				<li>
				  <p>我是一个段落标签</p>
				</li>
			  </ul>
			</div>
		  </body>

效果:

当我们把“子选择器注释,将.box p拉出注释”后:

		<style>
			/* 子选择器 :两个标签为 父子元素
			.box > p {
			  color: red;
			} */
		  
			/* 后代选择器:不一定限制是子元素 */
			.box p {
			  color: skyblue;
			}
		  </style>

效果图:

可以看到,所有<p>标签都被选择了

相邻兄弟选择器

  • 相邻兄弟选择(+)基于两个选择器之间,当第二个元素紧跟在第一个元素之后,且两个元素都属于同一个父元素的子元素,则第二个元素将被选中
  • a + b 即选择 紧跟在a后面的第一个b

 

		<style>
			/* 相邻兄弟选择器:a + b 即 选择 紧跟在a后面的第一个b */
			p + span {
			  color: seagreen;
			}
		  </style>
		  
		  <body>
			<h2>相邻兄弟选择器</h2>
			<p>a + b 即 选择 紧跟在a后面的第一个b</p>
		  
			<p>
			  <p>标题一</p>
			  <span>小米智能电视</span>
			  <span>1999元</span>
			</p>
		  
			<p>
			  <p>标题二</p>
			  <span>小米空气净化器</span>
			  <span>2999元</span>
			</p>
		  </body>

效果:

通用兄弟选择器

  • 通用兄弟选择器(~) 波浪线 (a~b)选择a元素之后所有同层级b元素
		<style>
			/* 通用兄弟选择器:a ~ b 即 选择p后面所有的span */
			p ~ span {
			  color: seagreen;
			}
		  </style>
		  
		  <body>
			<h2>通用兄弟选择器</h2>
			<p>a ~ b 即 选择p后面所有的span</p>
		  
			<p>
			  <p>标题一</p>
			  <span>小米智能电视</span>
			  <span>1999元</span>
			</p>
		  
			<p>
			  <p>标题二</p>
			  <span>小米空气净化器</span>
			  <span>2999元</span>
			</p>
		  </body>

效果:

序号选择器

选择器描述
:first-child第一个子元素
:last-child最后一个子元素
:nth-child(n)

第n个子元素

:ntgh-of-type(n)第n个某类型子元素
:nth-last-child(n)倒数第n个子元素
:nth-last-of-type(n)倒数第n个某类型子元素

:first-child选择第一个子元素

<style>
  /* 表示.box盒子中的第一个p标签 */
  .box p:first-child {
    color: skyblue;
  }
</style>

<body>
  <h2>:first-child 选择第一个子元素</h2>

  <div class="box">
    <!-- 第一个p标签被选择 -->
    <p>第1个p标签</p>
    <p>第2个p标签</p>
    <p>第3个p标签</p>
    <p>第4个p标签</p>
    <p>第5个p标签</p>
  </div>
</body>

 效果:

:nth-child(n)选择某一序号子元素

<style>
  /* 选择任意序号的子元素,第2个p标签 */
  .box2 p:nth-child(2) {
    color: blue;
  }
</style>

<body>
  <h2>:nth-child(n) 可以选择任意序号的子元素</h2>

  <div class="box2">
    <p>第1个p标签</p>
    <p>第2个p标签</p>
    <p>第3个p标签</p>
    <p>第4个p标签</p>
    <p>第5个p标签</p>
  </div>
</body>

效果:

:nth-child(n)可以写成“an+b”的形式,表示:“从b开始每a个的选择一个”,不能写成(b+an)

<style>
  /* 
      写成 an+b 的形式,表示从b开始每a个选择一个 
      将 n 作为自然数从 0,1,2 ... 开始带入公式计算,即可得出哪一行被选中
      */
  .box3 p:nth-child(3n + 2) {
    color: blueviolet;
  }
</style>

<body>
  <h2>:nth-child() 可以写成 an+b 的形式</h2>
  <p>表示从b开始每a个选择一个</p>

  <div class="box3">
    <p>第1个p标签</p>
    <p>第2个p标签</p>
    <p>第3个p标签</p>
    <p>第4个p标签</p>
    <p>第5个p标签</p>
    <p>第6个p标签</p>
    <p>第7个p标签</p>
    <p>第8个p标签</p>
    <p>第9个p标签</p>
    <p>第1个p标签</p>
  </div>
</body>

效果:

:nth-of-type(n)将选择第n种标签的子元素(类)

<style>
  /* :nth-of-type(n) 将选择同种标签指定序号的子元素 */
  .box6 p:nth-of-type(3) {
    color: salmon;
  }
</style>

<body>
  <h2>:nth-of-type(n) 将选择同种标签指定序号的子元素</h2>

  <div class="box6">
    <p>第1个p标签</p>
    <p>第2个p标签</p>
    <h3>第1号h3标签</h3>
    <h3>第2号h3标签</h3>
    <!--第三个p标签将被选中-->
    <p>第3个p标签</p>
    <p>第4个p标签</p>
    <p>第5个p标签</p>
    <h3>第3号h3标签</h3>
    <h3>第4号h3标签</h3>
  </div>
</body>

 效果:

属性选择器

案例描述
img[alt]选择带有alt属性的img标签
Img[alt="123"]选择alt属性是123的img标签
Img[alt=^"123"]选择alt属性以123开头的img标签
img[alt$="123"]选择alt属性以123结尾的img标签
Img[alt*="123"]选择alt属性中包含的123文字的img标签
Img[alt~="123"]选择alt属性中有空格隔开的123字样的img标签
Img[alt | ="123"]选择alt属性中以123-开头的img标签

实际开发中用到的很少,了解即可

CSS3新增伪类

:empty选择为内容为空的p标签

该伪类,只对<p>标签生效

		<style>
			p,span {
			  width: 200px;
			  height: 50px;
			  border: 1px solid red;
			}
		  
			/* :empty 选择所有p标签,为空(没有内容)的标签 */
			p:empty {
			  background-color: skyblue;
			}
		  </style>
		  
		  <body>
			<h1>CSS3新增伪类</h1>
		  
			<h2>:empty 选择空标签</h2>
			<p class="para1"></p>
			<p class="para2"></p>
			<p class="para3">123</p>
			<p class="para4"></p>
		  </body>

效果:

:focus选择当前焦点的表单元素

只对表单元素有效,例如<input>、<button>

<style>
  /* :focus 选择当前获得焦点的表单元素 */
  input:focus {
    background-color: skyblue;
  }
</style>

<body>
  <h2>:focus 选择当前获得焦点的表单元素</h2>

  <div>
    <input type="text" />
    <input type="text" />
    <input type="text" />
  </div>
</body>

效果:

:enabled选择当前有效的表单元素

当前有效”即表单元素不处于”禁止修改“状态

<style>
  /* :enabled 选择当前有效的表单元素 */
  input:enabled {
    background-color: salmon;
  }
</style>

<body>
  <h2>:enabled 选择当前有效的表单元素</h2>

  <div>
    <input type="text" />
    <input type="text" />
    <input type="text" />
  </div>
</body>

效果:

:disabled 选择当前无效的表单元素

<style>
  /* :disabled 选择当前无效的表单元 */
  input:disabled {
    background-color: green;
  }
</style>

<body>
  <h2>:disabled 选择当前无效的表单元</h2>

  <div>
    <input type="text" />
    <input type="text" disabled />
    <input type="text" />
  </div>
</body>

效果:

:checked 选择当前已经勾选的单选按钮或复选框

<style>
  /* 
      :checked 选择当前已经勾选的单选按钮或复选框 
      +span 表示input标签后边第一个span标签
    */
  input:checked + span {
    color: red;
  }
</style>

<body>
  <h2>:checked 选择当前已经勾选的单选按钮或复选框</h2>

  <div>
    <label><input type="checkbox" /><span>篮球</span></label>
    <label><input type="checkbox" checked /><span>乒乓球</span></label>
    <label><input type="checkbox" /><span>书法</span></label>
  </div>
</body>

效果:

:root 选择根元素,即<html>标签

常用于设置一些变量,这些变量对应于字号,颜色等,方便后续修改

<style>
  /* :root 选择根元素,即 <html>标签 */
  :root {
    font-size: 20px;
  }
</style>

CSS3新增:伪元素

  • CSS3新增了”伪元素“特性,表示”虚拟动态创建的元素
  • 伪元素用双冒号“::”表示

 ::before

  • ::before创建一个伪元素, 将成为匹配选中的元素的第一个元素
  • 必须设置content属性表示其中的内容
<style>
  /* ::before 创建一个伪元素,将成为匹配选中的元素的第一个元素 */
  a::before {
    content: "※☆";
  }
</style>

<body>
  <h2>::before 创建一个伪元素,将成为匹配选中的元素的第一个元素</h2>

  <a href="#">123</a>
</body>

效果:

::after

  • ::after创建一个伪元素,成为匹配选中的元素的最后一个元素
  • 必须设置content属性表示其中的内容
<style>
  /* ::after 创建一个伪元素,成为匹配选中的元素的最后一个子元素 */
  span::after {
    content: "△❥(^_-)";
  }
</style>

<body>
  <h2>::after 创建一个伪元素,成为匹配选中的元素的最后一个子元素</h2>

  <span>123</span>
</body>

效果:

::selection

  • ::selection选择器匹配被用户选取的部分
  • 只能向::selection选择器应用少量css属性:color、background、cursor、 outline
		<style>
			/* 
				::selection 选择器匹配被用户选取的选取是部分
				只能向 ::selection 选择器应用少量 CSS 属性:color、background、cursor 以及 outline
			  */
			.box::selection {
			  color: pink;
			  background-color: black;
			}
		  </style>
		  
		  <body>
			<h2>::selection 选择器匹配被用户选取的选取是部分</h2>
			<div class="box">鞠婧祎你好美!!!!!</div>
		  </body>

效果:

::first-letter

  • 选中某元素中第一行的第一个字母
  • 必须是块级元素
		<style>
			/* ::first-letter 会选中某元素中第一行的第一个字母 */
			.box1::first-letter {
			  font-size: 30px;
			  color: skyblue;
			}
		  </style>
		  
		  <body>
			<h2>::first-letter 会选中某元素中第一行的第一个字母</h2>
		  
			<div class="box1">鞠婧祎</div>
		  </body>

效果:

CSS选择器的权重计算

层叠性

  • CSS全名叫“层叠式样式表”,层叠性是它很重要的性质
  • 层叠性:多个选择器可以同时作用于同一个标签,效果叠加
<style>
  div {
    width: 300px;
    height: 100px;
  }

  .para {
    color: aliceblue;
    background-color: skyblue;
  }

  #desc {
    background-color: green;
  }
</style>

<body>
  <h2>层叠性</h2>

  <div class="para" id="desc">我是一个div</div>
</body>

效果:

层叠性的冲突处理

  • 多个选择器定义同一元素的冲突问题
  • CSS有严密的处理冲突规则
  • id权重 > class权重 > 标签权重 > 通配符权重
<style>
  /* id 权重 > class权重 > 标签权重 */
  p {
    color: red;
  }

  #arry {
    color: skyblue;
  }

  .me {
    color: green;
  }
</style>

<body>
  <h2>层叠性的冲突处理</h2>

  <p class="me" id="arry">我是一个段落标签</p>
</body>

 效果:

复杂选择器权重计算

  • 复杂选择器可以通过(id的个数,class的个数,标签的个数)的形式,计算权重
<style>
  /* id 权重 > class权重 > 标签权重 */

  /* (2,0,1)权重 */
  #box1 #box2 p {
    color: red;
  }

  /* (2,1,2)权重 三个中,此复合样式权重最高,生效*/
  #box1 div.box2 #box3 p {
    color: green;
  }

  /* (0,3,1)权重 */
  .box1 .box2 .box3 p {
    color: blue;
  }
</style>

<body>
  <h2>复杂选择器权重计算</h2>

  <div class="box1" id="box1">
    <div class="box2" id="box2">
      <div class="box3" id="box3">
        <p>我是一个段落标签</p>
      </div>
    </div>
  </div>
</body>

效果:

!important提升权重

  • 如果我们需要将某个选择器的某条属性提升权权重,可以在属性后边写上!important
  • 实际企业中,不允许使用!important,因为这会带来不经意的样式冲突
<style>
  /* 权重 (0,1,2) */
  .list ul li {
    color: red;
  }

  /* 权重(0,1,0) */
  /* !important 提升权重,生效 */
  .desc {
    color: skyblue !important;
  }
</style>

<body>
  <h2>!important 提升权重</h2>

  <div class="list">
    <ul>
      <li>我是列表项</li>
      <li class="desc">我是列表项</li>
      <li>我是列表项</li>
      <li>我是列表项</li>
      <li>我是列表项</li>
    </ul>
  </div>
</body>

效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是洋洋a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值