首页
开发技巧正文内容

5 个高级 CSS 选择器及其用法

2024年09月26日
阅读时长 5 分钟
阅读量 5
5 个高级 CSS 选择器及其用法

你是否仍然依赖像 .class#idelement 这样的基本选择器?那么,你知道吗?CSS 中有一些超级强大的高级选择器,可以真正提升你的样式设计水平。这些高级选择器让你以前从未想过的方式来定位元素,帮助你编写更干净、更高效的代码。

在本文中,我们将探讨5个高级 CSS 选择器,这些选择器你可能还没有使用过,但绝对应该使用!此外,我们将深入探讨每个选择器可以节省您时间的实际用例和常见场景。

1. :nth-child() 选择器 🔢

我们都知道如何定位特定类或 ID,但如果你想根据它们在父元素中的位置来定位元素呢?这时就需要用到**:nth-child() 选择器**。这个选择器非常灵活,允许你根据元素在父元素中的顺序来选择元素。

工作原理:

:nth-child() 选择器接受一个公式(如 2n3n+1 等)来定位特定元素。以下是一个简要说明:

  • 2n 定位每个偶数子元素。

  • 2n+1 定位每个奇数子元素。

  • 3n 定位每第三个子元素。

基本示例:

/* 选择每第二个项目 */
li:nth-child(2n) {
  color: blue;
}
<ul>
  <li>项目 1</li>
  <li>项目 2</li> <!-- 这将是蓝色的 -->
  <li>项目 3</li>
  <li>项目 4</li> <!-- 这将是蓝色的 -->
</ul>

更多高级用例:

你可以使用 :nth-child() 来定位更复杂的模式。例如,在表格中交替设置行颜色:

/* 斑马纹表格行 */
tr:nth-child(odd) {
  background-color: #f2f2f2;
}

或者,定位每第三个列表项但跳过第一个:

li:nth-child(3n+1) {
  background-color: lightcoral;
}

常见错误:

不要混淆 :nth-child():nth-of-type()。后者仅适用于特定类型的元素(如 pdiv),而 :nth-child() 适用于任何元素,无论类型如何。

2. :not() 选择器 ❌

:not() 选择器允许你排除样式规则中的元素,这可以通过消除对特定情况下样式的覆盖来简化你的 CSS。这在你想要广泛应用样式但需要排除某些元素的情况下特别有用。

基本示例:

/* 样式所有段落,除了具有类“no-style”的段落 */
p:not(.no-style) {
  color: green;
}
<p>已设置样式的段落</p> <!-- 这将是绿色的 -->
<p class="no-style">未设置样式</p> <!-- 这将不受影响 -->

高级用例:

假设你有一个带有多个项目的导航菜单,但你不想将“主页”链接与其他链接样式相同。你可以使用 :not() 来排除它:

/* 样式所有菜单项,除了“主页”链接 */
.nav-item:not(.home) {
  font-weight: bold;
}
<ul>
  <li class="nav-item home">主页</li>
  <li class="nav-item">关于</li>
  <li class="nav-item">联系</li>
</ul>

高级提示:

你可以将 :not() 与其他选择器结合使用,创建高度特定的规则。例如,排除某些 nth-child 元素:

/* 样式每第二个列表项,但排除具有“special”类的项 */
li:nth-child(2n):not(.special) {
  background-color: yellow;
}

3. ~(通用兄弟)选择器 👨‍👧

