关于 pseudo-elements
审查 CSS 伪元素和 View Transitions API 的技能。它检查装饰层、原生伪元素样式及共享元素转场,并报告问题和汇总。
主要功能
- 01检查伪元素的生成内容
- 02审查装饰节点与伪元素层级
- 03检查原生背景、占位符和选区样式
- 04审查 View Transitions 命名与清理
- 05报告问题严重性并提供汇总
适用场景
- 01审查装饰性悬停层和点击区域
- 02检查对话框背景与输入占位符
- 03审计共享元素页面转场
- 04检查列表标记和首行样式
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ raphaelsalaja/ skills --skill pseudo-elements安装后在 Claude Code 中输入/pseudo-elements确认已加载。
附带文件agents/openai.yaml
详细介绍
伪元素
此技能会检查 CSS 伪元素和 View Transitions API。当图层仅用于装饰时,优先使用伪元素,而不是额外添加节点。
每项检查都由一对内容组成:有问题的代码行与替换它的代码行并列呈现。
必须设置 content: "",否则 ::before 和 ::after 不会渲染。这是明确要求。如果额外的 DOM 节点仅用于实现遮罩或扩大可点击区域,而伪元素也能实现,则应记录为问题。最小目标尺寸属于 laws-of-ux。通过伪元素实现阴影动画属于 visual-design。组件退出时的挂载属于 exit-animations。
使用时机
为悬停图层、点击区域、占位符、选中内容、对话框背景遮罩或共享元素页面切换设置样式时,请使用此技能。对于在原位挂载和卸载的 Motion 树,请使用 exit-animations。
1. 检查装饰图层
读取范围内的文件。列出 ::before、::after、::backdrop、::placeholder、::selection、::marker、::first-line,以及任何 view-transition-name 或 startViewTransition 调用。
2. 检查生成的盒子
::before 和 ::after 必须设置 content,通常为 ""。这属于 pseudo-content-required。装饰性遮罩、下划线和点击区域应使用伪元素,而不是空的 span。这属于 pseudo-over-dom-node。绝对定位的伪元素必须有一个 position: relative 的父元素。这属于 pseudo-position-relative-parent。如果伪元素覆盖了文本,应将文本置于其上方,通常为伪元素设置 z-index: -1。这属于 pseudo-z-index-layering。
通过在伪元素上设置负值内边距扩展点击区域,例如 inset: -8px -12px。这属于 pseudo-hit-target-expansion。32px 的最小目标尺寸属于 laws-of-ux。
使用 ::marker 设置列表标记的样式,而不是用伪造的项目符号元素。这属于 pseudo-marker-styling。使用 ::first-line 设置段落首行的样式。这属于 pseudo-first-line-styling。
3. 检查原生伪元素和视图过渡
dialog 或弹出框应使用 ::backdrop 使页面变暗,而不是使用同级的遮罩 div。这属于 native-backdrop-styling。占位符文本应使用 ::placeholder。这属于 native-placeholder-styling。选中内容的颜色应使用 ::selection。这属于 native-selection-styling。
需要在页面切换中变形的元素,应在唯一的参与元素上设置 view-transition-name。这属于 transition-name-required。过渡运行期间,该名称必须唯一。这属于 transition-name-unique。目标元素接管名称后,应从源元素上清除该名称。这属于 transition-name-cleanup。对于这种共享元素页面切换,应优先使用 document.startViewTransition,而不是 Motion 的 layoutId。这属于 transition-over-js-library。自定义时间设置应放在 ::view-transition-group 上,而不是只使用默认交叉淡入淡出效果。这属于 transition-style-pseudo-elements。
4. 报告并停止
先写出发现的问题,再写摘要。不要用伪元素替代语义元素。
配对
每项检查都是一对。问题代码行旁边就是替换它的代码行。
| 规则 | 问题代码 | 替换代码 |
|---|---|---|
pseudo-content-required | .button::before { position: absolute } | 添加 content: "" |
pseudo-over-dom-node | 按钮内的 <span className={styles.background} /> | 用于该背景效果的 .button::before |
pseudo-position-relative-parent | 静态父元素上的绝对定位 ::before | .button { position: relative } |
pseudo-z-index-layering | 标签上方没有 z-index 的 ::before 背景效果 | 在伪元素上设置 z-index: -1 |
pseudo-hit-target-expansion | 与字形大小相同的点击区域 | 在 ::before 上设置 inset: -8px -12px |
pseudo-marker-styling | 模拟项目符号的元素 | li::marker |
pseudo-first-line-styling | 用于换行首行的 span | p::first-line |
native-backdrop-styling | <dialog> 后方的同级覆盖层 | dialog::backdrop |
native-placeholder-styling | 输入框为空时显示的占位 <span> | input::placeholder |
native-selection-styling | 在包装元素上设置的选中颜色 | ::selection |
transition-name-unique | 每张卡片上都有 .card { view-transition-name: card } | 在活动元素上设置唯一名称 |
transition-name-cleanup | 交换后源元素仍保留 viewTransitionName | 在回调中清除它 |
transition-over-js-library | 用于跨页面共享元素的 layoutId | document.startViewTransition |
报告
严重程度。 HIGH 表示伪元素因缺少 content 而无法渲染,或视图过渡名称发生冲突。MEDIUM 表示多余的装饰性节点、背景 div、未清除的名称,或未扩展的点击区域。LOW 表示未设置样式的 ::selection 或 ::marker,而 UI 的其余部分已设置样式。
验证。 阅读范围内文件中声明的值。浏览器验证可选。将无法运行的检查标记为 Not verified。
格式。 每个根本原因列出一项发现:
file:line - [rule-id] what is wrong
然后给出摘要:
| 规则 | 数量 | 严重程度 |
|---|
只要仍有任何 HIGH,就执行 Block。否则执行 Approve,并将较低严重程度的行保留在表格中。不得对未阅读的文件执行 Approve。如果没有需要报告的内容,请写明“No actionable findings”,并列出未验证的项目。