CSS回顾-CSS选择器详解

一、引言

我来填坑啦!之前在CSS基础知识详解中介绍过,CSS 是一门基于规则的语言。是由选择器样式信息组成:选择器 {样式信息}。CSS 选择器是 CSS 规则的关键,能精准定位 HTML 元素,CSS3 新增选择器更是增强了设计能力。本篇文章就是用来总结CSS的多种选择器类型。

二、基本选择器

为了简化文章,下面所用到样式示例的页面结构以下面为主:

html 复制代码
<h1 id="h1Title">基本选择器详解</h1>
<div class="boxClass">
    <span>span标签1</span>
    <span>sapn标签2</span>
</div>

2.1 元素选择器(标签选择器)

这是最基本的选择器类型。它直接根据 HTML 标签名来选择元素。例如,span选择器会选择所有的<span>元素,为这些span元素设置样式属性。

css 复制代码
span {
  color: red;
  font-size: 16px;
}

这种选择器的优点是简单直接,缺点是不够精确,会选中页面中所有该类型的标签。

2.2 类选择器

类选择器以.开头,后面跟着自定义的类名。在 HTML 中,通过class属性来应用类选择器。例如:

css 复制代码
.boxClass {
  background-color: yellow;
}

类选择器的优点是可以复用,多个不同的元素可以应用同一个类名来共享样式。

2.3 ID 选择器

ID 选择器以#开头,后面跟着唯一的 ID 名称。在 HTML 中,通过id属性来应用 ID 选择器。需要注意的是,ID 在一个页面中应该是唯一的。例如:

css 复制代码
#h1Title {
  border: 1px solid blue;
}

ID 选择器的优先级比类选择器高,但由于其唯一性,使用场景相对有限。

2.4 通配符选择器

通配符选择器用*表示,它会选择页面中的所有元素。例如:

css 复制代码
* {
  margin: 0;
  padding: 0;
}

这种选择器在重置页面默认样式时比较常用,但由于选择范围太广,可能会影响性能,需要谨慎使用。

三、组合选择器

组合选择器基础页面结构示例:

html 复制代码
<body>
  <!-- 外层父元素 -->
  <div class="parent">
    <div class="box1">box1标签</div>
    <div class="box2">box2标签<span>你一点也不普通</span></div>
    <div class="box3">box3标签</div>
    <p>段落标签</p>
    <div class="box4">box4标签</div>
  </div>
</body>

3.1 后代选择器

后代选择器用于选择某个元素的后代元素。用空格隔开两个选择器,例如body div表示选择所有在<body>元素内部的<div>元素。

css 复制代码
/* 后代选择器通过空格可以设置元素下所有特定元素后代 */
body div {
  /* body标签下所有div文字颜色设置为红色 */
  color: red;
}
.parent span {
  /* class选择器.parent元素下span标签文字颜色设置为粉色 */
  color: pink;
}

3.2 子元素选择器

子元素选择器用于选择某个元素的直接子元素。用>符号隔开两个选择器,如:

css 复制代码
/* 子元素选择器通过>可以设置直接子元素的样式 */
body > div {
  /* 将body下第一层div背景颜色设置为蓝色(并不会更改.parent下的div元素背景) */
  background-color: blue;
}

3.3 相邻兄弟选择器

相邻兄弟选择器用于选择紧接在某个元素之后的兄弟元素。使用+符号,如:

css 复制代码
/* 相邻兄弟选择器设置紧挨着当前元素的下一个元素样式 */
div + div {
  /* box2与box3背景色将变成黄色,因为他们是div元素同时上一个元素也是div
    box1没有上一个元素,box4上一个是p标签所以不会改变背景颜色
   */
  background-color: yellow;
}

3.4 通用兄弟选择器

通用兄弟选择器用于选择某个元素后面的所有兄弟元素。使用~符号,例如:

css 复制代码
/* 通用兄弟选择器设置当前元素同级下其他特定元素样式 */
div ~ div {
  /* box2、box3、box4背景色变成了橙色,他们都在div.box1同级下
    box1之前并没有div标签所以无法选中
  */
  background-color: orange;
}

四、属性选择器

属性选择器基础页面结构示例:

html 复制代码
<body>
  <!-- 外层父元素 -->
  <div class="parent">
    <input type="text" class="input">
    <input type="password" class="password">
    <button class="btn save">保存</button>
    <button class="btn reset">重置</button>
  </div>
</body>

4.1 简单属性选择器

