Skip to content

B 时间展开 · 动画记录:参考、数据、故事与交互 ​

状态:原型探索,2026-10-20。按第三轮的六步流程(reference → data → story → motion → direct → ship)重做 B 时间展开的动画与交互:第 1–3 节在任何东西动起来之前定下一个点、一个英雄数字和三拍,第 4 节是交互,第 5–7 节是实现的取舍、与故事的出入和验证。B 现在怎样承载信息、怎样作答见 temporal.md;范本是 回应时序(时间类:刻度上硬切、两只钟)与 D 手机首页(答一件少一件、回执跟着条目走)。页面只读同一份 scenario.mjs 回放,不加字段、不改契约;下面的数都由页面用同一推导现算,推算脚本只留在本机。

1 参考:B 现在怎么动 ​

B 的几何是三段:左边是最近 5 次(或全部)整理里每件事的份额带,中间一根是此刻的 64 份柱,右边是此刻之后的条带,期限画成刻度(12 小时、1 天、3 天、1 周、5 周的分段刻度,越近越宽),虚线是下一次整理。2026-10-15 的打磨给它加了 b-motion.mjs:换帧时只插值几何(位置、粗细、透明度),340 ms 一段,起步快、落点软,可以打断不跳。

时刻现在怎么动断在哪
换轮(←/→、选帧、播放每 5.6 秒)带、柱、标签、刻度在同一个 0.34 秒里一起插值;离开的前 34% 淡出、到来的 42% 以后淡入;份额数、“8 小时后”、标题与日期在第一帧就是终值没有先后:时间走了 12 小时这件事本身没有画出来,期限从 32 小时跳到 20 小时只是刻度平移了一下;数字比几何先到,眼睛不知道先看哪
期限过线已过期的期限在下一帧直接画在此刻线上,写“已过 N”看不到“它撞上此刻线”的那一刻,而这正是 B 要回答的“谁先到”
作答阅读区整块重绘,回执 260 ms 上浮;图上同时出现空心勾回应面板与回执不是同一个盒子;最近的期限有没有因此变远,图上不说
下一轮整理勾变实心、份额变化与其余换轮一起在 0.34 秒里发生不先确认你做过的,就让份额变了;看不出“因为答了,所以让出”
悬停与点击悬停只加强调;点击直接切阅读区没有概要卡,没有沿几何弹出的详情,与其他八个形式不是同一套

从时间类的范本搬什么。

要素出处B理由
时间本身是节拍来源回应时序:此刻线缓出走完 12 小时,在批次刻度上硬切搬,换参照系B 的条带以此刻为原点量时间,此刻线是读数头,不能挪:时间往前走,在 B 里就是此刻之后的一切朝此刻线流过来,下一次整理的虚线流到此刻线的那一刻就是切点。期限每轮近一段,越近走得越快(分段刻度),它撞上此刻线就是“到了”
数字只在节拍上动回应时序:240 每到刻度硬切加 12,不滚动搬英雄数字在切点之后 0.4 秒硬翻;期限过线也是节拍,它自己的数在过线那一刻翻成 0
离场 → 移位 → 进场,先确认你做过的D:0–0.4 回执填实,0.4 数字,0.40–0.64 离场,0.48–0.80 移位,0.60–0.96 进场,错开 40 ms搬原样的时间表,接在走完之后两个形式答的是同一件事,节拍一样,换形式时不用重新学
卡原地收成回执,下一轮读到了才让位D:答一件少一件;回执按问题认,跟着条目走搬B 的“卡”是阅读区里的回应面板与图上那一件的标签;份额在下一轮的回放里才变
一颗一条脉冲、回应时序:一粒灰点一条输入搬到概念层走完的那段时间里进来的每条输入,在它的时刻落到此刻线上;切点后采用的被吸进柱、其余淡掉
循环、一直动、暗底辉光拨盘、脉冲不搬B 是阅读与作答工具,静止是默认

概念层约两成,只在换轮的走与吸两段里出现。 一是走的时候条带上下沿的“时间纹”:每小时(一天内)、每 6 小时(三天内)、每天(五周内)一道 4 px 灰刻,跟着绝对时间往此刻线流;二是输入的灰点。两样都只用灰,不出字与数,用的是信息层同一条时间刻度与同一根 64 份柱;静止、悬停、展开时为零或压到四成,prefers-reduced-motion 时不画。

