Skip to content

D 手机首页 · 动画记录 ​

状态:已实现(2026-10-20)。2026-10-19 把第三轮概念动画的六步流程(reference → data → story → motion → direct → ship)推到 D 手机首页,先写前三步:参考、数据、故事;2026-10-20 评审后做完第 4–6 步,实现的取舍、与故事的出入、定格与性能见第 4–6 节。原型探索,不是规范。现状与交互清单见 home.md,范本是份额拨盘(spec、data、story)与整理脉冲(spec、data、story),两层法则见 CONCEPTS.md 第三轮。数字都由 scenario.mjs 回放现算,规则见 2.1;推算脚本只留在本机,不入库。

D 与两个概念动画有三处根本不同,故事都要正面回答:它是真正作答的地方(其他形式的“去回答 →”都链到它),动画服务作答而不是展示;手机没有悬停;它是阅读工具,“丝滑”要来自元素在换轮、作答、展开之间位置连续,而不是粒子。

1 参考(reference) ​

1.1 D 现在怎么变 ​

读 d.mjs、d.css 与 respond.mjs 所见。D 不是硬切:每次重绘按 data-key 只换变了的叶子,再用 FLIP 让同一件事从旧位置走到新位置(320 ms,cubic-bezier(.2,.75,.25,1))。断在别处:

时刻现在怎么动断在哪
换轮(‹ ›、轨道、空格每 5.6 秒)先量位再补丁,然后同时起跑:留下的平移 320 ms;同一件事换脸(行 ↔ 卡、卡 ↔ 回执)时旧面做成幽灵层,旧字 128 ms 淡出、盒子 320 ms 收到新高、新字过了 35% 才出现;新来的用 clip-path 揭开 360 ms,从折叠行出来的错开 24 ms;离开的上收淡出或收进折叠行;头部数字滚一格 260 ms,说明行与累计栏从 0.25 淡入 260 ms;状态栏时间、侧栏标题与旁白硬切一切挤在 0–0.36 秒里一起动,没有先后。f25 → f26 首页 8 个元素全部在变、另有 2 个离开(两周最多,见 2.5),眼睛不知道先看哪;数字与卡片同一刻变,看不出“因为什么少了一件”
作答(approve、choose 一键,confirm 两键)卡换成回执(同上的幽灵层变形),下一张升首卡(题干 17.5 → 21 px、多两行摘要),折叠里一件补上来,数字滚一格,顶部再弹 2.2 秒 toast“已保存 · …”,焦点到“撤回”同一刻四件事:回执收起、首卡变大、补位、数字。toast 把视线拉到屏幕顶,离开手指。下面的卡上移到手指下面,连点会落到下一张卡的按钮上
下一轮整理之后本页回执按条目 id 与 updated_at 存(createResponseStore),Agent 一改写这件事就取不到你按下的东西在下一个节拍里没有落点:f22 答“打给诊所”,f23 猫看病改写成进行中的一行,回执凭空消失;f26 答主水管,f27 改写重登记,数字从 4 回到 5,像答了白答(见 2.4)
详情从右侧平移 36 px 淡入 280 ms;收回向右 220 ms与被点的卡没有几何联系:卡在屏幕中间,详情从右边来,收回也不回到卡上,等于换了一个场景;与拨盘、脉冲“沿自己的几何弹出”不是同一标准
选项层(schedule、defer、稍后、折叠里的问题)从底部上滑 300 ms,背景淡入 240 ms;换轮时立即收起基本成立;有把手却不能下拉关闭
稍后卡缩到 0.2 倍飞向头部“◷ N 件”,480 ms成立:D 里唯一把“从哪到哪”画清楚的退场
左滑已阅(进行中与结果的行)跟手平移淡出,过 80 px 松手即已阅,否则 200 ms 回弹只用指针事件模拟过,没在真机试(home.md 已记)
新登记的问题卡外圈朱红细描一次,1.6 秒、延迟 0.25 秒,每帧每件只一次成立;但它和揭开、平移同时开始,被淹掉
自动播放(原型的回放)每 5.6 秒一轮,作答不暂停刚按下的回执可能下一秒就被换轮冲走

1.2 拨盘与脉冲:搬什么,不搬什么 ​

要素拨盘 / 脉冲D
离散量一帧硬切,连续量 ease-out计数在切点翻牌;扇区、枝条 ease-out搬。时间、说明行、累计栏、标签上的“N 份”硬切;位置与大小 ease-out。英雄数字差 1 时滚一格(作答、撤回都差 1,滚动本身就在说“少了一件”),差 2 以上一帧硬翻
过冲约 3.7%扇区落定、游标、弹出只给被按的那张卡外扩 8 px;列表重排一律临界阻尼、不过冲,阅读中的行回弹会像抖
切点后 0.4 秒才有第一个焦点每轮都一样只搬到“回来”与“下一轮整理”:先 0.4 秒只换字、只确认回执,再动列表。手指触发的动作不等,按下的那一帧就要有反馈
展开三段 0–0.3 / 0.4–0.6 / 0.6–0.9 秒,收回 0.2 / 0.15 / 0.2 秒弹出 8 px → 引线 → 详情卡搬顺序与“收回逆序、比展开快”。引线换成卡框自己长到全屏,屏幕上没有放引线的地方;时长见 3.7 与待定问题 2
悬停:其余降到七成,概念层降到四成;0.15 秒宽限、0.12 秒淡出鼠标;触屏上“轻点一下就是悬停”搬到长按。D 不能用“轻点即悬停”:它的轻点必须直接起作用(作答或展开)
节拍守恒:卡上的数不提前说后面节拍的事弧没到根之前写“本轮的输入还在路上”搬成“保存不等于收到”:下一轮整理落地之前,页面不说份额已经让出,回执写“等 Agent 下一轮整理,状态还没变”
概念层约八成,可以一直动粒子、余辉、字形碎片不搬。D 是阅读工具,静止是默认;概念层只留累计栏左侧那块细纹,约占屏幕 1%,每轮整理只动一次(3.6)
4 秒节拍器、首尾循环官网首屏不搬。D 只在三种时刻动:一轮整理落地;你作答、撤回或稍后;你展开或收起
一个圆心、一套刻度极坐标、64 条射线搬成“一个盒子”:同一件事的行、卡、回执、详情是同一个盒子变形,不换盒子

1.3 两个手机端参照 ​