根据元素是否具有某个属性来选择元素。例如:

css 复制代码
/* 简单属性选择器[属性名] */
[class] {
  /* 将含有class属性的元素更改背景色 */
  background-color: aqua;
}

4.2 属性值完全匹配选择器

要求属性值完全匹配指定的值。例如:

css 复制代码
/* 属性值完全匹配选择器,完全匹配属性名与属性值 */
[class="input"] {
  background-color: bisque;
}
[type="password"] {
  background-color: green;
}

4.3 部分属性值匹配选择器

  • 包含匹配 :使用*符号,如[class*="btn"]会选择class属性值中包含btn的元素。
  • 开头匹配 :使用^符号,如[href^="https://"]会选择href属性值以https://开头的元素。
  • 结尾匹配 :使用$符号,如[src$=".jpg"]会选择src属性值以.jpg结尾的元素。
css 复制代码
/* 部分属性值匹配选择器,根据匹配规则选择特定元素 */
/* 1.包含匹配*:包含特定属性值将会被选中 */
[class*="s"] {
  /* 两个button按钮将会更改背景颜色,他们class属性中都包含s */
  background-color: red;
}
/* 2.开头匹配^:包含特定属性值开头将会被选中 */
[class^="p"] {
  /* 父元素parent和input的password会被设置背景色 */
  background-color: pink;
}
input[class^="p"] {
  /* 只有input的password会更改背景色 */
  background-color: skyblue;
}
/* 3.结尾匹配$:包含特定属性值结尾将会被选中 */
div [class$="t"] {
  /* div的后代中input和重置按钮会被设置背景色 */
  background-color: pink;
}
div input[class$="t"] {
  /* div的后代中只有input会更改背景色 */
  background-color: skyblue;
}

4.4 多个属性选择器

可以同时根据多个属性来选择元素。例如:

css 复制代码
/* 4.多个属性嵌套:可以同时写多个属性匹配值 */
[class*="b"][class$="e"] {
  /* 满足class属性值由b开头e结尾只有保存按钮 */
  background-color: gray;
}

五、伪类选择器

5.1 链接伪类

  • :link:用于选择未被访问的链接。
  • :visited:用于选择已被访问的链接。
css 复制代码
a:link {
  color: blue;
}
a:visited {
  color: purple;
}

5.2 用户操作伪类

  • :hover:当鼠标悬停在元素上时应用样式。
  • :active:当元素被激活(如点击鼠标左键按下未松开时)时应用样式。
css 复制代码
button:hover {
  background-color: lightgray;
}
button:active {
  background-color: gray;
}

5.3 目标伪类(:target)

用于选择当前活动的锚点元素,即 URL 中带有#片段标识符所指向的元素。例如,当点击一个指向#section1的链接时,#section1元素可以通过:target伪类来添加样式。

css 复制代码
#section1:target {
  background-color: yellow;
}

5.4 语言伪类(:lang())

根据元素的语言属性来选择元素。例如,:lang(en)会选择lang属性值为en的元素。

css 复制代码
:lang(en) {
  quotes: '"' '"';
}

5.5 CSS3 新增伪类选择器

5.5.1 结构伪类

页面结构示例:

html 复制代码
  <div id="flat">
    <h3>结构类型<i>伪类</i></h3>
    <div>这是第1个盒子</div>
    <div>这是第2个盒子</div>
    <p>这是第3个盒子</p>
    <div>这是第4个盒子</div>
    <p>这是第5个盒子</p>
    <div>这是第6个盒子</div>
  </div>
  • :first-child :选择某个元素的第一个子元素。例如,p:first-child会选择作为父元素第一个子元素的<p>元素。
  • :last-child:选择某个元素的最后一个子元素。
  • :nth-child(n) :选择某个元素的第n个子元素,可以是具体数字、公式(如2n表示偶数位置的子元素,2n + 1表示奇数位置的子元素)。
  • :nth-of-type(n) :与:nth-child(n)类似,但从最后一个子元素开始计数。
  • :nth-child(n) :选择同类型的第n个子元素。例如,p:nth - of - type(2)选择父元素下第二个<p>类型的子元素。
  • :nth-last-of-type(n) :从最后一个同类型子元素开始计数选择第n个。
  • :only-child:选择父元素中唯一的子元素。
