Front-End-Checklist 的 :has() 技能指南:用 CSS 关系伪类替换 JavaScript 类切换
Front-End-Checklist 的 :has() 技能指南用 CSS 关系伪类替换 JavaScript 类切换【免费下载链接】Front-End-Checklist The essential checklist for modern web development, for humans and AI agents项目地址: https://gitcode.com/gh_mirrors/fr/Front-End-Checklist本文以 Front-End-Checklist 仓库中的has-selector技能文档为主体结合其配套的规则源文件与工具链实现系统讲解 CSS:has()关系伪类的原理、实战场景与性能边界并给出可直接复制使用的代码示例与验证方法。读完你将掌握用一条 CSS 规则替代根据子元素状态切换父元素类名的 JavaScript 逻辑并能在不同浏览器环境中安全落地。一、技能文档定位从规则到可执行技能Front-End-Checklist 将前端质量检查清单沉淀为结构化内容每一条规则rule存放在 packages/content/rules/en/css/has-selector.mdx而 skills/has-selector/SKILL.md 则是把该规则包装成可供人类开发者与 AI Agent 直接使用的技能文件。SKILL.md 的 front matter 明确定义了本技能的作用边界元数据字段值含义namehas-selector技能唯一标识categorycss归属于 CSS 类目prioritylow优先级较低属于锦上添花型优化difficultyintermediate适合有 CSS 选择器基础的中级开发者estimatedTime20预计耗时 20 分钟sourcefrontendchecklist.io规则源自前端清单站点其description字段给出技能的触发条件在审查样式表或组件时如果发现它们用 JavaScript 根据子元素状态、表单输入值或内容存在性来切换父元素类名——:has()可能完全替代这段 JavaScript。技能正文定义了四个可执行工作流与 MDX 源文件中的prompts字段一一对应见 packages/content/rules/en/css/has-selector.mdxCheck检查在代码中寻找JavaScript 根据子元素状态或内容切换父元素类名的模式Fix修复用 CSS:has()选择器替换 JavaScript 类切换逻辑并给出命中父元素的等价选择器Explain解释说明:has()的工作原理、与:is()、:not()的区别、选择器内子/后代组合子的语义以及当前浏览器支持状况Code Review代码审查审查样式表与组件 JavaScript标记所有父元素样式由 JS 类切换控制的位置并给出对应的:has()规则。二、核心概念什么是 :has() 关系伪类:has()是 CSS Selectors Level 4 引入的关系伪类relational pseudo-class它接收一个选择器列表作为参数只要参数匹配的元素是当前元素的后代或相关元素当前元素就会被选中。换句话说它让根据内容选择容器成为可能。/* 选择包含 img 元素的 .card */ .card:has(img) { display: grid; grid-template-columns: 200px 1fr; } /* 选择后面紧跟 ul 的 p相邻兄弟 */ p:has( ul) { margin-bottom: 0.25rem; } /* 选择包含聚焦元素的 section */ section:has(:focus-visible) { outline: 2px solid var(--color-focus); }与 :is() / :not() 的区别:is()用于把多个选择器合并、统一它们的选择器优先级它匹配的是元素自身是否符合参数中的任一选择器:not()匹配自身不满足参数条件的元素同样是作用于元素自身:has()匹配的是容器——判断的是参数条件是否在容器内部或与其相关的元素上成立。它不改变被选元素的优先级优先级即参数中最具体选择器的优先级但语义上是向上/向外的选择能力。一句话概括:is()和:not()横向扩展匹配条件:has()纵向建立父子关系这正是它被称为CSS 等了数十年的父选择器的原因。为什么重要在:has()出现之前根据子元素状态改变父元素样式必须依赖 JavaScript监听状态变化、切换类名、保持 DOM 与样式同步。这造成了两层耦合样式逻辑与应用逻辑耦合——样式状态散落在脚本里DOM 与 CSS 状态同步问题——漏切换类名就会产生样式不一致。:has()把这种关系放回 CSS 本身减少 JavaScript 复杂度、消除类切换样板代码让样式意图直接在样式表中可读。这也是 packages/content/rules/en/css/has-selector.mdx 中whyItMatters字段的核心论点。三、实战场景一基于输入状态的表单样式表单是最典型的:has()落地场景——输入框的校验状态:valid/:invalid由浏览器原生维护无需任何 JavaScript 监听。/* 输入框无效且非空时整个表单组进入错误态 */ .form-group:has(input:invalid:not(:placeholder-shown)) { --border-color: var(--color-error); } .form-group:has(input:invalid:not(:placeholder-shown)) .form-label { color: var(--color-error); } .form-group:has(input:invalid:not(:placeholder-shown)) .form-error { display: block; /* 显示错误信息 */ } /* 字段集内所有必填输入均有效时呈现成功态 */ fieldset:has(input[required]:valid):not(:has(input[required]:invalid)) { border-color: var(--color-success); } /* 复选框驱动的区块显隐——零 JavaScript */ .settings-panel:has(input[typecheckbox]:checked) .settings-detail { display: block; }其中fieldset:has(input[required]:valid):not(:has(input[required]:invalid))演示了:has()与:not()的嵌套组合全部有效用:has(...:valid)表达且无一无效用:not(:has(...:invalid))排除。这类写法将校验状态完全收敛到 CSS配合:placeholder-shown还能避免空输入过早触发错误态。四、实战场景二基于内容存在性的卡片布局内容是否包含某类元素图片、徽章、图表在传统方案中需要渲染时在 JS 里判断并输出不同类名:has()让布局直接对内容结构做出响应。/* 无图卡片与有图卡片采用不同的网格模板 */ .card:has(img) { grid-template-areas: image content footer; } .card:not(:has(img)) { grid-template-areas: content footer; } /* 带徽章的卡片增加顶部内边距 */ .card:has(.badge) { padding-top: 2.5rem; } /* 含 figure 的文章采用双栏布局 */ .article:has(figure) { display: grid; grid-template-columns: 1fr 280px; gap: 2rem; }:has(img)与:not(:has(img))成对使用等于在 CSS 里实现了if 元素含图片 / else的分支逻辑且内容增删时样式自动跟随无需重新运行脚本。五、实战场景三导航高亮的无 JS 实现导航当前页高亮通常依赖后端渲染或前端脚本往链接上打aria-current或active类。:has()可以直接基于aria-current属性它本身也是无障碍标准属性驱动整条导航项的状态/* 高亮链接指向当前页的导航项 */ .nav-item:has(a[aria-currentpage]) { background: var(--color-nav-active-bg); border-radius: 0.375rem; } .nav-item:has(a[aria-currentpage]) a { color: var(--color-nav-active-text); font-weight: 600; } /* 含当前页链接的导航分组自动展开 */ .nav-section:has(a[aria-currentpage]) .nav-section-list { display: block; }六、实战场景四主题切换不写一行 JS一个经典用例用select或input控制整页主题。以往需要脚本监听变更并给html加dark类现在一个 radio 的状态即可完成/* 页面主题由 radio 驱动——无需 JS */ html:has(#theme-dark:checked) { color-scheme: dark; --bg: #0f172a; --fg: #f1f5f9; } html:has(#theme-light:checked) { color-scheme: light; --bg: #ffffff; --fg: #0f172a; }这一模式在规则源文件中被标注为与 packages/content/rules/en/css/dark-mode-css 规则强相关relatedRules字段:has()作用于html/body元素驱动主题切换正对应仓库中 dark-mode-css 规则的审查方向同时--bg/--fg自定义属性的使用也让该示例天然衔接 css-custom-properties 规则中用自定义属性在级联中传递状态的思想。七、:has() 内的关系组合子与性能边界:has()参数接受完整的选择器语法包括各类组合子因此它不止能做后代存在判断/* 直接子元素 */ .parent:has( .direct-child) { … } /* 相邻兄弟该元素之后还有兄弟元素 */ h2:has( p) { margin-bottom: 0.5rem; } /* 后续兄弟 */ .alert:has(~ .alert) { /* 该元素之后还有另一个 alert */ } /* 属性选择器 */ figure:has(figcaption[hidden]) { /* 图注处于隐藏状态 */ }⚠️ 性能警示热重排路径:has()配合复杂后代选择器时若浏览器在频繁重排滚动、缩放、动画中需要反复计算样式代价可能很高。应避免在频繁重绘的元素上使用深层嵌套或过于宽泛的:has()选择器优先把:has()限定在具体子树内如.card:has(img)而不是根级通配符或纯标签选择器。这条警示直接来自规则源文件中的Warning组件packages/content/rules/en/css/has-selector.mdx是技能文档明确要求 Code Review 阶段重点核对的项目之一。八、浏览器支持与回退策略:has()于2023 年底达成 Baseline 支持主流浏览器全部可用Chrome / Edge 105Firefox 121Safari 15.4对于需要兼容旧环境的场景规则文档推荐用supports selector(:has(*))提供回退——注意必须用selector()函数包住选择器本身因为仅检查属性支持无法判断选择器语法是否可用/* 基础样式对所有人生效 */ .card { display: block; } /* 仅在 :has() 可用时启用增强布局 */ supports selector(:has(*)) { .card:has(img) { display: grid; grid-template-columns: 200px 1fr; } }仓库在工具链层面也印证了兼容性关注脚本 scripts/lib/rule-support-data.ts 将has-selector规则映射到 MDN 浏览器兼容性数据BCD特性css.selectors.has并借助mdn/browser-compat-data、baseline-browser-mapping与browserslist计算该规则在各目标浏览器中的支持情况与 Baseline 最低版本——这意味着规则的浏览器支持信息是由兼容性数据驱动、随数据源更新的而非硬编码结论。九、验证清单如何确认 :has() 落地正确规则文档给出了一套可操作的验证步骤packages/content/rules/en/css/has-selector.mdx打开浏览器 DevTools检查命中:has()规则的元素确认规则出现在 Styles 面板且在匹配后代存在时确实生效移除匹配的后代确认样式不再应用——验证选择器对 DOM 变化是动态响应的查询兼容性表或用supports selector(:has(*))确认目标用户环境可用或已放置回退若:has()作用于频繁更新的元素用 DevTools Performance 面板剖析页面确认没有过度的样式重算时间。十、仓库实践佐证项目自身的 :has() 应用值得注意的是本仓库的 Web 应用在自己的样式里已经实践了这一模式。在 apps/web/app/globals.css 中可以找到多个真实用例基于[data-rehype-pretty-code-figure]:has(pre)/:not(:has(pre))第 768、774 行对代码块渲染容器做差异化布局使用.prose ul.contains-task-list li:has( input[typecheckbox]:checked)::before/::after第 1526、1531 行为已勾选任务项绘制对勾标记——用:has()检查直接子输入框的checked状态。这些选择器与技能文档中的模式一一对应说明:has()不是理论示例而是已被本项目生产代码采用、可被直接审阅的实践证据可作为技能落地时查看真实可运行的实现的参考样本。参考资源技能文件skills/has-selector/SKILL.md规则详细文档packages/content/rules/en/css/has-selector.mdx规则支持性工具链映射scripts/lib/rule-support-data.ts项目生产代码中的 :has() 示例apps/web/app/globals.css【免费下载链接】Front-End-Checklist The essential checklist for modern web development, for humans and AI agents项目地址: https://gitcode.com/gh_mirrors/fr/Front-End-Checklist创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PixiJS 渲染系统完全指南:WebGL / WebGPU / Canvas 三种渲染器的选型、配置与实战

