前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >:has 语法,终于可以用了

:has 语法,终于可以用了

作者头像
ssh_晨曦时梦见兮
发布2023-10-14 08:18:14
2120
发布2023-10-14 08:18:14
举报
文章被收录于专栏:前端从进阶到入院

多年来,CSS 开发者一直希望能够根据元素内容来选择元素。虽然 CSS 提供了许多基于特征选择元素的选择器,但直到最近才有了根据元素内容选择元素的方法。

幸运的是,:has() 的引入改变了这一点。这个新功能是一个“颠覆者”,因为它允许你根据元素内容选择元素。

在本文中,我们将深入探讨其中一个最受期待的 CSS 特性::has 伪类。事实证明,它远不仅仅是一个“父选择器”。

语法

:has 伪类用于根据元素内容选择元素。它应用于我们想应用规则的元素上,并将其传递给应该包含的元素的选择器:

代码语言:javascript
复制
/* 这里我们选择任何包含 `h1` 的具有 `post` 类的元素 */
.post:has(h1) {
  background-color: teal;
}

使用 :has 作为父选择器

:has 作为父选择器可以简化许多情况。以下是一些可能的示例:

  • 在应用的某些页面上,你可能想要更改 body 元素的全局字体大小或背景颜色。在引入 :has 伪类之前,我们通常需要通过后端根据页面类型切换某些 HTML 类。然而,通过父选择器,现在可以轻松实现:
代码语言:javascript
复制
body:has(.container.legal-mentions) {
  font-size: 80%;
}
  • 在博客文章列表中,如果文章包含图片,我们希望这些文章的边距发生变化:
代码语言:javascript
复制
.post:has(img) {
  margin-left: 0;
}

这本身就非常强大,但是在使用 组合器 时,我们可以做得更多。

进一步使用组合器

组合器以一种使它们彼此和文档中内容位置之间关系更有用的方式组合其他选择器。 —— MDN

我们可以在 has 中使用 子代组合器 >,以确保我们选择的是直接子元素。例如,要选择具有 hr 元素作为直接子元素的 div 元素,可以使用选择器 div:has(>hr)

我们可以使用 相邻兄弟组合器 + 来选择紧跟在另一个元素后面的元素。例如,要选择一个标题后面跟着一个副标题,可以使用 title:has(+.subtitle)

与其他伪类组合

当在子元素上悬停时,改变容器的样式听起来相当酷,不是吗?

我们可以将 hashover 结合使用来实现这一点。例如,如果我们希望在容器中的任何链接悬停时,都给链接元素添加边框,可以使用以下代码:

代码语言:javascript
复制
.container:has(a:hover) {
  border: 2px solid pink;
}

浏览器支持

截至 2023 年 6 月,:has 伪类仅在 Firefox 中缺失。然而,它在一个标志后面,所以很快应该会被支持!

caniuse 中 has 功能的屏幕截图
caniuse 中 has 功能的屏幕截图

结论

:has 伪类是 CSS 选择器工具中的一个强大补充。它允许你根据元素内容选择元素,从而简化了许多情况,使你的代码更易于维护。通过使用组合器,你可以进一步细化选择并实现更高级的效果。

尽管在 Firefox 中仍然缺失,但预计它很快会得到支持。在发布到生产环境之前,请务必在所有主要浏览器中测试你的代码。

感谢阅读,祝愉快编码!

学习如何使用组合器和其他伪类实现更高级的效果。

来源和链接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语法
  • 使用 :has 作为父选择器
  • 进一步使用组合器
  • 与其他伪类组合
  • 浏览器支持
  • 结论
    • 来源和链接
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档