Slosh Slider <mv-slosh-slider>

填充为液体的滑块:手柄在你的手指下保持刚性,液体则以柔和的弹簧追随它,撞到两端挡块,并随速度倾斜和荡漾。

工作原理

填充部分是液体的滑块:手柄在你的指下保持刚性,液体则以柔和的弹簧追随它,撞到两端的挡块,并随速度倾斜和泛起涟漪。它是完整的表单字段(键盘、ARIA、重置),竖直放置时则是一个水箱。

分类表单
类型Web Component(<mv-slosh-slider>)
状态稳定版
Keywordsslider, range, liquid, physics, spring, gauge, tank, form-associated, tactile

When to use

  • A playful or tactile product wants a slider whose liquid fill reacts to drag speed
  • A level such as volume, water intake or a fill ratio reads well as a vertical tank
  • A marketing or onboarding page wants a memorable form control that still submits a value

Avoid when

  • A dense settings screen needs a sober slider, two thumbs or labeled tick marks → use Slider instead
  • Another expressive style fits better, like a wave, ruler or value bubble → use Range FX instead
  • Many sliders appear on one page; the per-slider spring physics adds noise and cost

安装

node scripts/add.mjs slosh-slider --out ./src/marvelous

使用 Marvelous UI MCP 服务器的 AI 智能体:install_components({ slugs: ["slosh-slider"], target_dir: "<absolute path>/src/marvelous", framework: "react" })。

复制的文件(含依赖):tokens/tokens.css、core/base.css、core/dom.js、core/element.js、core/form.js、core/motion.js、core/observe.js、components/slosh-slider/slosh-slider.js、components/slosh-slider/slosh-slider.css。

用法

标准标记,可在此基础上通过属性、data-* 和 CSS 变量进行定制:

<form id="mv-slosh-slider-demo" style="display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2rem 2.5rem;align-items:end;width:100%;max-width:640px">
  <div style="display:grid;gap:1.4rem">
    <mv-slosh-slider label="Volume" name="volume" value="64" suffix="%"></mv-slosh-slider>
    <mv-slosh-slider label="Monthly budget" name="budget" min="0" max="2000" step="50" value="850" prefix="$" slosh="0.85" style="--mv-slosh-slider-color:var(--mv-success);--mv-slosh-slider-color-2:color-mix(in oklch,var(--mv-success),black 15%)"></mv-slosh-slider>
    <mv-slosh-slider label="Brightness (classic)" name="brightness" value="30" suffix="%" slosh="0" style="--mv-slosh-slider-height:1.75rem"></mv-slosh-slider>
  </div>
  <mv-slosh-slider label="Tank" name="water" orientation="vertical" value="70" suffix=" L" max="120" slosh="0.9" style="--mv-slosh-slider-color:var(--mv-info);--mv-slosh-slider-color-2:color-mix(in oklch,var(--mv-info),black 22%)"></mv-slosh-slider>
  <div style="grid-column:1/-1;display:flex;gap:.6rem;align-items:center;flex-wrap:wrap">
    <button class="mv-button" data-size="sm" type="submit">Submit</button>
    <button class="mv-button" data-size="sm" data-variant="outline" type="reset">Reset</button>
    <output id="mv-slosh-slider-demo-out" style="font-size:.8rem;color:var(--mv-fg-muted)"></output>
  </div>
</form>
<script type="module">
  const form = document.getElementById("mv-slosh-slider-demo");
  const out = document.getElementById("mv-slosh-slider-demo-out");
  form.addEventListener("submit", (e) => {
    e.preventDefault();
    out.textContent = [...new FormData(form)].map(([k, v]) => `${k} = ${v}`).join(" · ");
  });
</script>

API

Attributes

Name类型DefaultDescription
labelstringVisible label (and accessible name).
namestringForm field name.
valuenumberInitial value (also used on reset).
min / max / stepnumber0 / 100 / 1Bounds and step (the step sets the displayed precision).
sloshnumber0.6Inverse viscosity: 0 = classic slider, 1 = very fluid liquid (softer, less damped).
orientationhorizontal | verticalhorizontalvertical: a tank that fills from the bottom, with a sloshing horizontal surface.
prefix / suffixstringText around the displayed and announced value (e.g. suffix="%").
hide-valuebooleanHides the displayed value (it is still announced).
disabled / requiredbooleanForm states (a disabled fieldset is respected).

Properties

Name类型Description
valuestringValue (a string, like an input).
valueAsNumbernumberNumeric value.

Events

NameDescription
inputOn every change while dragging or using the keyboard.
changeOn release or after a key press.

CSS variables

NameDefaultDescription
--mv-slosh-slider-color / --mv-slosh-slider-color-2accent / darkened accentLiquid gradient.
--mv-slosh-slider-trackvar(--mv-bg-muted)Tube background.
--mv-slosh-slider-height2.75remThickness of the horizontal tube.
--mv-slosh-slider-width / --mv-slosh-slider-length4.75rem / 12remSize of the vertical tank.
--mv-slosh-slider-radiusfull (2xl when vertical)Tube radius.
--mv-slosh-slider-ratioSet by the component: position 0..1, for styling around it.

Accessibility

role=slider on the tube (focusable), aria-valuemin/max/now and formatted aria-valuetext; ←/→/↑/↓ (Shift ×10), Page↑/↓, Home/End. Form-associated (ElementInternals): submitted value, reset, disabled fieldset, <label for>. The liquid is decorative (SVG aria-hidden). Reduced motion: instant fill, no ripples. Forced colors: the tube is outlined, the liquid is Highlight and the handle CanvasText.

本页面由 AI 翻译。报告翻译问题