2 数据 ​

口径与 D、腕上一瞥、回应时序相同,数都由 engine.mjs 重放后现算:

量怎么算出处
期限开着的问题:ask.due_at,没有就取条目的 due_at;没有问题的条目用自己的 due_at(黑色刻度)temporal.mjs deadlinesOf;shared.mjs currentAsk
英雄数字此刻之后最近的一个“等你回”的期限还有几小时:当前层开着的问题里、本页没答(推后的到点之前也不算)、期限不早于此刻的那一个上一行加本页回执 latestRecord
本轮输入走过的那段时间里进来的输入,frames[i + 1].events,按 event.at 落点frame.events
让位相邻两帧根层 share 之差,留白 = 64 − root.usedrecords[i].state.root

composite(默认,Jonas 的两周,每 12 小时一轮) ​

英雄数字逐帧(小时;f00 没有问题):

帧英雄数字是谁
f0112“Smilla 约上兽医了吗?”(条目期限 8/3 23:59)
f02–f18216 → 24,每轮减 12“派对回几个人?”(8/12 23:59),排在最前面 17 轮
f194“Smilla 多吃了药:打诊所?”插到最前(条目期限 8/12 16:00);派对退到第二,12 小时
f2016同一件,条目期限被 Agent 挪到 8/13 16:00;派对与 Signe 的漫画在这一轮里过线
f214同上
f228同上,期限再挪到 8/14 08:00
f23–f25108、96、84“Signe 的同意书签了吗?”(8/18 23:59)
f26–f2834、22、10“主水管:挖开换还是免挖?”(8/17 10:00),两周结束“水管还没回”
  • 一轮里过线最多:f19 → f20 走过的 12 小时里三个期限撞上此刻线(16:00 猫看病、23:59 派对与 Signe 的漫画)。
  • 两周里唯一一次“英雄问题在下一轮被真实回答”的:f22 的“Smilla 多吃了药:打诊所?”(choose,按钮“打给诊所”是推荐项),8/14 08:02 你给诊所打了 6 分钟电话(feedback: {ask: ask-16, action: call, via: source},比条目期限晚 2 分钟)。下一轮 f23(12:00,旁白“打了诊所;母亲自己定了”)猫看病 24 → 12、母亲换水管 24 → 6(“母亲九月住哪?”随改写失效)、master CI 1 → 6,留白 0 → 25(root.used 64 → 39),两周最大的一次让位,与 D 的样张、拨盘的 largestSingleYield 是同一处。

样张三帧的数:

帧时刻本轮输入英雄数字此刻之后份额
f218/13 12:00974 小时(16:00)母亲九月住哪 36 小时;派对、漫画已过 12 小时猫看病 12
f228/14 00:001728 小时(08:00)母亲九月住哪 24 小时、同意书 120 小时;漫画已过 24 小时;派对撤下猫看病 24,留白 0
本页答“打给诊所”8/14 00:00—24 小时(母亲九月住哪)08:00 的期限变成空心,猫看病旁一个空心勾不变
f238/14 12:00115108 小时(同意书)母亲九月住哪的期限随问题消失猫看病 12、母亲 6、master CI 6,留白 25

story(手写情境,林苒的两周,不定时) ​

  • 英雄数字的样张由同一条规则选出:英雄问题是 choose 或 schedule、下一轮真实输入里回答了它(反馈带 ask)的帧;有几帧时取下一轮留白涨得最多的。composite 只有 f22;story 有 f04、f14、f25 三帧,留白分别 −3、+15、+1,取 f14。
  • f13(10/16 17:40):英雄 17 小时 20 分,“周六 11 点见妈妈,可以吗?”(条目期限 10/17 11:00)。
  • f14(21:20,走过 3 小时 40 分,4 条输入):13 小时 40 分。
  • 本页答“改时间”(真实回答的动作,10/17 09:32 在用户消息里):此刻之后不再有等你回的期限。
  • f15(10/17 10:00,走过 12 小时 40 分,3 条输入,旁白“陪妈妈改约周日11点,双方已确认”):同一件事登记了新问题(ask-21,期限 10/18 11:00),英雄 25 小时;份额 妈妈 12 → 24(答了反而变大)、试用 24 → 6、发布 12 → 3,留白 3 → 18。新问题出现时,回执留成“你答过上一版”。

