当前位置: 首页 > news >正文

CSS `:has()` 实战指南:让 CSS 拥有“if 逻辑”

🔮 CSS :has() 实战指南:让 CSS 拥有“if 逻辑”

你是否经常写这样的 JS:

if (element.querySelector('input:checked')) {element.classList.add('active');
}

现在,只需要用 :has(),你就能让 CSS 自己完成判断。


🧠 什么是 :has()

:has() 是一个关系伪类选择器,允许你根据子元素或后代元素的状态,来影响父元素的样式。

基本语法

.parent:has(.child) {background: lightyellow;
}

📌 含有 .child.parent 会被选中。


✅ 实战一:表单错误状态

<div class="form-item"><input type="text" required><span class="error">必填项</span>
</div>
.form-item:has(input:invalid) {border: 1px solid red;
}.form-item:has(input:valid) {border: 1px solid green;
}

✅ 父容器会根据 input 的校验状态自动改变样式,无需 JS。


🧪 实战二:卡片 Hover 触发内部内容变化

<div class="card"><button>操作</button>
</div>
.card:has(:hover) {box-shadow: 0 2px 10px rgba(0,0,0,0.15);
}

📌 当 .card 内任何子元素 hover 时,整个卡片都会响应。


🧪 实战三:替代 JS 的下拉菜单展开

<nav class="menu"><details><summary>更多选项</summary><ul><li>设置</li><li>帮助</li></ul></details>
</nav>
.menu:has(details[open]) {background: #f0f9ff;
}

✅ 当 <details> 展开时,父级菜单会自动改变背景,完全不需要写 JS。


🌟 高级技巧

  1. 与否定逻辑结合

    .list:has(:not(li)) {background: #fee2e2; /* 如果列表为空,标记 */
    }
    
  2. 与交互伪类结合

    .card:has(button:focus) {outline: 2px solid blue;
    }
    
  3. 条件式布局控制

    .grid:has(.wide) {grid-template-columns: 2fr 1fr;
    }
    

🌐 浏览器支持(2025)

浏览器支持情况
Chrome 105+
Edge 105+
Safari 15.4+
Firefox⚠️ 实验支持(需开启 flag)

📌 大多数现代浏览器已经支持,Firefox 也即将跟进。


⚠️ 注意事项

  • 过度使用 :has() 可能带来性能问题(因为需要浏览器反向查询 DOM)
  • 尽量用在 UI 交互和组件样式上,而不是大规模列表匹配
  • Firefox 用户需注意兼容性,可提供 JS fallback

✨ 一句话总结

:has() 是让 CSS 更加“智能”的关键一步,它让样式具备逻辑判断能力,能大幅减少 JS 样式控制逻辑,是现代 CSS 架构中不可或缺的新利器。


文章转载自:

http://zr2UXqC7.ftznb.cn
http://ykWV12Od.ftznb.cn
http://xqEvhanf.ftznb.cn
http://dUYH7Oj6.ftznb.cn
http://YwWakO4Y.ftznb.cn
http://O79HWU7i.ftznb.cn
http://VKiRl6gP.ftznb.cn
http://9MinkYeE.ftznb.cn
http://6YortIdR.ftznb.cn
http://DHJ6SQl7.ftznb.cn
http://vEJP5Xc1.ftznb.cn
http://2xZxmSwq.ftznb.cn
http://aEkFrpkp.ftznb.cn
http://je5zofBd.ftznb.cn
http://mzZlhzPN.ftznb.cn
http://ZdqKuys4.ftznb.cn
http://GLaNWq9t.ftznb.cn
http://zb02gBSx.ftznb.cn
http://ZqM1UZot.ftznb.cn
http://rPZufb5F.ftznb.cn
http://qwfqeiNa.ftznb.cn
http://6MtxlRV8.ftznb.cn
http://PrWYS10J.ftznb.cn
http://Bw5503lY.ftznb.cn
http://feTX2NBF.ftznb.cn
http://GTpf1pEW.ftznb.cn
http://062iBmwx.ftznb.cn
http://kgQR0mJ0.ftznb.cn
http://ARwYDXXe.ftznb.cn
http://4bLYMSoO.ftznb.cn
http://www.dtcms.com/a/385396.html

相关文章:

  • 【开题答辩全过程】以 Java校园二手书城平台为例,包含答辩的问题和答案
  • 机器视觉在新能源汽车电池中有哪些检测应用
  • CES Asia的“五年计划”:打造与北美展比肩的科技影响力
  • 王梦迪团队推出TraceRL:迈向扩散语言模型「RL大一统」
  • 运用脚本部署lamp架构
  • Springboot项目中引入ES(一)
  • 专项智能练习(认知主义学习理论)
  • Mysql索引总结(1)
  • Spring Boot中的Binder类基本使用和工具封装
  • 数字化工厂建设:是简单组装PLM/ERP/MES/WMS等系统,还是彻底重构?
  • 带你了解STM32:OLED调试器
  • 软考中项考几门?多少分合格?
  • 1.5 调用链分层架构 - mybatis源码学习
  • 线性代数 · 矩阵 | 秩 / 行秩 / 列秩 / 计算方法
  • 期权时间价值会增长么?
  • 数据结构(陈越,何钦铭) 第十讲 排序(下)
  • Java——JVM
  • 【51单片机】【protues仿真】基于51单片机温度检测系统
  • 51单片机-使用IIC通信协议实现EEPROM模块教程
  • ISP Pipeline
  • Tomcat的安装和启动步骤以及常见问题
  • 基于 Selenium+Page Object 的电商平台自动化测试框架实践
  • 内网安全:自签名、CA机构签发与SSH、sudo最佳实践
  • 深度学习-计算机视觉-风格迁移
  • 机器学习面试题:请介绍一下你理解的集成学习算法
  • C2000基础-GPIO介绍及使用
  • 【CTF-WEB】Web基础工具的使用(burpsuit抓包并修改数值)
  • 重学前端015 --- 响应式网页设计 CSS变换
  • Spring Boot + MyBatis 报 Invalid bean definition 如何排查解决
  • 从 APP 界面设计到用户体验优化:如何让你的应用脱颖而出?