pseudo-elements

raphaelsalaja/skill · Agent Skill

進行CSS偽元素和View Transitions的使用審核,以達成hover效果、裝飾層和過渡效果。

前往安裝 ↓

總覽

發布者raphaelsalaja社群
儲存庫raphaelsalaja/skill ↗
技能資料夾pseudo-elements
星42
分支5
附帶檔案1
授權MIT
最近更新2026年3月17日
連結技能原始碼 ↗ · 儲存庫 ↗

Mozgi 檢查

我們在技能檔案中發現的內容。詳細資訊需訂閱。

安全性
低風險 · 未發現明顯風險 — 完整報告會顯示細節
相容性
僅含說明 — 適用於多數代理
相似技能
找到 58 個相似技能
訂閱另含

安裝

技能就是一個含 SKILL.md 的資料夾。選擇你的代理,在專案根目錄的終端機(macOS、Linux 或 Windows 的 Git Bash)執行指令。

把提示貼到 Claude、Codex 或其他助理:它會自行檢查並安裝技能。

Install the “pseudo-elements” skill from mozgi.io (https://mozgi.io/skills/raphaelsalaja-pseudo-elements/) for me.

1. Download the archive: https://mozgi.io/skills/raphaelsalaja-pseudo-elements/download
   If it fails, take the skill folder from the source: https://github.com/raphaelsalaja/skill/tree/main/skills/pseudo-elements
2. Read SKILL.md and the other files. Check the skill is safe: no hidden commands, no sending data elsewhere, no scripts doing something other than described. If anything looks suspicious, stop and tell me.
3. Put the “pseudo-elements” folder into your agent's skills folder: .claude/skills/ for Claude Code, .agents/skills/ for Codex, .cursor/skills/ for Cursor, .gemini/skills/ for Gemini CLI. Inside the project if we are in one, otherwise in the home folder (~/.claude/skills/ etc.).
4. Make sure <skills folder>/pseudo-elements/SKILL.md exists.
5. Briefly tell me what this skill does and offer to try it on my task.

If you cannot do a step yourself, tell me what to click or type.

技能檔案

1 個檔案 下載 ZIP

安裝前請先檢視 SKILL.md 與相關檔案。點擊檔案即可預覽。

SKILL.md 內容

作者原文 · 唯讀

Pseudo Elements

Review CSS and JavaScript for pseudo-element best practices and View Transitions API usage.

How It Works

1. Read the specified files (or prompt user for files/pattern)

2. Check against all rules below

3. Output findings in file:line format

Rule Categories

| Priority | Category | Prefix |

|----------|----------|--------|

| 1 | Before/After | pseudo- |

| 2 | View Transitions | transition- |

| 3 | Native Styling | native- |

Rules

Before/After Rules

pseudo-content-required

::before and ::after require content property to render.

Fail:

.button::before {
  position: absolute;
  background: var(--gray-3);
}

Pass:

.button::before {
  content: "";
  position: absolute;
  background: var(--gray-3);
}
pseudo-over-dom-node

Use pseudo-elements for decorative content instead of extra DOM nodes.

Fail:

<button className={styles.button}>
  <span className={styles.background} /> {/* Unnecessary DOM node */}
  Click me
</button>

Pass:

<button className={styles.button}>
  Click me
</button>
.button::before {
  content: "";
  /* decorative background */
}
pseudo-position-relative-parent

Parent must have position: relative for absolute pseudo-elements.

Fail:

.button::before {
  content: "";
  position: absolute;
  inset: 0;
}
/* .button has no position */

Pass:

.button {
  position: relative;
}

.button::before {
  content: "";
  position: absolute;
  inset: 0;
}
pseudo-z-index-layering

Pseudo-elements need z-index to layer correctly with content.

Fail:

.button::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--gray-3);
}
/* Covers button text */

Pass:

.button {
  position: relative;
  z-index: 1;
}

.button::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--gray-3);
  z-index: -1;
}
pseudo-hit-target-expansion

Use negative inset values to expand hit targets without extra markup.

Fail:

<div className={styles.wrapper}> {/* Extra wrapper for hit target */}
  <a className={styles.link}>Link</a>
</div>

Pass:

.link {
  position: relative;
}

.link::before {
  content: "";
  position: absolute;
  inset: -8px -12px;
}

View Transitions Rules

transition-name-required

Elements participating in view transitions need view-transition-name.

Fail:

document.startViewTransition(() => {
  // No view-transition-name assigned
  targetImg.src = newSrc;
});

Pass:

sourceImg.style.viewTransitionName = "card";
document.startViewTransition(() => {
  sourceImg.style.viewTransitionName = "";
  targetImg.style.viewTransitionName = "card";
});
transition-name-unique

Each view-transition-name must be unique on the page during transition.

Fail:

.card {
  view-transition-name: card;
}
/* Multiple cards with same name */

Pass:

// Assign unique name only to transitioning element
element.style.viewTransitionName = `card-${id}`;
transition-name-cleanup

Remove view-transition-name after transition completes.

Fail:

sourceImg.style.viewTransitionName = "card";
document.startViewTransition(() => {
  targetImg.style.viewTransitionName = "card";
});
// sourceImg still has name, causes conflict on next transition

Pass:

sourceImg.style.viewTransitionName = "card";
document.startViewTransition(() => {
  sourceImg.style.viewTransitionName = "";
  targetImg.style.viewTransitionName = "card";
});
transition-over-js-library

Prefer View Transitions API over JavaScript animation libraries for page transitions.

Fail:

import { motion } from "motion/react";

function ImageLightbox() {
  return (
    <motion.img layoutId="hero" /> // JS-based shared element transition
  );
}

Pass:

function openLightbox(img: HTMLImageElement) {
  img.style.viewTransitionName = "hero";
  document.startViewTransition(() => {
    // Native browser transition
  });
}
transition-style-pseudo-elements

Style view transition pseudo-elements for custom animations.

Fail:

document.startViewTransition(() => { /* ... */ });
// Uses default crossfade

Pass:

::view-transition-group(card) {
  animation-duration: 300ms;
  animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
}

Native Styling Rules

native-backdrop-styling

Use ::backdrop pseudo-element for dialog/popover backgrounds.

Fail:

<>
  <div className={styles.overlay} onClick={close} />
  <dialog className={styles.dialog}>{children}</dialog>
</>

Pass:

dialog::backdrop {
  background: var(--black-a6);
  backdrop-filter: blur(4px);
}
native-placeholder-styling

Use ::placeholder for input placeholder styling, not wrapper elements.

Fail:

<div className={styles.inputWrapper}>
  {!value && <span className={styles.placeholder}>Enter text...</span>}
  <input value={value} />
</div>

Pass:

input::placeholder {
  color: var(--gray-9);
  opacity: 1;
}
native-selection-styling

Use ::selection for text selection styling.

Pass:

::selection {
  background: var(--blue-a5);
  color: var(--gray-12);
}

Output Format

When reviewing files, output findings as:

file:line - [rule-id] description of issue

Example:
components/button/styles.module.css:12 - [pseudo-content-required] ::before missing content property
components/lightbox/index.tsx:45 - [transition-over-js-library] Using motion layoutId instead of View Transitions API

Summary Table

After findings, output a summary:

| Rule | Count | Severity |

|------|-------|----------|

| pseudo-content-required | 2 | HIGH |

| pseudo-over-dom-node | 1 | MEDIUM |

| transition-name-cleanup | 1 | MEDIUM |

References

常見問題

pseudo-elements 技能有什麼用途?

進行CSS偽元素和View Transitions的使用審核,以達成hover效果、裝飾層和過渡效果。

如何安裝 pseudo-elements?

打開本頁的「安裝」區塊並選擇你的代理 — Claude Code、Codex、Cursor 或 Gemini CLI:那裡有把技能資料夾複製到正確位置的現成指令。也可以複製「透過助理」分頁中的提示,讓助理自行檢查並安裝技能。

pseudo-elements 適用哪些 AI 模型?

技能是純 Markdown 指示(Agent Skills 格式),因此 pseudo-elements 適用任何讀取 SKILL.md 的代理:Claude Code、Codex、Cursor、Gemini CLI、GitHub Copilot、OpenCode 等。只有在任務符合技能描述時,模型才會載入指示。

pseudo-elements 是免費的嗎?

此技能由 raphaelsalaja 公開發布,採用 MIT 授權。技能本身免費 — 你只需向 AI 供應商支付實際使用的 token 費用。

安裝技能安全嗎?

技能是代理會遵循的指示,安裝前請閱讀 SKILL.md 及相關檔案。技能資料夾中的腳本只有在代理執行時才會運行 — 留意它的動作,不要授予多餘權限。

技能和 MCP 伺服器或外掛有何不同?

MCP 伺服器或外掛為模型提供新工具 — 會執行並回傳結果的程式碼。技能提供的是知識與流程:如何處理任務、要遵循哪些步驟、好的成果長什麼樣子。它不需要伺服器或 API 金鑰。

相關技能

所有技能 →