3 故事 ​

论点:期限一个一个撞上此刻线;答掉最近的那一个,最近的期限才往后退。 份额说的是一件事多要紧,此刻之后的条带说的是它多急。时间每走一轮,所有期限都朝此刻线近一段,越近走得越快;最先撞上来的那一件就是该先答的那一件。在 B 里答掉它,最近的期限退到下一件;下一轮整理读到了你的回答,它才让出份额。

英雄数字:最近的一个等你回的期限还有几小时。 它就是此刻线到最近那枚朱红刻度之间的距离,图上用一条墨色细括号同时画出来:括号的长度就是这个数。

  • 位置在“此刻之后”那一栏的抬头,字高约 26 px,全页只有它这么大;旁边一行小字写是哪个问题、几点到期。
  • 走的时候括号跟着刻度缩短,数字不滚;切点后 0.4 秒硬翻成新一轮的值。它自己的期限在走的途中撞上此刻线时,数字当场翻成 0、写“到期”。
  • 本页作答后 0.20 秒硬翻成下一件的值,括号沿条带滑到下一件的刻度(换泳道时连纵向一起滑);没有下一件就写“此刻之后没有等你回的期限”,括号收回此刻线。

三拍(讲一遍时的样张;之后 ←/→、选帧、▶ 连播、合页顶栏选帧都按第 1、3 拍的同一张时间表走)

拍composite(story)发生什么英雄数字观众此刻
1 谁先到f21 → f22(f13 → f14)先静 0.6 秒。走 0.40 秒:此刻之后的一切朝此刻线流,时间纹跟着流,本轮 172 条输入在各自的时刻落成此刻线旁的灰点;16:00 那枚刻度撞上此刻线,数字翻成 0;下一次整理的虚线流到此刻线,切点:标题、日期、此刻的时刻一帧硬切。0–0.40 灰点被吸进柱(采用的)或淡掉;0.40 数字翻成 8;0.40–0.64 派对撤下;0.48–0.80 猫看病 12 → 24、期限沿条带滑到 08:00(Agent 挪了期限)、历史左移一格;0.60–0.96 #13572 进场;0.96 起新登记的问题描一圈朱红4 → 0 → 8时间走了半天,它到了;Agent 把期限挪到明早 8 点
2 答一件f22 本页(f14 本页)阅读区切到这一件,按“打给诊所”(story:“改时间”)。0–0.12 按钮淡出;0–0.20 回应面板原地收到回执的高度;0.10–0.30 回执淡入、空心勾描出;图上 08:00 的朱红刻度变空心,猫看病旁出现空心勾,标签写“✓ 已保存”;0.20 数字翻成 24,括号滑到母亲九月住哪的刻度;0.20–0.52 下面各节上移补位。份额不动8 → 24(story:13 小时 40 分 → 没有)答了,最急的退到下一件;还没让位
3 整理读到f22 → f23(f14 → f15)走 0.40 秒:空心的 08:00 刻度流进此刻线后淡掉(答在了它前面,不留“已过”),母亲那枚从 24 小时近到 12 小时,115 条输入落下;切点:旁白“打了诊所;母亲自己定了”。0–0.30 勾填实、回执写“已收到”;0.40 数字翻成 108;0.40–0.64 母亲九月住哪的期限随问题失效离场;0.48–0.80 猫看病 24 → 12、母亲换水管 24 → 6、master CI 1 → 6,留白 0 → 25 在柱底长出来;标签 0.80 落定时翻。回执留在猫看病这一件上(story:同一件登记了新问题,回执留成“你答过上一版”)24 → 108(story:没有 → 25)读到了,它才让出份额;下一个期限在四天半以后

composite 讲完约 7.5 秒,停在 f23,阅读区停在猫看病,回执可撤回。讲一遍替你按的那一下与你自己按的一样记在本页内存里。

两层。

  • 信息层(约八成,少、准、有出处,只在节拍上动):份额带、64 份柱、条带上的期限与你定的时间、标签、英雄数字与括号、回执。
  • 概念层(约两成,只用灰):走的时候的时间纹与输入灰点;切点后 0.4 秒内被吸进柱或淡掉。
  • 共用几何与数量:时间纹与灰点用的是条带同一条分段刻度,灰点数就是本轮输入数,被吸进柱的落在它所指事项的新份额那一格上。
  • 不打架:概念层不进标签栏与阅读区,悬停或展开时压到四成,任何时候最亮不超过份额带。