PixiJS 渲染系统完全指南:WebGL / WebGPU / Canvas 三种渲染器的选型、配置与实战

PixiJS 渲染系统完全指南:WebGL / WebGPU / Canvas 三种渲染器的选型、配置与实战 【免费下载链接】pixijs The HTML5 Creation Engine: Create beautiful digital content with the fastest, most flexible 2D WebGL renderer. 项目地址: https://gitcode.com/gh…

2026/9/19 21:51:49 阅读更多 →
DataHub 配置属性安全分类机制:PropertiesCollector 与系统信息端点防泄露实战

DataHub 配置属性安全分类机制:PropertiesCollector 与系统信息端点防泄露实战

数据目录数据治理数据血缘后端前端数据工程数据集成 【免费下载链接】datahub The Context Platform for your Data and AI Stack 项目地址: https://gitcode.com/GitHub_Trending/da/datahub 点击查看 免费下载 导读 DataHub 的 metadata-io 模块提供了系统信息&…

2026/9/19 21:51:49 阅读更多 →
terraform-provider-aws 数据源 aws_lb_hosted_zone_id 完全指南:为 Route 53 别名记录动态获取 ELB Hosted Zone ID

terraform-provider-aws 数据源 aws_lb_hosted_zone_id 完全指南:为 Route 53 别名记录动态获取 ELB Hosted Zone ID