凭使用记忆描述,没有逐帧量过;时长只作量级。

  • iOS「提醒事项」勾掉一条。 点左边的圆圈,圆圈先填满,这一行原地停一会儿(一两秒;这段时间再点就撤销),然后收起高度、下面的行上移补位;开着“显示已完成”时它不消失,落到已完成的那一段。可取三点:按下的东西先在原地确认,不立刻离场;离场与补位是同一个动作,不先空出一个洞再合上;撤销窗口就是那段停留。D 的回执原地收起已接近第一点,缺的是“落到已完成那一段”,对 D 就是下一轮整理时沉到“进行中与结果”。
  • App Store「Today」卡片。 轻点一张卡,卡从它在列表里的位置原地长成整屏文章,圆角、配图、标题跟着长大,其余卡片退后变暗;在文章顶部往下拖,文章跟手缩回成卡、落回原位,拖得不够远就弹回全屏。可取的:展开是“卡自己长成详情”,没有第二个元素从屏幕外进来;收回回到原位;手势跟手、可以中途反悔。D 的详情从右边滑进来,缺的正是这一点。

1.4 Safari iOS 的约束 ​

  • 帧率。 默认约 60 Hz(ProMotion 机型上网页也不跑 120 Hz,这是 WebKit 默认打开的一个开关,第 4 步在真机上核对),每帧 16.7 ms。只动 transform 与 opacity;clip-path、height、box-shadow 的动画在 WebKit 里不保证走合成线程,D 现在的揭开与幽灵层变形正用 clip-path,第 4 步先用 Web Inspector 的时间线在真机上量,掉帧就改成父层 overflow: hidden 加子层平移的揭开。阴影不做动画,预先画在伪元素上只改不透明度;变暗层不用 backdrop-filter。
  • 没有滚动锚定。 Safari 不支持 overflow-anchor:视口以上的元素变高变矮,正在读的内容会跳。真机宽度下 D 是整页滚动,补位时按量到的位移自己补 scrollTop。
  • 左缘右滑是后退。 从左边缘起的右滑交给浏览历史;从拨盘或脉冲的“去回答 →”进来时一滑就退回上一页,本页回应只在内存里,全丢。详情打开时 history.pushState,让这一滑等于“收回详情”;这一滑 Safari 自己画返回动画,本页直接到终态,免得演两遍。右边缘起的左滑在有前进记录时是前进,行上的左滑要从行内起手;整页不绑任何右滑。
  • 下拉刷新。 页面在顶部继续下拉是 Safari 的回弹,较新的系统里还会刷新页面,同样丢掉本页回应。首页顶部不绑下拉;真机宽度下本页回应用 createResponseStore 已有的 persistKey 存起来。
  • 长按。 默认会选字、弹放大镜或链接预览;卡与行上设 -webkit-touch-callout: none 与 user-select: none,自己计时。网页拿不到触感(Safari 不支持 Vibration API),长按成立只能靠画面。
  • 工具栏伸缩。 地址栏随滚动收起会改变视口高度;吸附在底部的累计栏按 dvh 定位,否则补位动画中途跳一下。
  • 减少动态。 prefers-reduced-motion 时一切直接到终态(D 已经这样做)。

2 数据(data) ​

2.1 规则 ​

量怎么算出处
waiting:英雄数字 N根层条目里 currentAsk(s, id) 不为空的件数,不含本页回应variants/shared.mjs currentAsk;d.mjs compose().waiting
三张大卡、还有 N 件上面这些问题按 urgencyKey(档位 → 24 小时内到期 → 截止 → 份额 → 排名)排序,取前 3 张,其余折成“还有 N 件”d.mjs urgencyKey、compose()
期限ask.due_at,没有则取条目 due_at(done 除外);“还有 N 小时”按本帧时刻算d.mjs dueOf、dueWords
份额、留白records[i].state.root.items[].share;留白 = 64 − root.usedengine.mjs replayScenario
说明行比较起点 = 上一帧;收到 = 区间内 frame.events.length 之和;新问题 = ask.registered_at 晚于起点;变化 = diffStates(起点, 此刻).changes 去掉 annotations_changed;原处处理 = 本人事件 feedback[].target 去重d.mjs sinceHTML
真实作答event.feedback[] 带 ask 指向这个问题;答掉 = 之后某帧这件事的 currentAsk 不再是它;关上时没有反馈指向它就是失效同 拨盘 data.json 的 rules.openAsks
让位相邻两帧根层 share 之差;回执不记“谁让给谁”,只能并排同一轮的增减同拨盘 rules.yield
重排首页带 data-key 的叶子(折叠收起时)按 render() 的顺序;数“动了的元素”:进、出、换序(留下的相对次序变了)、换脸(首卡 ↔ 大卡 ↔ 回执 ↔ 行,折叠行与表头的计数),一个元素只数一次d.mjs render()、patch()
本页回执按条目 id 与 updated_at 存;下一帧版本变了就取不到respond.mjs createResponseStore

2.2 f26 回来时最急的 3 件 ​

composite 的 f26:08-16 00:00,旁白「车道下的铜管裂了」(frames[26].title),D 的默认链接与拨盘第 3 拍的落点都在这一帧。

事项 · 问题题干(ask.prompt)与按钮期限份额
首卡主水管 driveway-wet · ask-23整根挖开换(约 6.8 万克朗)还是免挖穿新管(约 4.1 万);choose,两项都没标推荐8/17 10:00(ask.due_at),还有 34 小时24,关键
第 2 张FTPS 计时 issue-13587 · ask-24#13596 修好重复计时,批准合并吗;approve,“批准”为推荐无6,常规
第 3 张待审 PR pr-reviews-0814 · ask-22三个旧 PR 推到哪天再看;defer无6,常规
  • 卡顶标签:首卡“档位 关键 · 10:00 前 · 还有 34 小时 · 新问题 · 24 份”;第 2 张“新问题 · 6 份”;第 3 张“问题已更新 · 6 份”(f23 首次登记,f26 随改写重登记)。
  • 头部 5 件等你回应(waiting,f26);还有 2 件:开学同意书(confirm,1 份,8/18 23:59 前)、Ture 的 VAB(confirm,1 份,无期限)。
  • 说明行:上次看是 8/15周六 12:00,之后收到 158 条(frames[26].events.length),新问题 2 个(ask-23、ask-24),8 处变化,你在原处处理了 2 件。累计栏:累计 3051 条输入 → 现在 14 件,空余 1 份(root.used 63)。
  • 下一帧 f27:主水管改写后重登记 ask-23,首页一个元素都没动,份额没有让位。这是第 3 节不把作答样张放在 f26 的原因(待定问题 1)。
  • story 数据集的 f26(10-21 17:30)只有 1 件等你回应:苏禾改约周四 19:30(choose,1 份,10/22 19:30 前、还有 26 小时)。