动起来之前的约束。

  • 绝不动:此刻线的位置、条带的分段刻度、64 份柱的位置;条目的排列规则(份额带按 stableOrder)。
  • 此刻只向前走:往回(←、选更早的帧)时一帧回到那一轮,几何 0.38 秒缓回,不倒放“走”;拖动滑块时只做 0.34 秒的几何插值,不走。
  • 每个元素一次节拍只走一段:走的时候只动此刻之后的东西;切点以后柱、带、标签、刻度各按离场、移位、进场走一段;被 Agent 挪了的期限在移位那一段沿条带滑过去。
  • 不提前:下一轮整理落地之前,份额不动、勾不变实、回执写“等下一轮整理”。
  • 打断不跳:任何时候换帧、作答、悬停,都从屏幕上此刻的样子起算。
  • 朱红的含义不变:只给登记了回应路径的问题与它的期限;你的回应是墨色。

4 交互 ​

与份额拨盘、整理脉冲同一套标准,共用 motion/ix.mjs,时序取它的 IX;这里只写 B 几何上的对应。

  • 悬停:份额带、64 份柱上的那一格、条带上的那一行与它的刻度、右侧标签都算;柱左侧 16 px 的空隙也按行命中(命中区放宽)。出概要卡,写期待与短问法(没有问题写条目标题)、“份额 24 / 64 · 本轮 12 → 24”、“问题开了 N 小时(K 轮)· 离期限 8 小时”、本轮进了几条输入、你在这件事上的回应;卡挂在柱的左侧、盖在历史上,不压这一件自己的那一行。其余降到七成,概念层降到四成;走到一半的节拍、▶ 连播与讲一遍都停在当前时刻;离开 0.15 秒宽限,卡 0.12 秒淡出,再过 0.4 秒接着走。卡上的数守节拍:切点之前写上一轮。
  • 展开:点击上面这些地方,或 Tab 到隐藏按钮后按 Enter。0 秒是切点:页头写“这一件 · 短名 · 此刻的时间”(B 的页头本来就按时间写,不另起轮次编号),阅读区切到这一件(kicker“这一件”),回应控件就在那里;0–0.3 秒这一件在 64 份柱上的那一格向左弹出 8 px(离开柱、朝它自己的历史,过冲 3.7%);0.4–0.6 秒引线从弹出的那一格沿它的份额带中线向左出去;0.6–0.9 秒详情卡从引线末端展开,盖在历史上。卡上:期限一节(问题、离期限、开了多久、登记几次)、份额逐轮、本轮进了它的输入、你的回应。B 能作答,卡上不放“去回答 →”,只写“在右栏作答”。
  • 收回:Esc、点空白、再点同一件;卡 0.2 秒收起、引线 0.15 秒缩回、那一格 0.2 秒落回,然后一帧切回页头与阅读区。换帧、连播与合页顶栏选帧立即收起。键盘:隐藏按钮放在“比较前后”之后;Enter 展开、焦点进卡,Esc 收回、焦点回到按钮。触屏:第一下悬停,第二下展开。
  • 自动讲一遍:只在顶层直接打开、地址不带 ?frame=、没有 referrer 时演一次;任意键或点按跳到终态(样张的下一轮,回执在,阅读区停在那一件);工具栏有“重演”。带帧地址、画廊、合页、体验站弹框与从别处链来都静止;prefers-reduced-motion 时不演,所有节拍直接到终态。
  • ▶ 连播:本页自己计时,每轮从切点起 5.6 秒,悬停与展开时停表;空格与按钮同义。
  • 钩子:window.foldB 与 foldDial 同名同义(hover / unhover / open / close / ixAt / paused / pointOf / ixState),另有 index、go(i)、play()、stop()、pick()、nearOf(名字, 像素)、at(秒)(把在途的节拍定在某一刻,供静帧)、answer(id, 动作)、undo(id)、tell()(重演)、skip()、settled()、perf。

5 动起来:怎样做的 ​

一个时钟。 b.mjs 只有一个 requestAnimationFrame 循环,依次推进过渡(b-motion.mjs 不再自己开帧)、ix.mjs 的卡、概念层、▶ 连播与讲一遍;什么都不动时循环停,任何输入或换帧把它叫醒。悬停与展开停住的是这一个时钟:走到一半的节拍、连播的 5.6 秒与讲一遍都停在原处,离开 0.55 秒后从停下的那一刻接着走。