css 复制代码
/* :first-child 选择flat下第一个div元素*/
#flat div:first-child {
  /* 不生效,因为flat下第一个元素不是div */
  background-color: red;
}
/* :last-child 选择flat下最后一个div元素*/
#flat div:last-child {
  background-color: red;
}
/* :nth-child(2n) 从前往后选择flat下偶数元素设置样式 */
#flat div:nth-child(2n) {
  /* 注意:会在同一级下找偶数元素如果不是div标签则不会更改 */
  /* 所以只有盒子1变色 */
  background-color: pink;
}
/* :nth-last-child(2n) 从后往前选择flat下偶数元素设置样式 */
#flat div:nth-last-child(2n) {
  /* 注意:会在同一级下找偶数元素如果不是div标签则不会更改 */
  /* 所以只有盒子1变色 */
  background-color: skyblue;
}
/* :nth-of-type(2n) 从前往后选择flat下所有div元素偶数元素设置样式 */
#flat div:nth-of-type(2n) {
  /* 注意:会把同一级div进行筛选,不会受其他元素印象 */
  /* 所以2、6会更改背景颜色 */
  background-color: pink;
}
/* :nth-last-of-type(2n) 从后往前选择flat下所有div元素偶数元素设置样式 */
#flat div:nth-last-of-type(2n) {
   /* 注意:会把同一级div进行筛选,不会受其他元素印象 */
  /* 所以4、1会更改背景颜色 */
  background-color: skyblue;
}
/* :only-child选择父元素中唯一的子元素 */
#flat h3:only-child {
  /* 不生效h3同级下有其他标签,不满足条件 */
  color: red;
}
#flat h3>i:only-child {
  /* 生效h3下只有i标签 */
  color: red;
}
5.5.2 否定伪类(:not())

用于排除某些元素。例如,:not(p)会选择除了<p>元素之外的所有元素。

css 复制代码
div:not(.special) {
  color: red;
}
5.5.3 表单相关伪类
  • :enabled:选择所有可用的表单元素。
  • :disabled:选择所有禁用的表单元素。
  • :checked:选择所有被选中的单选框或复选框。
  • :indeterminate:选择状态不确定的表单元素(如部分浏览器中未完全选中的复选框组)。
css 复制代码
input:enabled {
  background-color: white;
}
input:disabled {
  background-color: red;
}

六、伪元素选择器

6.1 ::before 和 ::after

这两个伪元素用于在元素内容之前或之后插入生成内容。例如,可以用来添加装饰性的图标或文本。

css 复制代码
p::before {
  content: "前缀 ";
  color: green;
}
p::after {
  content: " 后缀";
  color: green;
}

6.2 ::first-letter 和 ::first-line

  • ::first-letter:用于选择元素内容的第一个字母,可以对其设置独特的样式,常用于首字下沉效果。
  • ::first-line:用于选择元素内容的第一行,可对其进行单独的样式设置。
css 复制代码
p::first-letter {
  font-size: 200%;
  color: red;
}
p::first-line {
  font-style: italic;
}

6.3 CSS3 新增伪元素选择器

6.3.1 ::selection

用于选择用户在网页上选中的文本内容,可以为其设置样式,如改变背景色和文本颜色。

css 复制代码
::selection {
  background-color: lightblue;
  color: white;
}

七、总结

CSS 选择器为我们提供了丰富多样的方式来选择和操作 HTML 元素,从基本的标签、类、ID 选择器,到复杂的组合选择器、属性选择器、伪类和伪元素选择器。特别是 CSS3 新增的选择器进一步增强了我们对网页元素的选择和样式控制能力,能够创建出更加丰富和细腻的网页视觉效果。在实际开发中,根据不同的需求灵活运用这些选择器,可以提高代码的效率和可维护性。同时,需要注意选择器的性能问题,尽量避免使用过于复杂或性能消耗大的选择器,以确保网页的加载速度和用户体验。

相关推荐
匹马夕阳7 分钟前
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
前端·javascript·vue.js
你熬夜了吗?8 分钟前
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
前端·vue.js·信息可视化
桂月二二6 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
hunter2062068 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb8 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角8 小时前
CSS 颜色
前端·css
九酒8 小时前
从UI稿到代码优化,看Trae AI 编辑器如何帮助开发者提效
前端·trae
浪浪山小白兔9 小时前
HTML5 新表单属性详解
前端·html·html5
lee5769 小时前
npm run dev 时直接打开Chrome浏览器
前端·chrome·npm
2401_897579659 小时前
AI赋能Flutter开发:ScriptEcho助你高效构建跨端应用
前端·人工智能·flutter