2.3 「离开半天回来」最重的一次 ​

composite 每 12 小时一轮,每一帧都是“离开半天回来”。按 waiting 排,最多 8 件,f04、f08、f15 三帧并列;再按这半天收到的条数排,f08 最重:08-07 00:00,旁白「最忙的一天,航班改经拉纳卡」。

  • 8 件等你回应 = 3 张大卡 + 还有 5 件(waiting,f08)。大卡:母亲九月住哪(关键 24 份,8/14 前)、NDEBUG 报错还是 undef(高 12 份)、master CI 谁来查(常规 6 份,推荐“我来查”);折叠里:9/14 航班补一句(reply,6 份)、小龙虾派对回几个人(choose,3 份)、#13473、抬棚屋、#13350(各 1 份)。
  • 上次看(f07,08-06 12:00)之后收到 203 条(frames[8].events.length,两周第二多,只少于 f20 的 234),13 处变化,新问题 1 个,你在原处处理了 5 件。并列的 f04 收到 125 条,f15 收到 71 条。
  • 按“换轮时首页动了几个元素”算,最重的不是 f08(6 个),而是 f25 → f26(10 个,见 2.5)。

story 数据集不定时:两轮相隔 10 小时以上的有 14 次。其中 waiting 最多的是 f04:10-13 09:20,离上一轮(10-12 20:30)12.8 小时,4 件等你回应(两周最多),新问题 2 个,5 处变化。相隔最久的是 f34(23.7 小时),只有 2 件。

2.4 一次真实作答之后 ​

composite 两周有 32 条反馈指向问题,答掉 11 个问题(与拨盘 asks.answered 相同)。挑 ask-16「Smilla 多吃了药:打诊所?」(smilla-vet),三件事同时成立:它是 f22 的首卡;真实的回答正好是 D 上那颗实心推荐按钮;它关上的那一轮是两周最大的一次让位。

时刻事实出处
f22 08-14 00:005 件等你回应。首卡题干“怀疑给 Smilla 多喂了半片恩诺沙星:打给诊所,还是先观察?”,按钮“打给诊所”(推荐,meaning: act)与“先观察”;关键 24 份,08:00 前还有 8 小时,问题已更新(ask-16 首次登记于 f18)。第 2、3 张:母亲九月住哪(关键 24 份,23:59 前还有 24 小时)、#13572 批准吗(常规 6 份,新问题);还有 2 件:Ture 的 VAB(3 份)、开学同意书(1 份);留白 0frames[22].asks;waiting
本页一键(模拟)5 → 4;这张卡原地收成回执;母亲九月住哪升首卡;Ture 的 VAB 从“还有 2 件”出来成第 3 张大卡,折叠行变“还有 1 件”compose() 加本页回执
08:02(真实)你给诊所打了 6 分钟电话:家庭流 Telefon 通话记录,feedback 为 {ask: ask-16, action: call, via: source}f23 的事件
f23 08-14 12:003 件等你回应;旁白「打了诊所;母亲自己定了」frames[23].title;waiting
份额猫看病 24 → 12,母亲换水管 24 → 6(“九月住哪”随改写失效,不是你答的),master CI 1 → 6;留白 0 → 25(root.used 64 → 39),两周最大,与拨盘 largestSingleYield 同一处让位,f22 对 f23
让给了谁没有谁接住:同一轮里只有 master CI 涨了 5 份,其余 25 份成了留白。配对不在回执里,画面只能并排同一轮的 −12、−18、+5 与留白 +25同上
首页重排(从刚答完到 f23)6 个元素变 8 个,9 个动了,没有一个原地不动:进 3(开学同意书从折叠升为第 3 张大卡、“进行中与结果 · 3”表头、master CI 从次要事项升为一行);出 1(“还有 N 件”折叠行);换序 4;换脸 4(待审 PR 第 2 张 → 首卡,题干换成“三个旧 PR 推到哪天?”;猫看病回执 → 进行中第 1 行「Smilla已减量,24日9:30复诊」;母亲换水管 首卡 → 已完成行「Mamma已交回执,选疏散公寓」;次要事项 6 → 5 项)。三张大卡全部换人重排
不带本页回执的 f22 → f235 个元素变 8 个,9 个动了重排
回执猫看病的 updated_at 从 00:00 变成 12:00,回执取不到;那一行只剩来源处最后一句“↩ 08:20 你用 iMessage 回复 Kajsa”,看不出“打给诊所”已被收到本页回执

对照:

  • f26 答主水管 → f27。 主水管被改写、重登记,回执取不到,卡回到首卡、标签“问题已更新”,卡里写“你 00:00 答过上一版”;数字 4 → 5;FTPS 计时退回第 2 张,开学同意书退回折叠。动了 4 个元素,份额不变。
  • story:f04 答「导出模板是否允许编辑?」→ f05。 真实回答是 10-13 14:34 林苒在团队群里的一条回复“这版先不做模板编辑……先核费用构成”:它指向子事项上登记的同一问 ask-04(选“固定模板”),同一条也答了 ask-09 费用;首卡上的 ask-03 是同一问登记在根上的那条,f05 随改写关上。f05 发布 12 → 6,沉成进行中一行「导出发布已定固定模板」;试用 12 → 24,从进行中一行升为首卡(新问题「今天对远川怎样表态?」,关键);费用 6 → 3,退进次要事项;留白 3 → 0。让出的份额同一轮被新问题接走,数字 3 → 3 不动,动了 5 个元素。story 里另一处更大的让位是 f15(ask-17 改约,妈妈 12 → 24、试用 24 → 6,留白 3 → 18,拨盘 story 的第 3 拍):答一件,这件反而变大。

2.5 换轮的工作量 ​

compositestory
换轮次数2836
首页同时在场的元素(折叠收起)最多 10 个最多 9 个
一次换轮动了的元素中位 4 个;最多 10 个(f25 → f26),其次 9 个(f22 → f23)、8 个(f21 → f22);f26 → f27 为 0中位 4 个;最多 7 个(f07、f20、f30、f31)
从折叠里出来的一次最多 3 个(f23)一次最多 1 个

所以一次节拍里同时动的元素不超过 10 个;编排按 3.6 的先后分组,进场错开 40 ms、封顶 8 个(f00 → f01 从空状态一次进 7 个)。

3 故事(story) ​

论点。 答一件,少一件:你按下的那张卡原地收成回执,留在手指下;下一轮整理读到了,它才带着让出的份额沉到“进行中与结果”,空位由下一件补上。屏幕上每个元素都从原来的位置走到新位置,一次只走一段,不闪、不跳。

英雄数字:“N 件等你回应”的 N。 样张里 f22 是 5,按下“打给诊所”变 4,12:00 那一轮整理落地后变 3。它是这一页唯一的大字(27 px、字重 800,位置与字号永不变),回答场景的第一问“几件等我”;只在两类时刻动:一轮整理落地;你作答、撤回或稍后。三个形式的英雄数字连成一条:脉冲是这一轮收到多少(f20 的 234),拨盘是一共能放多少(64),D 是要你答几件(5)。

样张。 composite 的 f21 → f22 → 按下 → f23(数字见 2.4);story 数据集对应 f03 → f04 → 按下“固定模板” → f05。默认链接 f26 是最重的换轮(10 个元素),作为第 1 拍的压力测试。样张假定你在 D 上点的就是真实数据里的回答;点了别的,下一轮回放照旧按真实数据走——原型只演回路,不写回状态(见 home.md 开头)。

3.1 三拍 ​

拍时长发生什么观众此刻
1 回来换到 f22,约 1.0 秒先换字(时间、说明行、累计栏),0.4 秒后数字 6 → 5,再让列表按“离场 → 移位 → 进场”走一次:猫看病从第 2 张升首卡,母亲九月住哪退到第 2 张,#13572 揭开成第 3 张,#13567 那一行并进它,小龙虾派对撤下,“还有 3 件”变 2 件有 5 件,最急的是猫
2 看三件不限时;页面不动三张大卡写着为什么在这里(档位、期限、新问题、份额);轻点卡展开详情,长按折叠里的一行看概要,点“还有 2 件”展开先答猫,08:00 前
3 答一件按下 0.72 秒;下一轮整理 1.0 秒3a 按“打给诊所”:卡原地收成回执,数字 5 → 4,下面一次上移补位,Ture 的 VAB 从折叠里出来。3b 12:00 那一轮整理落地:回执先填实,数字 4 → 3,猫看病带着回执沉到进行中第一行,母亲九月住哪随改写失效、沉到已完成,#13572 换成“三个旧 PR 推到哪天?”升首卡,开学同意书与 master CI 补上来答掉的去了哪,谁顶上来

3.2 第 1 拍:回来(f21 → f22) ​

首次载入不演:从别的形式点“去回答 →”进来,直接是终态,只给新问题描一次朱红。“回来”只在页面开着、换到下一轮时演(产品里对应 App 回到前台且有了新的整理)。时间表与 3b 共用:

时刻什么动怎么动
0切点状态栏时间、日期、说明行(“上次看是 8/13周四 12:00,之后收到 172 条,新问题 2 个,18 处变化,你在原处处理了 4 件”)、累计栏(累计 2566 条 → 现在 11 件,空余 0 份)、折叠计数(还有 3 → 2 件,次要事项 12 → 6 项)一帧硬切
0–0.40只有概念层累计栏的细纹向下收拢一次(3.6);列表不动,第一个焦点留给说明行
0.40–0.66英雄数字6 → 5,滚一格
0.40–0.64离场小龙虾派对(第 3 张,已过 12 小时,被撤下)上收淡出;#13567 那一行沿竖直方向移向第 3 张卡的位置、在它下面淡去,把“合并到哪”画出来;“进行中与结果”表头随最后一行离开
0.48–0.80移位猫看病上移一位升首卡,同一次移动里题干 17.5 → 21 px(transform 缩放,不重排字),0.64 起摘要两行淡入,标签“12 份 → 24 份”“档位 高 → 关键”落定时翻;母亲九月住哪下移一位,摘要先收;两者交错时升上来的在上层
0.60–0.96进场#13572 在第 3 张的位置揭开(从上沿往下,0.36 秒);有多个进场时错开 40 ms
0.96–2.56新问题#13572 的外圈朱红描一次

3.3 第 2 拍:看三件 ​

页面不动。手势与它们的动效见 3.5;详情、概要、折叠的展开都只在手指触发时动,换轮会把它们立即收起(与 ix 的打断规则相同)。

3.4 第 3 拍:答一件 ​

3a 按下“打给诊所”(f22,本页,即刻)。 按住时按钮缩到 0.97(已有,0.12 秒);松手是切点。

时刻元素从 → 到
0–0.12猫看病的作答区(两颗按钮、稍后、详情 ›)、题干、摘要淡出。卡顶“猫看病 · 条目标题”一行不动,是这张卡的锚
0–0.20猫看病的卡盒上沿不动,下沿收到回执高度
0.10–0.30回执一行淡入:“你选了「打给诊所」· 00:00 / 已保存 · 等 Agent 下一轮整理,状态还没变”,空心勾 0.12–0.30 描出;“撤回”落在回执右端,焦点到它
0.20–0.46英雄数字5 → 4,滚一格
0.20–0.52母亲九月住哪、#13572一次上移补位(0.32 秒,不过冲);母亲九月住哪在同一次移动里升首卡(17.5 → 21 px),0.40–0.56 摘要淡入
0.36折叠行“还有 2 件”硬翻“还有 1 件”,叠边少一层
0.36–0.72Ture 的 VAB从折叠行下沿滑出、揭开,成第 3 张大卡
0.72 起 0.4 秒手指保护补位后移到上一次触点下面的按钮暂不接受点按,防止连点落到“住我们家”

不再弹顶部 toast,“已保存”只写在回执里(原来的文字留给读屏的 aria-live)。撤回逆序、更快,0.40 秒:0–0.15 Ture 收回折叠行(0.15 时“还有 1 → 2 件”);0.10–0.30 母亲九月住哪降回第 2 张、其余下移;0.15–0.35 回执展开回原卡、按钮淡入,焦点回到“打给诊所”;0.15–0.41 数字 4 → 5。稍后沿用现在的“飞向 ◷”(0.48 秒),数字同样减一。

3b 下一轮整理落地(f23,12:00)。 先确认你做过的,再让份额让位:

时刻元素从 → 到
0切点状态栏、日期、说明行(“上次看是 8/14周五 00:00,之后收到 115 条,新问题 1 个,6 处变化,你在原处处理了 3 件”)、累计栏(累计 2681 条 → 现在 11 件,空余 25 份)、次要事项 6 → 5 项,一帧硬切
0–0.40回执空心勾填实(0.30 秒),小字换成“已收到 · Agent 在 12:00 的整理中读到”;累计栏细纹收拢一次。列表其余不动
0.40–0.66英雄数字4 → 3
0.40–0.88猫看病(主角)回执卡一次下移到“进行中与结果”第 1 行,越过三张卡时在上层;后半段盒子变成行(圆角 20 → 0、卡白 → 纸色、阴影淡出),0.64–0.88 行标题「Smilla已减量,24日9:30复诊」淡入;回执留作这一行下面的小字“✓ 你选了「打给诊所」· 已收到”
0.46–0.94母亲九月住哪晚 0.06 秒起步,同样一次下移到已完成那一行「Mamma已交回执,选疏散公寓」;没有勾,留一行灰字“这个问题随改写失效”
0.48–0.80待审 PR(#13572 那张)、Ture 的 VAB待审 PR 从第 2 张升首卡(同一次移动里放大),0.56–0.80 题干换成“三个旧 PR 推到哪天?”、标签换成“新问题”;Ture 升第 2 张
0.60–1.04开学同意书、表头、master CI开学同意书从“还有 1 件”的位置展开成第 3 张大卡,折叠行同时淡出;“进行中与结果 · 3”表头揭开;master CI 从次要事项那一行升上来成为进行中第 2 行(1 → 6 份);三者错开 40 ms
1.04–2.64新问题待审 PR 首卡的外圈朱红描一次

两种变体用同一张时间表:

  • 问题被改写重登记(f26 答主水管 → f27):0–0.40 回执照样填实;然后同一个盒子原地展开回大卡,不移动,标签换成“问题已更新”,回执变成卡里的一行“你 00:00 答过上一版:整根挖开换 · Agent 已收到,问题随后改写”;数字 4 → 5 照实滚上去;FTPS 计时退回第 2 张,开学同意书退回折叠。
  • 答了反而变大(story f15)或让出的被新问题接走(story f05):主角照样先动,接走份额的那件在“移位”一组里升上来,数字不变就不滚。

要动 D 现有行为的一处:回执跟着条目走,不随版本消失。下一轮整理后,进行中与结果的行、改写后的卡都带着上一版的回执(D 的大卡已有“你答过上一版”,行上还没有)。这符合“一条回应属于登记时的条目版本”:写的是“你答过上一版、Agent 已收到”,不冒充回答了新的一版。

3.5 手势 ​

手机没有悬停:轻点直接起作用,长按代替悬停。拨盘、脉冲在触屏上的“轻点一下就是悬停”不搬到 D,因为 D 的轻点必须能作答、能展开。

手势在哪对应 ix 标准动效时长
轻点按钮大卡、选项层、详情底部作答(D 专属)卡原地收成回执,下方一次补位0.72 秒
轻点“撤回”回执作答的逆逆序、更快0.40 秒
轻点卡或行大卡、折叠里的问题、进行中与结果、次要事项点击 → 展开详情外扩 8 px → 卡框长到全屏 → 内容淡入0.48 秒;收回 0.40 秒
长按 0.45 秒折叠里的问题、进行中与结果、次要事项、累计栏悬停 → 概要卡行外扩 8 px,其余降到七成,概要卡贴行下沿展开0.15 秒;收 0.12 秒
长按大卡三张大卡同轻点卡大卡本身就是概要,不另开概要卡同轻点卡
轻点“还有 N 件”“另有 N 项”折叠行展开折叠(D 专属)像通知叠层:一件件从行下滑出,叠边收起0.36 秒,每件错开 40 ms
左滑过 80 px进行中与结果的行知道了(D 专属)跟手;松手从当前位置收成“✓ 已知道”跟手;回弹 0.20 秒
下拉(内容已在顶部)详情、选项层Esc → 收回跟手缩回原位或下沉跟手;松手后按剩余比例走完 0.40 秒
左缘右滑详情Esc → 收回Safari 画返回,本页直接到终态系统
下拉、右滑首页不绑定只有 Safari 的回弹—

细则:

  • 长按。 按住 0.15 秒起这一行底色微微压暗,告诉你“在等”;移动超过 10 px 或开始滚动就取消;0.45 秒弹出,概要卡写 itemFacts 的同一组字段(来自哪条流、几份、本轮怎么变、本轮进了几条、开着的问题与期限)。松手后概要卡留着;点它或这一行就从这一行长出详情;点别处概要卡 0.12 秒淡出、行 0.10 秒落回、其余恢复亮度。
  • 展开详情(共享元素)。 0 切点,其余卡 0.15 秒降到七成;0–0.12 卡沿自己的框外扩 8 px(四边各 4 px,过冲 3.7%),阴影抬一档;0.12–0.36 卡框从它在列表里的位置长到全屏(圆角 20 → 0),题干作为锚点移到详情顶部(21 → 22 px);0.30–0.48 详情各节从锚点下方依次淡入、上移 6 px,作答区从屏底上来。收回:0–0.10 内容淡出,0.06–0.30 卡框缩回原位,0.30–0.40 外扩收回、其余恢复亮度。
  • 下拉收回跟手。 卡框按拖动比例往原位缩;松手时超过屏高四分之一或速度够快,就从当前比例接着收回,否则 0.20 秒弹回全屏。所有跟手的手势松手后都从当前位置和速度接着走,不跳回起点重放。

3.6 两层与约束 ​

  • 信息层(约 99%)。 英雄数字、说明行、大卡、折叠行、进行中与结果、次要事项、累计栏的字、回执。墨黑加朱红;朱红只给能作答的(按钮、“新问题”、“还有 N 件”前的圆点、24 小时内的期限),动画里朱红只描一次新问题;回执是墨色,失效是灰色。
  • 概念层(约 1%)。 只有累计栏左侧 54 × 48 px 的细纹。每轮整理落地的 0–0.40 秒向下收拢一次,收拢的纹距随本轮条数按对数取 1–3 个(54 条为 1、234 条为 3);没有输入的轮(story 的 f17、f27 两次 review)不动。只用灰,不出数字。它说的是“又有这么多被折进来了”,与脉冲的弧、拨盘的车道是同一件事,只占一角。
  • 绝不动。 英雄数字的位置与字号;状态栏;累计栏的位置;卡片排序规则。动画只表现 urgencyKey 排出的结果,不发明顺序。
  • 每个元素一次只走一段。 一次节拍里每个元素从旧位置到新位置只有一段运动,不先上后下、不折返;升首卡的放大并在同一次移动里。
  • 先后。 切点换字 → 你做过的先确认(回执)→ 英雄数字 → 离场 → 主角(你答的、失效的)→ 移位 → 进场 → 新问题描边。
  • 不提前。 下一轮整理落地之前,不动份额、回执不变实、答过的卡不离开大卡区。
  • 预算。 一次节拍同时动的元素不超过 10 个(两周的最大值),只动 transform 与 opacity,幽灵层同时不超过 3 个。

3.7 与 ix.mjs 共用什么,手机专属什么 ​

ix.mjs 正由另一处从拨盘与脉冲抽出,接口以它为准;D 需要它提供下面这些,并能换掉“弹出方向”和“连接”两块几何。

共用内容
节拍常量与缓动拨盘的 IX:pop 8 px、fadeIn 0.15、fadeOut 0.12、dim 0.15、grace 0.15 秒,out-cubic,过冲 3.7%;展开与收回三段的顺序。手机上三段的时长另给一组(下表),是否另给见待定问题 2
状态机与打断空闲 → 概要 → 展开 → 收回;开另一件先收回再展开;换轮、←/→、合页顶栏选帧时立即收起并照常执行;Esc、点空白、再点同一件收回;减少动态直接到终态
概要的字段dial-model.mjs 的 itemFacts,同一组字段、同一顺序
节拍守恒卡上的事实不早于它的节拍;D 上就是“已保存”与“已收到”分开
降暗其余降到七成
键盘Tab、Enter、空格、Esc 同义(D 已有)
脚本接口window.foldHome 用与 foldDial、foldPulse 同名同义的 hover / unhover / open / close / ixAt / paused,另加 answer(id, action)、undo(id),供第 6 步定格对照
拨盘 IX桌面D 手机理由
pop / popDur沿半径 8 px,0.3 秒沿自己的框外扩 8 px,0.12 秒列表的“外”是朝向读者;手指压在卡上,弹出大半被挡
line / lineDur0.4 秒起画引线,0.2 秒0.12 秒起卡框长到全屏,0.24 秒没有放引线的地方;最大的位移给最长的一段
card / cardDur0.6 秒起出详情卡,0.3 秒0.30 秒起内容淡入,0.18 秒内容只是淡入
fold / unline / drop0.2 / 0.15 / 0.2 秒0.10 / 0.24 / 0.10 秒同上;合计 0.40 秒,仍比展开快
resume0.4 秒后接着播不用D 不自己播;原型的回放在打开详情时已停

手机专属(不进 ix.mjs):手势识别(轻点与滚动的区分、长按 0.45 秒与 10 px 容差、横滑轴锁 8 px、下拉只在内容到顶时生效、左缘右滑走 history);列表编排(离场 → 主角 → 移位 → 进场、每个元素一段、FLIP 量位,以及没有滚动锚定时补 scrollTop);作答、回执跨版本、撤回与手指保护;跟手后从当前位置与速度续上;Safari 的性能纪律。另有一处要改别的页面:“去回答 →”现在只带帧号,第 4 步让它带上条目 id,D 落地时把那张卡描一次墨框(0.6 秒),首屏不演回来拍。

3.8 待定(2026-10-20 已定,见 4.1) ​

  1. 样张用哪一帧。 默认链接与拨盘落点都是 f26,但 f26 → f27 主水管被改写重登记,没有让位;f22 → f23 有真实作答、两周最大的让位。建议默认链接仍是 f26,第 6 步的定格对照用 f22 → f23;也可以把 D 的默认帧改成 f22。
  2. 手机上展开与收回的时长。 拨盘与脉冲是展开 0.9 秒、收回 0.55 秒;这里按 iOS 推入约半秒的手感定成 0.48 与 0.40 秒,三段顺序不变。要与桌面一致(宁慢也同一组数),还是接受手机一组?
  3. 让位要不要画成几何。 D 只用先后与字号表示份额,作答后的让位只能看到“卡沉成行”和份数翻牌;可以在累计栏加一条 2 px 高的 64 格细带(与腕上表圈、C 的预算带同一编码),整理落地时各段一次缩放、留白在尾端长出来(f23 是 0 → 25)。加,就多一种份额编码;不加,“让给了谁”在手机上只能读字。

4 动(motion) ​

4.1 评审定下的 ​

2026-10-20 评审对 3.8 与第 3 节的答复,实现照此:

  1. 默认帧仍是 f26;定格对照用 f22 → f23。
  2. 手机一组时长:展开 0.48 秒、收回 0.40 秒,三段顺序与桌面同一套。
  3. 累计栏加 2 px 高的 64 格细带,整理落地时各段一次缩放;不再加别的份额编码。
  4. 回执跟着条目走,不随版本消失。要修的两处:f22 作答 → f23 回执消失;f26 答主水管 → f27 数字 4 → 5 反弹。
  5. 换轮重排改成离场 → 移位 → 进场依次走,不再 0.36 秒一齐动;详情改成从点中的卡长出来,不从右边滑入。
  6. D 本身就是作答处,不加“去回答”;别的形式用 ?variant=d&frame= 链进来时落在那一帧,不自动演开场。
  7. 能共用的用 ix.mjs(概要卡、详情两节、IX 时序、键盘);长按、左滑、跟手收回这些手机专属的写在 D 自己的代码里。钩子 window.foldHome 与 foldDial 同名同义。
  8. Safari iOS 性能:只在合成线程上动 transform 与 opacity,不来回读写布局,clip-path 动画换成等价的 transform。用无头 Chrome 的手机模拟(iPhone 尺寸、触屏事件、CPU 4 倍降速)量 60 fps;真机 Safari 由用户看。
  9. 作答只存在内存里。Safari 的左缘后退与下拉刷新会丢掉它们,首页不绑这两种手势即可;不做持久化(契约未接纳),1.4 里“用 persistKey 存起来”作废。

4.2 文件与分工 ​

  • d-motion.mjs:只管“一组怎么动”:节拍表 BEATS、展开收回 GROW / SHRINK、长按 PRESS;同一个盒子换脸(morph:框、部件、旧脸)、揭开(reveal)、从折叠行滑出(slideFrom)、英雄数字滚一格(roll)、细带缩放(band)、细纹收拢(gather)。
  • d.mjs:编排(update → choreograph:谁在哪一组、什么时候动),作答、回执跨版本、撤回、手指保护,详情的长出、收回与下拉跟手,长按概要,左滑,历史,键盘,window.foldHome。
  • d.css:盒子三块、盖板、回执填实、细带、降暗、长按压暗、行抬起、左滑提示,以及 --ix-* 变量(概要卡与详情两节换成 D 的字体与纸色)。
  • 共用 ix.mjs:peekHTML(长按与 Tab 的概要卡,字段来自 itemFacts),detailHTML 里的“份额 · 逐轮”“本轮进了它”两节(只给根层事项),IX.resume(概要与详情收起 0.4 秒后接着播)。ix.css 由 d.mjs 用 <link> 载入,单文件导出能截住它换成内联样式。
  • shared.mjs 一处小改:?frame= 除了帧序号也认帧 id(f22、cold-01),两套数据都能用同一个地址落到同一帧。

4.3 实现的节拍表 ​

秒,从切点起,[起点, 时长]。与 3.2、3.4、3.5 的表一一对应,d-motion.mjs 里同名。

节拍回执 / 主角英雄数字离场移位进场(错开 40 ms,最多 8 个)其他
换轮 turn回执填实 0–0.30;主角 0.40–0.88,每个晚 0.06,换脸 0.64–0.880.40 起 0.260.40–0.640.48–0.80;换字 0.56–0.80,新部件 0.64–0.80,标签 0.80 翻0.60 起 0.36细纹 0–0.40;细带 0.40–0.88;新问题描红 0.96 起 1.6
作答 answer本卡:旧字淡出 0–0.12,盒子 0–0.20,回执 0.10–0.30,勾 0.12–0.300.200.36–0.600.20–0.52;折叠计数 0.36 翻0.36 起 0.36手指保护到 1.12
撤回 undo本卡 0.15–0.350.150–0.150.10–0.300.15 起 0.20
稍后 snooze本卡飞向“◷ N 件” 0–0.480.200.20–0.440.20–0.520.36 起 0.36
本地 local—00–0.240–0.320 起 0.36展开折叠、知道了、切换用途、改比较起点
手势时刻
轻点卡或行展开其余 0.15 秒降到七成;外扩 8 px 0–0.12;卡框长到全屏 0.12–0.36,题干锚点同段移到顶部;卡上原字 0.12–0.22 淡出;详情各节与作答区 0.30–0.48
收回内容 0–0.10 淡出;卡框 0.06–0.30 缩回;卡上原字 0.20–0.30 淡回;0.30 详情隐去,外扩 0.30–0.40 收回,其余同时恢复亮度
长按0.15 秒压暗 5 %;0.45 秒出概要卡,行外扩 8 px、抬成卡,0.15 秒;收 0.12 秒,行 0.10 秒落回
左滑跟手;松手过 80 px 从当前位置 0.20 秒回位并变灰,状态 0.32 秒翻成“✓ 已知道”;不过线 0.20 秒弹回
下拉(详情、选项层,内容到顶)跟手;松手超过 1/4 屏高或速度 > 0.5 px/ms 从当前比例接着收(剩余时长按比例,至少 45 %),否则 0.20 秒弹回

4.4 取舍 ​

  • 只动 transform 与 opacity。 圆角盒子变高变矮用三块拼:上盖与下盖只平移,中段只缩放,圆角不被拉扁;需要换外观(卡白 → 纸色、圆角 20 → 0)时两套盒子同步变形、交叉淡化。揭开不用 clip-path,改成一块纸色盖板向下沿 scaleY 收走。部件缩放的 transform-origin 写在元素样式上,不写进关键帧(写进关键帧会让这条动画留在主线程)。
  • 只在切点读布局。 一次节拍在重绘前量一次、重绘后量一次(各件与部件的位置、列表、细带宽度、“◷”的位置一起读),之后只写;每个叶子预先定位,z 序不用再读样式。Chrome 时间线里切点之后的整段动画没有一次样式重算或布局。
  • 旧脸跟着条目,不放全局幽灵层。 换脸时旧内容留在它所在列表的末尾、与条目同一层级,越过它的卡在上层时,旧字也被盖住;放在全局层,旧字会浮在一切之上(第一版就是这样:f23 落地时,待审 PR 的旧题干浮在正越过它下沉的母亲那张上面)。代价是 3.6 的“幽灵层同时不超过 3 个”没有守住:f22 → f23 同时有 6 个旧脸节点;它们只动不透明度与平移,4 倍降速下仍是 60 fps(6.1)。
  • 主角是“端着走”,不是“扔下去”。 主角的下沉改用缓入缓出,其余仍是不过冲的缓出:照缓出走,回执 0.1 秒就走完一半,0.48 秒才起步的补位前会空出一大片纸。两个主角同时下沉时先起步的在上层,回执在最上。
  • 字号变了、行数也变了的题干不硬缩放。 升首卡时题干 17.5 → 21 px;行数不变时照 3.2 纯缩放,不重排字;21 px 下多折一行时(f22 作答后母亲那张从两行变三行),缩放后的块与旧块对不上,会压到下一行,于是旧行骑到新位置、前 45 % 淡出,新行从旧尺寸放大、30 % 起淡入,仍在同一次移动里。题干换了字时只平移、交叉淡化,不缩放。
  • 回执按问题 id 认。 同一个问题重登记(f26 → f27 主水管,两轮都是 ask-23)仍是回执,不算“等你回应”,数字停在 4;问题关上后回执留成那一行下面的小字(“✓ 你选了「打给诊所」· 已收到”,措辞按当时的问题);问题被改写成另一个问题时,卡上写“你答过上一版”。上一轮开着、这一轮关上、没有任何回应指向它的问题,那一行下面写灰字“这个问题随改写失效”(f23 母亲那行)。
  • 回执填实:空心勾上叠一颗实心勾放大淡入(0–0.30),小字在切点就换成“已收到 · Agent 在 12:00 的整理中读到”,之后不再交叉淡化。
  • 详情从卡长出。 卡样与纸样两个盒子始终同一矩形,卡样在上、后半段淡成纸,框在任何时刻都不透明;题干与详情标题同字时才当锚点移到顶部,否则只淡入。收回时卡上原字整段淡回,题干不飞回。非嵌入页打开详情时 pushState,Safari 左缘右滑就是收回(本页直接到终态,不再演一遍);界面上收回时 history.back(),并把地址还原成收回后的那一个。嵌入(合页、单文件导出)不动历史。
  • 长按。 移动超过 10 px 或开始滚动即取消;长按大卡等于轻点(大卡就是概要);长按累计栏出本轮概要(本轮输入的采用、重复、噪音,空余份额)。长按松手后同一次触摸可能补发的点按吞掉(150 ms 内),不会落到概要卡上。
  • 左滑。 行只跟手平移,不再边走边变淡;“✓ 知道了”在行的右沿原地露出,灰色,过 80 px 变墨色。从屏幕右缘 16 px 内起手的不接(那是 Safari 的前进)。
  • 手指保护只拦点按(click 的 detail > 0),键盘照常;保护区是上一次按下点周围 32 px,自己的回执(撤回)不拦。
  • 滚动锚定自己做。 重绘前记下视口顶端第一件(或刚操作的那件)的位置,重绘后补 scrollTop;Chrome 自己的 overflow-anchor 关掉,与 Safari 一致。
  • 键盘。 Tab 到行出概要(与悬停同义);Enter 或空格打开详情(卡与行上的空格归它们,不是播放,与 ix 一致);Esc 依次收回选项层、比较起点菜单、概要、详情。重绘或收回后焦点回到原处时不再弹概要。
  • 链入落地即终态,只有新问题描一次朱红(3.2)。“去回答 →”带条目 id、落地描墨框(3.7 末尾)按评审 6 不做。
  • 连播。 长按、Tab 概要与详情会停住回放,都收起 0.4 秒后接着播(ix 的 resume;3.7 表里写的“不用”改为照 ix);作答会停住回放且不自动接着播,免得刚按的那件被下一轮卷走。

4.5 与故事的出入 ​

  • 3.4 3b 的变体“问题被改写重登记:数字 4 → 5 照实滚上去”不再成立:按评审 4,同一问题重登记时回执留着,数字不反弹;只有换成另一个问题(新的 ask id)才回到大卡并写“你答过上一版”。
  • 3.4 3a 说卡顶“猫看病 · 条目标题”一行不动:回执没有标签行,这一行随盒子上沿在 0.20 秒里上移一个标签行(约 26 px),不是完全不动。
  • 3.6 的“幽灵层同时不超过 3 个”没守住(f23 落地 6 个),理由见 4.4。
  • 1.4 的 persistKey 与“累计栏按 dvh 定位”都没做:前者按评审 9 作废;后者累计栏仍是 position: sticky,地址栏伸缩时会不会跳要在真机上看。

5 导(direct) ​

定格用 foldHome.ixAt(秒) 把在途的全部动画停在同一时刻,触屏手势用 CDP 的触屏事件真按;iPhone 尺寸 390 × 844、3 倍像素。截图只留在本机,不入库。

定格看什么
f21 → f22,0.62 秒猫看病已上移、题干放大,摘要在淡入;母亲那张的旧字在它下面淡去;小龙虾派对上收淡出
f22 按“打给诊所”,0.12 秒 / 0.40 秒卡原地收成回执、空心勾描出;0.40 秒数字已是 4,母亲那张在升首卡的路上,Ture 的 VAB 从折叠行滑出
f22 → f23,0.30 秒 / 0.62 秒 / 终态0.30 秒勾已填实、写“已收到”,列表没动;0.62 秒回执越过其余卡下沉;终态回执留在「Smilla已减量」那一行下面
长按猫看病那一行行抬成卡、其余降到七成,概要卡贴在行下沿
轻点待审 PR,0.08 / 0.24 / 0.48 秒外扩 8 px;卡框长到全屏,题干在去顶部的路上;详情到位
左滑 master CI 那一行 96 px,松手 0.10 秒,终态“✓ 知道了”露出并变墨色;回位;“✓ 已知道”

6 交付(ship) ​

6.1 性能 ​

无头 Chrome(打开 GPU),iPhone 390 × 844、3 倍像素、触屏,CPU 4 倍降速,composite 数据;每一拍从触发起量 requestAnimationFrame 间隔。sync 是切点上那一次同步工作(重绘、量位置、建动画)。

节拍sync ms帧数fpsp95 ms最长一帧 ms
回来 f21 → f22557857.816.767(切点)
答一件 f22365457.816.850(切点)
整理落地 f22 → f23(作答后)688457.216.883(切点)
问题重登记 f26 → f27(作答后)277959.216.833(切点)
轻点卡展开详情694356.016.867(切点)
收回详情22376016.816.8
展开“还有 N 件”27436016.716.8
撤回17436016.716.8
长按出概要卡0606016.816.8
左滑知道了(跟手 + 松手)0546016.716.7
详情下拉跟手收回0666016.816.8

每一拍唯一的长帧都在切点上(4 倍降速下 30–80 ms,不降速 5–15 ms),之后全程 16.7 ms 一帧。动画的起点在切点之后才定,切点卡一下只是整拍晚开始,不会跳帧。Chrome 时间线:切点之后没有样式重算与布局;动画里没有因为属性不能合成而留在主线程的,没合成的只有“没有可见变化”的那类(停在 0 透明度的保持段、隐藏着的旧脸)。展开详情的切点主要花在详情排版与把焦点移到“‹”。

6.2 检查 ​

  • node scripts/check-ix.mjs --only home:D 的触屏流程 23 项,两套数据都过。带 ?frame= 落地不演开场;长按出概要、点空白收起、移动取消、点概要卡长出详情、Esc 收回且焦点回到行;轻点卡长出详情、短下拉弹回、长下拉收回、‹ 收回;左滑 50 px 弹回、过 80 px 知道了;作答回执与数字减一、焦点到撤回、0.25 秒后同一处再点被手指保护拦住、撤回;连播中长按停住、→ 立即收起并换轮;Tab 出概要、Enter 打开、Esc 收回;换轮后回执跟着条目走、同一问题重登记不反弹。
  • 减少动态:作答、换轮、展开、收回都直接到终态,没有在途动画。
  • 单文件导出(scripts/export-all.mjs)里 D 照常:ix.css 被换成内联,作答、展开、长按概要都可用,不动历史。

6.3 只能在真机上核的 ​

  • ProMotion 机型上 Safari 网页是否真的只跑 60 Hz(1.4),以及 Web Inspector 时间线里各拍是否同样只在切点有长帧。
  • 长按:-webkit-touch-callout: none 之后 iOS 是否还会选字或弹放大镜;长按松手后 Safari 会不会补发点按(代码按会补发处理,150 ms 内吞掉)。
  • 详情下拉:第一下 touchmove 就 preventDefault,Safari 是否还会先起自己的回弹;固定定位的详情在地址栏伸缩时是否抖动。
  • 左缘右滑收回详情:Safari 画返回动画时本页直接到终态,两者是否叠在一起好看;详情关着时这一滑仍会离开本页并丢掉回应(评审 9 接受)。
  • 底部 position: sticky 的累计栏在地址栏伸缩时是否跳。
  • 左滑与纵向滚动的轴锁(8 px)在真手指下是否容易误判。