Click Spark <mv-click-spark>
从点击位置迸射火花线条的包裹组件:每条线条向外拉伸,在重力作用下轻微弯曲,并围绕一团柔和的闪光收缩成一点,绘制在一个共享的页面覆盖层上,因此火花不会被裁切,也不会阻挡点击;支持键盘,另有 spark() 函数可脱离该元素使用。
| 分类 | 微交互 |
|---|---|
| 类型 | Web Component(<mv-click-spark>) |
| 状态 | 稳定版 |
| Keywords | safe-rewrite, light, click, spark, burst, canvas, feedback |
When to use
- A button, icon or playful surface should give a small burst of sparks on click or keyboard activation
- A small button inside a clipped card or toolbar needs sparks that fly outside its box
- A spark effect should fire programmatically at any point on the page, without wrapping an element
Avoid when
安装
node scripts/add.mjs click-spark --out ./src/marvelous使用 Marvelous UI MCP 服务器的 AI 智能体:install_components({ slugs: ["click-spark"], target_dir: "<absolute path>/src/marvelous", framework: "react" })。
复制的文件(含依赖):tokens/tokens.css, core/base.css, core/canvas.js, core/element.js, core/motion.js, components/click-spark/click-spark.js, components/click-spark/click-spark.css。
用法
快速开始,最小可运行标记:
<mv-click-spark data-inline>
<button class="mv-button">Place order</button>
</mv-click-spark>标准标记,可在此基础上通过属性、data-* 和 CSS 变量进行定制:
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:1rem;width:100%;max-width:760px">
<mv-click-spark count="10" radius="26" size="14" style="border-radius:var(--mv-radius-xl);border:1px dashed var(--mv-border-strong);background:var(--mv-bg-subtle)">
<div style="display:grid;place-items:center;gap:.35rem;min-height:220px;text-align:center;padding:1.5rem;user-select:none">
<svg viewBox="0 0 24 24" width="28" height="28" fill="none" stroke="var(--mv-accent)" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 3.5v2M4.8 5.3l1.4 1.4M3 9.5h2M14.5 9.5l6 2.2-2.6 1.1 3 3-1.5 1.5-3-3-1.1 2.6z"/></svg>
<strong style="font-size:1rem">Click anywhere</strong>
<span style="color:var(--mv-fg-muted);font-size:.85rem">Every click sends out sparks.</span>
</div>
</mv-click-spark>
<div style="display:grid;place-items:center;gap:1rem;min-height:220px;border-radius:var(--mv-radius-xl);border:1px solid var(--mv-border);padding:1.5rem">
<mv-click-spark data-inline color="oklch(0.78 0.16 75)" count="12" jitter="0.6" radius="30">
<button class="mv-button" data-size="lg" data-shape="pill">Place order</button>
</mv-click-spark>
<mv-click-spark data-inline color="var(--mv-success)" count="6" size="10" radius="20" duration="380" easing="ease-in-out">
<button class="mv-button" data-variant="outline">Add to favorites</button>
</mv-click-spark>
<span style="color:var(--mv-fg-muted);font-size:.8rem">Works from the keyboard too: Enter or Space.</span>
</div>
</div>API
Attributes
| Name | 类型 | Default | Description |
|---|---|---|---|
color | CSS color | var(--mv-accent) | Spark color (tokens accepted; re-read on every click, so it follows the theme). Forced colors mode uses the system Highlight color. |
count | number | 8 | Number of streaks per burst; from 6 on, long and short streaks alternate (1 to 48). |
size | number | 12 | Maximum streak length (px). |
radius | number | 22 | Distance traveled by the longest streaks (px). |
duration | number | 460 | Burst duration (ms). |
easing | linear | ease-in | ease-out | ease-in-out | ease-out | Progress curve. |
line-width | number | 2 | Line thickness (px). |
jitter | 0..1 | 0 | Randomness of angles and lengths (0 = regular star). |
bleed | number | 0 | Kept for compatibility, no effect: sparks are drawn on a page overlay and are never clipped by the box. |
data-inline | boolean | inline-block display (to wrap a button). | |
disabled | boolean | Disables the effect (disabled or aria-disabled children never spark either). |
Methods
| Name | Description |
|---|---|
burst(clientX?, clientY?) | Fires a burst (viewport coordinates; the element center by default). |
spark({ x, y, color, count, size, radius, duration, easing, lineWidth, jitter }) | Module export: a burst anywhere on the page, viewport coordinates (center by default), on the same shared overlay. |
Events
| Name | Description |
|---|---|
mv-spark | On every burst, including under reduced motion when nothing is drawn; detail = { x, y } relative to the element. |
Content structure
| Name | Description |
|---|---|
(content) | Any content; clicks on it keep working. |
Accessibility
Purely decorative: one shared aria-hidden overlay with pointer-events: none, so sparks never block or steal clicks. Keyboard and assistive-tech activation (Enter/Space on a child control) fire the burst from that control's center. Disabled and aria-disabled controls do not spark. Reduced motion: no sparks at all. Forced colors: sparks use the system Highlight color. The frame loop runs only while a spark is alive, and the overlay leaves the top layer when idle.