terraform-provider-aws 数据源 aws_lb_hosted_zone_id 完全指南:为 Route 53 别名记录动态获取 ELB Hosted Zone ID 【免费下载链接】terraform-provider-aws The AWS Provider enables Terraform to manage AWS resources. 项目地址: https://gitcode.com/GitHu…

2026/9/19 21:51:49 阅读更多 →

最新新闻

ESP32 USB Host 方案全解析:Camera/Audio/4G 网络/存储/Hub 五大应用实战指南

ESP32 USB Host 方案全解析:Camera/Audio/4G 网络/存储/Hub 五大应用实战指南

ESP32 USB Host 方案全解析:Camera/Audio/4G 网络/存储/Hub 五大应用实战指南 【免费下载链接】esp-iot-solution Espressif IoT Library. IoT Device Drivers, Documentations and Solutions. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solutio…

2026/9/19 22:39:12 阅读更多 →
正则化完全指南:从L1/L2本质到软阈值推导与调参实战

正则化完全指南:从L1/L2本质到软阈值推导与调参实战

训练集上loss一路狂掉到0.8个点,测试集上一跑直接崩回两位数的场景,我见过太多次了。每次有学生发消息问我“模型是不是过拟合了”,我都会先反问一句:“你上正则化了吗?”正则化(Regularization&#xff09…

2026/9/19 22:39:12 阅读更多 →
VFP9 默认字体 Arial 改宋体:这次让 Codex 走 TaoToken 改 VFP9CHS.DLL

VFP9 默认字体 Arial 改宋体:这次让 Codex 走 TaoToken 改 VFP9CHS.DLL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 22:39:12 阅读更多 →
react-spring 仓库实践:Spec Kit speckit-git-initialize 技能的 Git 仓库初始化与首次提交流程解析

react-spring 仓库实践:Spec Kit speckit-git-initialize 技能的 Git 仓库初始化与首次提交流程解析

react-spring 仓库实践:Spec Kit speckit-git-initialize 技能的 Git 仓库初始化与首次提交流程解析 【免费下载链接】react-spring ✌️ A spring physics based React animation library 项目地址: https://gitcode.com/gh_mirrors/re/react-spring 本篇技…

2026/9/19 22:39:12 阅读更多 →
MMDetection 标准数据集模型推理实战指南:Inferencer 高层接口、演示脚本与多模态推理全解析

MMDetection 标准数据集模型推理实战指南:Inferencer 高层接口、演示脚本与多模态推理全解析

人工智能计算机视觉深度学习模型评测 【免费下载链接】mmdetection OpenMMLab Detection Toolbox and Benchmark 项目地址: https://gitcode.com/gh_mirrors/mm/mmdetection 点击查看 免费下载 MMDetection 提供了大量预训练检测模型,推理(I…

2026/9/19 22:39:12 阅读更多 →
应变片压力传感器原理及现场应用要点

应变片压力传感器原理及现场应用要点

简介:围绕应变片压力传感器原理及应用,文档系统介绍了电阻应变片、瓷压力传感器、扩散硅压力传感器和蓝宝石压力传感器等常见类型。内容先以金属丝应变电阻的阻值变化公式入手,解释电阻应变效应,再结合应变电桥与信号放大流程&…

2026/9/19 22:38:12 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →