单选筛选只升级手感:选中那枚长出对勾、底色从左铺满、邻居让位
规则不变,仍是单选。对勾真实占位、标签确实变宽,相邻标签用FLIP滑过去;计数变了跳一下;筛出几项只用一条礼貌播报。
本站这里在用收藏 · 类型单选
勾掉一项,它从「进行中」挪到「已完成」,两枚标签上的数字各跳一下。
数值 / 代码
结构 <div role="group" aria-label="按状态筛选"> 里一排 <button aria-pressed>
对勾 只插进选中那一枚,真实占位;入场220ms cubic-bezier(.22,1,.36,1)
from { opacity:0; transform:scale(.2) rotate(-30deg) }
铺底 .chip::before { transform:scaleX(0); transform-origin:left center }
.chip[aria-pressed="true"]::before { transform:scaleX(1) } 220ms 同一条曲线
让位 点击时先量各标签位置 → 改状态 → 从旧位置 translate 滑回0(220ms)
标签里的文字按「相对标签」的位置补位,对勾把字往右推也是滑过去的
计数 值变了才重播(首次渲染不跳)
@keyframes bump-in { from { opacity:0; transform:translateY(-45%) scale(1.15) } }
播报 <p class="visually-hidden" aria-live="polite">显示 N 项</p>——整排只这一条
减弱 不量位置、不挂动画类,直接到位用在哪
plan「全部任务」的状态筛选(全部/收件箱/进行中/已完成/已归档)。plan笔记页的标签筛选同样处理,但不铺底色——那一行本来是无边框文字,选中只换深色加粗,带下划线的蓝字会像超链接。本站收藏页按「类型」筛选的那排单选也是这套。
为什么
屋主给的组件原文是多选,可plan这排筛选一直是单选;改成多选就改了筛选规则,等于造新功能。所以只把对勾、铺底、让位、数字跳动套到现有的单选上。播报集中成一条:一排标签每个数都播,读屏会被刷屏。
坑
验FLIP有没有动,要读getComputedStyle(el).transform;读el.style.transform永远是空的,位移设完下一帧就清掉了。位置快照在点击的事件里拍,不在每次渲染里拍,否则窗口改宽也会滑。
出处:tools/plan/docs/BUSINESS_LOGIC.md:1147「20. 任务库逻辑」、:1603「30.2 笔记页」;tools/plan/app/src/App.css:1540「.status-chip」、:1588「.chip-check」、:1614「.bump-number.is-bumped」;tools/plan/app/src/pages/TaskLibrary.tsx:150、:173;tools/plan/app/src/hooks/useFlip.ts:3「FLIP 位移动画」;tools/plan/app/src/styles/tokens.css:295「--motion-*」