fix(webui): 动画全量盘点 —— 两处死动画 + 一处过宽;并把盘点变成常驻判据

用户:「全面检查整体的动画」。查出来的不是"好不好看",而是**接线断了**(三种形态都很难靠肉眼发现):

① @keyframes pane-in **定义了两处**、挂在 `html.view-switch .pane-enter` 上,而 `.pane-enter`
   **没有任何组件在穿** ⇒ 规则看着像"页面有入场动画",一次都不会播(9aa702b 删整面板入场时的遗留)。
   已连规则与 keyframes 一起删干净(注释里我把"连它一起删"写了却没做,被新判据当场抓到)。
② `.animate-menu-in`(菜单入场)keyframes 与规则都写好了,**同样没人穿** ⇒ 所有下拉/候选菜单
   其实是"啪"地出现。已接到 AddressInput 的候选菜单上;线上实测捕捉到 menu-in @140ms。
③ `html.view-switch .glass-control` 把"菜单入场"错当成"控件档入场" ⇒ 每次切视图,页面上
   **所有**按钮与输入框一起淡入位移(几十个元素同时动,闪与卡顿的现成来源)。已收窄为
   只给 `.animate-menu-in`;线上实测切视图只剩 pane-rise + 导航项的颜色过渡。

判据化:新增 test/animation-audit.test.mjs —— 每个 @keyframes 都必须有人穿(死动画闸门)、
弹层必须带菜单入场类、不得再出现"整档控件一起动"的切视图规则、reduced-motion 必须显式
覆盖挂载即播那档。写判据的过程本身抓到两处我自己的不一致:删了规则却留下孤儿 keyframes;
以及正则把 reduced-motion 名单里的 `html.view-switch .glass-control` 误判成"还在让它动"
(已改为只扫顶层规则,媒体查询块里的"关掉名单"不算)。
This commit is contained in:
2026-09-15 08:51:18 +08:00
parent f5d05755b7
commit d81ab319e4
3 changed files with 129 additions and 26 deletions

View File

@ -181,7 +181,7 @@ export default function AddressInput({
{open && items.length > 0 && (
<div
className={`absolute z-20 w-full overflow-y-auto popup-surface border border-gray-200 rounded-lg shadow-2 ${
className={`absolute z-20 w-full overflow-y-auto popup-surface animate-menu-in border border-gray-200 rounded-lg shadow-2 ${
menuLayout.flip ? 'bottom-full mb-1' : 'top-full mt-1'
}`}
style={{ maxHeight: menuLayout.maxHeight }}

View File

@ -1126,17 +1126,6 @@ select,
* 由它给外壳的直接子面板加一次入场动画。**不改 DOM 结构** —— 面板本身是 flex 链上的
* 一环,套一层动画 wrapper 会把 flex 传递改掉(这类改动最容易把窄屏覆盖层弄坏)。
*/
@keyframes pane-in {
from {
opacity: 0;
transform: translateY(6px) scale(0.995);
}
to {
opacity: 1;
transform: none;
}
}
/*
* ★ 只动**主内容区**,不动侧栏与列表(2026-09-14 用户:「部分动画十分不合理,
* 会导致页面大范围的闪动,且不能让人自然的把注意力集中在将要出现的页面上」)。
@ -1145,16 +1134,6 @@ select,
* 眼睛不知道该看哪里,观感就是"闪"。现在只让将要出现的那一页淡入,
* 而且幅度从 translateY(6px)+scale 收到 4px、不加缩放(缩放最容易让人觉得闪)。
*/
@keyframes pane-in {
from {
opacity: 0;
transform: translateY(4px);
}
to {
opacity: 1;
transform: none;
}
}
/*
* ★ 视图切换**不再做整面板入场动画**(2026-09-14 用户:「部分动画十分不合理,
@ -1165,9 +1144,13 @@ select,
* 只保留**局部**、有明确语义的动效(日历翻页、菜单展开、背景图淡入)。
* 骨架不动,注意力自然落在变化的那块内容上。
*/
html.view-switch .pane-enter {
animation: pane-in 140ms cubic-bezier(0.22, 0.61, 0.36, 1) both;
}
/*
* ★ 2026-09-15 全量盘点(用户:「全面检查整体的动画」):这里原本挂着
* `html.view-switch .pane-enter { animation: pane-in … }`,而 **`.pane-enter` 没有任何
* 组件在穿** —— 9aa702b 删掉整面板入场时留下的死规则(连 @keyframes pane-in 一起删了,
* 留着就是下一次"看起来有动画其实没人用"的源头)。
* 页面级入场仍不做:用户 09-14 明确否掉过"整屏一起淡";局部入场走 .rise-in / .pane-rise。
*/
/* 菜单/建议列表:轻微放大淡入,避免"啪"地出现 */
@keyframes menu-in {
@ -1181,7 +1164,12 @@ html.view-switch .pane-enter {
}
}
html.view-switch .glass-control,
/*
* 只给**真正是弹层**的东西:`.animate-menu-in`(候选/下拉菜单自己穿)。
* ★ 2026-09-15 盘点:原先这条还带着 `html.view-switch .glass-control` —— 那是把
* "菜单入场"错当成了"控件档入场",于是每次切视图,页面上**所有**按钮与输入框一起
* 淡入位移(几十个元素同时动)。控件不需要入场动画,要动的是"刚弹出来的那张列表"。
*/
.animate-menu-in {
animation: menu-in 140ms ease-out both;
}