通用兄弟选择器(~允许你定位跟随特定元素的所有兄弟元素。当你想根据它们的兄弟关系应用样式于元素时,这将非常方便。

工作原理:

通用兄弟选择器将选择指定元素之后的所有兄弟元素,但它们不需要紧邻。

示例:

/* 样式所有跟随 h2 元素的段落 */
h2 ~ p {
  margin-left: 20px;
}
<h2>标题</h2>
<p>这个段落将缩进。</p>
<p>这个也是!</p>
<h2>另一个标题</h2>
<p>这个不会缩进,因为它跟随不同的标题。</p>

高级用例:

想象一下,你有一个 FAQ 部分,你希望样式化每个问题后面的所有答案而无需将它们包装在额外的容器中:

/* 样式所有问题后面的 div */
.question ~ .answer {
  font-style: italic;
}
<div class="question">CSS Grid 是什么?</div>
<div class="answer">CSS Grid 是一种布局系统...</div>
<div class="answer">你可以轻松创建复杂的布局。</div>

4. ^=(以...开头)选择器 🎯

^= 选择器允许你定位属性以特定值开头的元素。当处理动态类名、数据属性或其他共享相同前缀的属性时,这将非常有用。

基本示例:

/* 定位类以“btn-”开头的元素 */
[class^="btn-"] {
  padding: 10px;
  border-radius: 5px;
}
<button class="btn-primary">主要按钮</button> <!-- 已设置样式 -->
<button class="btn-secondary">次要按钮</button> <!-- 已设置样式 -->

高级用例:

你可以将 ^= 选择器与其他伪类结合使用以进行更复杂的选择。例如,样式所有以 data-product 开头的 data-* 属性,并仅定位第一个:

/* 定位第一个以“data-product”开头的数据属性元素 */
[data-product^="product"]:first-child {
  background-color: lightblue;
}

用于 SEO 和可访问性的用例:

当处理数据属性时,此选择器也非常有用。如果你正在动态生成元素(例如产品、用户等),^= 选择器可以帮助你在多个组件之间创建一致的样式。

5. ::before::after 伪元素 🪄

这些伪元素允许你通过 CSS 在元素之前或之后插入内容。它们非常适用于添加装饰元素、图标,甚至功能性内容,而无需修改你的 HTML。

基本示例:

/* 在每个 h2 元素之前添加火焰表情 */
h2::before {
  content: "🔥  ";
  color: red;
}
<h2>热门话题</h2> <!-- 输出:"🔥  热门话题" -->

高级用例:

  1. 创建分隔符:你可以使用 ::before::after 在内容之间添加分隔符而不更改 HTML 结构。
h2::after {
  content: "";
  display: block;
  height: 2px;
  background-color: #000;
  margin-top: 10px;
}
  1. 创建类似工具提示的效果:你可以使用伪元素在悬停在元素上时创建类似工具提示的效果:
.button::after {
  content: "点击我!";
  display: none;
  position: absolute;
  background-color: yellow;
  padding: 5px;
  border-radius: 3px;
}
​
.button:hover::after {
  display: block;
}

常见错误:

请记住,::before::after 不适用于自闭合元素,如 <img><input>。它们需要包含子元素的内容,例如 <div><p><h1>

奖励部分:结合选择器发挥最大威力 💪

CSS 最棒的地方之一是可以结合选择器创建超级具体的规则。以下是一些示例:

示例 1:定位每第三个子元素,但排除特殊项

/* 选择每第三个列表项,但排除具有“special”类的项 */
li:nth-child(3n):not(.special) {
  background-color: yellow;
}

示例 2:基于属性和兄弟关系进行样式设置

/* 选择所有跟随具有以“product-”开头的数据属性的 div 的兄弟 div */
div[data-product^="product-"] ~ div {
  border: 1px solid #ccc;
}

这些组合使你可以更精细地控制你的样式,使得创建动态、响应式设计变得更容易,而无需臃肿的 CSS 或额外的类。

结论 🎉

这些5个高级 CSS 选择器(加上一个奖励组合技巧!)将极大地改善你编写样式表的方式。无论你是在开发大型应用程序还是小型落地页,掌握这些选择器将为你提供灵活性和控制,让你以前未曾想象的方式定位元素。

免责声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

相关文章

探索多种软件架构模式及其实用应用
2024年11月22日19:06
本文深入探讨了多种软件架构模式,包括有界上下文、边车模式、发布-订阅模式、应用网关、微服务、命令职责分离(CQRS)等,介绍了它们的优点、使用场景以及具体应用实例。文章强调根据具体项目需求和团队能力选择最合适的架构,以构建高效和可维护的解决方案,同时展示了各架构模式间的综合应用,提供了丰富的案例和技术细节。
15个高级Python快捷键助您更快编程
2024年11月21日07:02
本文分享了 15 个高级的 Python 编程快捷键,包括上下文管理器、行内字典合并、函数参数解包、链式比较、dataclasses、海象运算符、反转列表、备忘录缓存、splitlines、enumerate、字典推导、zip 用于并行迭代、itertools.chain 扁平化列表、functools.partial 部分函数和 os.path 文件路径管理等,帮助开发者提高编程效率和代码简洁性。
揭示网页开发的 11 个迷思:停止相信这些误区
2024年11月19日22:05
网页开发充满误解,这篇博文针对11个常见迷思进行揭秘。包括网站开发后不需更新、需掌握所有技术、AI会取代开发者等。强调持续学习、专业化、用户体验的重要性,澄清误区如多任务处理的必要性和最新技术的必需性。文章提醒开发者注重实用而非追求完美代码,以务实态度面对开发工作。
你知道 CSS 的四种 Focus 样式吗?
2024年11月18日21:41
本文介绍了四种 CSS focus 样式::focus、:focus-visible、:focus-within 以及自定义的 :focus-visible-within,帮助提升网站用户体验。:focus 样式应用于被选中元素;:focus-visible 仅在键盘导航时显示;:focus-within 用于父元素;自定义 :focus-visible-within 结合两者效果。合理运用这些样式能使网站更方便键盘用户导航。
利用 Python 实现自动化图像裁剪:简单高效的工作流程
2024年11月11日20:49
使用 Python 和 OpenCV 自动裁剪图像,轻松实现 16:9 的完美构图。这个指南介绍了如何通过代码进行灰度化、模糊处理和边缘检测,最终识别出最重要的部分进行裁剪。特别适合需要批量处理图像的情况,节省大量时间。
每位资深前端开发人员都应了解的 TypeScript 高级概念
2024年11月11日02:07
资深前端开发者应了解 TypeScript 的高级概念,如联合类型、交叉类型、类型保护、条件类型、映射类型、模板字面量类型和递归类型。这些特性可提升代码的可维护性和可扩展性,确保在开发复杂应用时实现更高的类型安全性和效率。