换轮 = 走 + 节拍表(b-motion.mjs)。

段时长动什么换什么
走每 12 小时 0.40 秒,按跨度开方,0.18–0.9 秒只有带时刻的东西:期限、你定的时间、推后的到点、下一次整理的虚线、英雄括号,按各自的时刻在分段刻度上朝此刻线滑;概念层的时间纹与灰点期限过线的那一帧写“此刻到期”,是英雄就当场翻成 0;推后的事到点,标签描一圈墨色;你答过的那枚空心刻度过线后在走过的 1.5 小时里淡掉
切点 0一帧—标题、日期、状态号、输入数、帧选择、阅读区;卡上的数从这里起说新一轮
0–0.40概念层:采用的灰点被吸进柱,其余淡掉阅读区的回执由空心勾填实(0.3 秒)
0.40英雄数字硬翻
0.40–0.64 离场撤下的条目:柱收成一线、标签与刻度淡出
0.48–0.80 移位留下的:柱、带、标签、刻度、括号各走一段,期限被 Agent 挪了就沿条带滑过去;历史左移一格;留白在柱底长出
0.60–0.96 进场自上而下错开 40 ms,最多 8 件新来的:柱从中线长开、标签与刻度淡入;从小事里升出来的标签从小事那一行走上来
0.80 落定柱上的份数、标签的份数与期限、刻度说明、预算“39 / 64 份”
0.96本轮新登记了问题的标签描一圈朱红,1.6 秒退掉

往回、拖动滑块、展开小事、切范围、进出子层不走、不分拍:所有元素在一个窗里走(0.38、0.34、0.28、0.34、0.42 秒),字在切点换,与第二轮的过渡相同。任何时候被打断都从屏幕上此刻的样子起算,没放完的换字立即补上,所以字永远是最后一个目标的。

作答(同一张表的 answer,共 0.52 秒;撤回是 undo,0.35 秒)。阅读区里,回应面板在原处换成回执:底色盒 0.2 秒收到新高度,旧按钮 0.12 秒淡出,回执 0.10–0.30 秒淡入,下面各节 0.20–0.52 秒上移补位;图上 0.10 秒刻度变空心、标签写“✓ 已保存”、柱上出现空心勾,0.20 秒英雄数字翻到下一件、括号滑过去(换行时连纵向一起)。份额不动。下一轮整理的切点上回执写“已收到”、勾填实,0.80 秒份额才落到新值。

概念层是一张不接收指针的 canvas,叠在 64 份柱与条带上:时间纹是条带上下沿 4 px 的灰刻(一天内每小时、三天内每 6 小时、五周内每天),跟着走的时刻流;灰点一条输入一粒,落在此刻线右侧它所指事项那一行(没有指向或未采用的散在已用的高度里),切点后 0.4 秒内采用的横向被吸进柱、其余淡掉。只在一步一步往前走时画;悬停或展开时压到四成。

交互接 motion/ix.mjs:舞台是 .b-chart-layout;份额带、柱、条带的行与刻度、标签都带 data-id,柱左侧 16 px 的空隙按行命中。弹出是这一件在柱上的那一格(连同份数与问题的朱红缺口)向左平移 8 px;引线从弹出的那一格沿行中线向左出去到卡的近边;卡挂在柱左、盖在历史上,不压这一件的那一行。展开时 model.select 到这一件,阅读区 kicker 写“这一件 · 在这里作答”,收回时只撤销它自己选中的那一件。Esc 先收卡、不让壳层把这一下当作“回上层”。选中、键盘焦点与阅读区行悬停的强调也改成其余七成(第二轮是 0.22 / 0.3 / 0.45),与悬停同一个分量,英雄括号与别的期限在作答时仍看得清。

