8pt

Segmented Control

分段控制器•导航
介绍

等宽分段 + 滑块,切换时滑块弹簧位移,下方内容淡入。支持方向键切换。

纯 HTML、CSS 与少量原生 JS,没有框架依赖。复制提示词交给 Claude Code、Cursor、Trae 或 Codex,模型会把 Segmented Control 加进你的项目并换成你的配色。

适用场景

官网顶部导航、标签切换、分段控制、侧边导航和页脚。

安装

订阅 Builder 后,用 8pt CLI 装进项目,或在已接入 8pt MCP 的编辑器里直接调用。

$ npm i -g @8pt-dev/cli && 8pt add segmented-control
mcp › 使用 8pt MCP 调用 get_component("segmented-control")

代码

Segmented Control 的源码,动效只用 transform 与 opacity,并尊重减少动态效果设置。

<div class="x-seg">
  <div class="x-seg__bar" role="tablist" aria-label="视图">
    <span class="x-seg__thumb" aria-hidden="true"></span>
    <button type="button" role="tab" aria-selected="true">日</button>
    <button type="button" role="tab" aria-selected="false">周</button>
    <button type="button" role="tab" aria-selected="false">月</button>
    <button type="button" role="tab" aria-selected="false">年</button>
  </div>
  <div class="x-seg__out"><b>2,481</b><span>今日访问</span></div>
</div>
.x-seg{display:grid;justify-items:center;gap:18px;color:var(--d-fg,#fff)}
.x-seg__bar{--n:4;--w:62px;position:relative;display:grid;grid-template-columns:repeat(var(--n),var(--w));padding:4px;border-radius:12px;background:var(--d-card,#14141c);border:1px solid var(--d-line,rgba(255,255,255,.1))}
.x-seg__bar button{position:relative;z-index:1;height:34px;border:0;background:transparent;color:var(--d-muted,#9b9ba8);font:600 13px/1 var(--d-font,system-ui,sans-serif);cursor:pointer;transition:color .25s}
.x-seg__bar button[aria-selected=true]{color:var(--d-fg,#fff)}
.x-seg__thumb{position:absolute;left:4px;top:4px;width:var(--w);height:34px;border-radius:9px;background:color-mix(in srgb,var(--d-fg,#fff) 10%,var(--d-card,#14141c));border:1px solid var(--d-line,rgba(255,255,255,.14));box-shadow:0 6px 16px -8px rgba(0,0,0,.5);transition:transform .45s cubic-bezier(.3,1.3,.5,1)}
.x-seg__out{display:grid;justify-items:center;gap:4px;transition:opacity .25s,transform .25s}
.x-seg__out.swap{opacity:0;transform:translateY(6px)}
.x-seg__out b{font:700 34px/1 var(--d-font,system-ui,sans-serif);letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.x-seg__out span{font:12px/1 var(--d-font,system-ui,sans-serif);color:var(--d-muted,#9b9ba8)}
const init = (root) => {
  const bar = root.querySelector('.x-seg__bar'), tabs = [...bar.querySelectorAll('[role=tab]')], thumb = bar.querySelector('.x-seg__thumb');
  const out = root.querySelector('.x-seg__out'), b = out.querySelector('b'), s = out.querySelector('span');
  const data = [['2,481', '今日访问'], ['16,920', '本周访问'], ['71,305', '本月访问'], ['842,117', '全年访问']];
  let cur = 0, t;
  const go = (i) => { if (i === cur) return; cur = i;
    thumb.style.transform = `translateX(${i * 100}%)`;
    tabs.forEach((x, j) => { x.setAttribute('aria-selected', String(j === i)); x.tabIndex = j === i ? 0 : -1; });
    out.classList.add('swap'); clearTimeout(t); t = setTimeout(() => { b.textContent = data[i][0]; s.textContent = data[i][1]; out.classList.remove('swap'); }, 200); };
  tabs.forEach((x, i) => { x.tabIndex = i ? -1 : 0; x.addEventListener('click', () => go(i)); });
  bar.addEventListener('keydown', e => { if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') { const n = (cur + (e.key === 'ArrowRight' ? 1 : 3)) % 4; go(n); tabs[n].focus(); } });
  return () => clearTimeout(t);
…
订阅 Builder 查看完整源码。查看价格

更多导航组件

查看全部

Animated Tabs

Stepper

更多组件

查看全部

AI Prompt Composer

Film Strip Carousel

Auto Tab Showcase

Media Bento Grid

Agent Chat Window

Model Pill Marquee

Director Art Cards

Mac File Window

继续探索