Dither <mv-dither>
WebGL 液滴背景,液滴漂移、融合又再次分开,像小穹顶一样被照亮,并通过有序 Bayer 矩阵以两种墨色印出:浅色主题下,墨色像版画一样描绘阴影;深色主题下,则像 1 位屏幕一样描绘光亮。
工作原理
WebGL 液滴背景,液滴漂移、融合又再次分开,像小穹顶一样被照亮,并通过有序 Bayer 矩阵以两种墨色印出:浅色主题下,墨色像版画一样描绘阴影;深色主题下,则像 1 位屏幕一样描绘光亮。指针带着自己的一滴液滴,把其他液滴吸引过来,光线也随之转向它;高光采用强调色。
| 分类 | 背景 |
|---|---|
| 类型 | WebGL 元素(<mv-dither>) |
| 状态 | 稳定版 |
| 同时安装 | shader |
| Keywords | safe-rewrite, webgl, shader, dither, bayer, retro, pixel, 1-bit, metaballs, interactive, hero |
When to use
- A retro, 1-bit or print-inspired brand wants a calm, living backdrop that reads well in light and dark themes
- A hero or launch page should answer the pointer in a playful way without leaving a two-color palette
- Pixel art, zines or early computer graphics set the tone and a smooth gradient would feel off-brand
Avoid when
- A still, CSS-only section background is enough and no WebGL context should be spent → use Backdrop instead
- Small body text sits directly on top; the crisp dither edges hurt legibility without a solid panel
安装
node scripts/add.mjs dither --out ./src/marvelous使用 Marvelous UI MCP 服务器的 AI 智能体:install_components({ slugs: ["dither"], target_dir: "<absolute path>/src/marvelous", framework: "react" })。
复制的文件(含依赖):tokens/tokens.css, core/base.css, core/canvas.js, core/dom.js, core/element.js, core/i18n.js, core/motion.js, core/observe.js, core/webgl.js, components/shader/shader.js, components/shader/shader.css, components/dither/dither.js。
用法
标准标记,可在此基础上通过属性、data-* 和 CSS 变量进行定制:
<mv-dither data-fill></mv-dither>
<div style="position:relative;display:grid;place-items:center;height:100%;min-height:320px;padding:1rem;color:var(--mv-fg);text-align:center;pointer-events:none">
<div style="padding:.9rem 1.25rem;border-radius:var(--mv-radius-md);background:var(--mv-bg);box-shadow:0 0 0 1px var(--mv-border)">
<p style="margin:0;font:700 clamp(1.5rem,4vw,2.4rem)/1.1 var(--mv-font-sans);letter-spacing:-.03em">Printed in two inks</p>
<p style="margin:.4rem 0 0;color:var(--mv-fg-muted);font-size:.9rem">Drops merge as they drift. Hover to bring one along.</p>
</div>
</div>API
Attributes
| Name | 类型 | Default | Description |
|---|---|---|---|
color | CSS color | var(--mv-fg-muted) | Ink color (tokens accepted, read again on theme change). Darker than the background, it draws the shadows; lighter, it draws the light. |
background | CSS color | var(--mv-bg) | Paper color: the lowest level and the empty floor. |
highlight | CSS color | var(--mv-accent) | Color of the glints on the drops (set it to the ink color for a strict two-color look). |
pixel-size | number | 2 | Size of a dither pixel in CSS pixels (multiplied by the pixel ratio). |
levels | number | 2 | Number of tones between paper and ink (2 = 1-bit). |
matrix | 2 | 4 | 8 | 8 | Side of the ordered threshold matrix: 2 and 4 give coarser, more graphic patterns. |
scale | number | 1 | Drop size (0.25 to 4); larger drops are fewer. |
turbulence | number | 1 | Strength of the pointer response, 0 to 3: size of the drop it carries and how hard it pulls the others (0 = none, the light still follows). |
speed | number | 1 | Time multiplier. |
paused | boolean | Freezes the drops on the current frame. | |
interactive | boolean | Follows the pointer only over the element (otherwise across the whole window). | |
dpr | number | 1.5 | Max pixel density (capped at 2). |
data-fill | boolean | Fills the positioned parent (absolute, inset 0). |
Events
| Name | Description |
|---|---|
mv-error | Inherited from <mv-shader>: the GLSL failed to compile. The element gets data-error and shows its fallback. |
Content structure
| Name | Description |
|---|---|
children | Content placed inside the element sits above the canvas. |
Accessibility
Decorative: the canvas is aria-hidden and never takes pointer events; content placed inside stays in the normal reading order. The loop stops off screen and in hidden tabs, and no WebGL context is created until the element comes near the viewport. Reduced motion (OS or <html data-motion="reduce">) and paused keep one still frame, with no pointer response. Forced colors and print hide the canvas; without WebGL2 a static sketch in the theme tokens is shown. Put text on a solid panel: the dither pattern is busy behind small type.