6 与故事的出入 ​

  • 英雄数字的字面。 一天以内带分钟(f22 作答后是“23 小时 59 分”,故事表里写的是 24),一天以上取整小时(f23 的 107 小时 59 分写“108 小时”)。期限多落在 23:59,取整会把“今天截止”说成“还有 24 小时”,所以一天以内不取整。
  • 朱红刻度的范围变了一点。 第二轮只有问题自己带 due_at 时画朱红,问题没有期限、用的是条目期限时画黑;现在只要条目上开着问题就画朱红,与英雄数字的口径一致(“Smilla 多吃了药”的 08:00 是条目期限,第二轮是黑的)。
  • 灰点的落点。 故事写“被吸进柱的落在它所指事项的新份额那一格上”;实现是落在它所指事项此刻那一行的高度、横向吸进柱,不再按新份额重排一次——0.4 秒里看不出差别,省一次布局。
  • 勾填实。 阅读区回执上的勾按 0.3 秒填实;图上柱里的那个勾在切点一帧变实心,没有单独的填充动画。
  • 讲一遍约 7.5 秒(时间表合计 7.35 秒,故事写约 8 秒):静 0.6 秒、走 0.4 + 节拍 1.0、停 0.7 秒后选中、1.3 秒后按“打给诊所”、1.7 秒后走到下一轮、节拍 1.2 秒后结束。只在作为 B 直接打开时演(壳层里从 A 切到 B 不演),每次载入至多一次;prefers-reduced-motion 时“重演”按钮也不出现。
  • 一次往前跨几轮(下拉选帧、点历史上的节点)时走完整段时间,按跨度开方、最长 0.9 秒,中间各轮不停;拖动滑块不走。
  • story 的下一轮:同一件登记了新问题时,阅读区在新问题的控件上方写“✓ 你答过上一版:你选了「改时间」(已收到)”,标签写“✓ 答过上一版”,刻度是实心的、英雄数字指向它(新问题还等你回)。这需要 temporal.mjs 的 createResponder().html() 多一个可选参数 previous,不传时行为与原来相同(C 不传)。
  • 概要卡与详情卡的编号按 B 页头的“第 i / 29 次整理”,不用拨盘的“第 i / 28 轮”;份额逐次从第 1 次画起。

7 验证 ​

1440×900 无头 Chrome,原型服务另起端口;数都是 2026-10-20 在这台机器上测的。

  • node scripts/check-ix.mjs --only b(两份数据各一次):16 / 16。悬停与展开用 f26(composite 挑主水管,story 挑英雄那一件,不在就挑最大的一段),连播从 f03 起;全部页面一起跑时其余各页也全过。
  • 节拍与讲一遍(window.foldB 驱动,本机脚本不入库):composite 直接打开在 f21 静 0.6 秒后走,16:00 那枚刻度过线时英雄数字当场是 0,切点后 0.4 秒翻成 8;作答后 0.2 秒翻成 23 小时 59 分;下一轮 0.4 秒翻成 108,0.8 秒预算 64 → 39、留白 25;结束停在 f23,阅读区停在猫看病、回执“已收到”。任意键跳到同一终态;带 referrer、带 ?frame=、合页里都静止。story 的样张由同一规则选出 f14(索引 16):13 小时 40 分 → 作答后“此刻之后没有等你回的期限” → 下一轮 25 小时,阅读区写“你答过上一版”,预算 46 / 64、留白 18。
  • prefers-reduced-motion:不讲、不出“重演”,换帧与作答 30 ms 内已是终值,概念层不画。
  • 60 fps(--enable-gpu,用 rAF 间隔量):换轮 f21→f22、f22→f23、f06→f07 各约 1.7 秒、103–104 帧,p95 16.8 ms,没有一帧超过 25 ms;每帧绘制平均 1.6–2.1 ms,最差 7.7 ms。作答、撤回各三次,没有一帧超过 25 ms(一次点击的同步开销约 13 ms)。悬停到展开 92 帧、讲一遍全程 542 帧,都没有超过 25 ms 的帧。
  • 小事展开后成员可悬停、可展开;进入子层(story 的发布方案)后同样可用,Esc 先收卡、第二下才回上层。390×844 触屏:第一下悬停、第二下展开,卡盖在图上。
  • node scripts/shoot-forms.mjs --only b,all --gpu --check all-sync(两份数据):无报错,合页逐节同步通过。
  • make check 通过;npm run site:build 通过;site/previews/b.webp 按 development.md 的参数(f26、is-embedded)重截。

没做的。 讲一遍替你按下的那一下记在本页内存里(与你自己按的一样,可撤回),重演时先撤掉它;你自己答过的不动。概念层没有为窄屏另做,390 px 宽时照样画,灰点更密。Safari 没有实际打开看过。