Hero 上移淡入
首页主标题/按钮同款:opacity + translateY,约 0.75~0.85s,缓动 --motion-ease-out-soft。
home.html · heroFadeUp
双层架构 · 梯度色板(原始)→ 语义色板(应用)
21 个色彩家族 亮色 / 暗色双模式 50+ 语义变量tokens/semantic.css 得到的引用链,直至 --palette-*
E100–E500 五档层级 · 随主题亮/暗自动切换 · 用于卡片、浮层、弹窗
Foundation Figma Elevation 亮/暗双模式与仓库内 tokens/shadows.css 中 Aboat 软阴影段落一致;可整块粘贴到你的样式表(例如包在 :root 中或按需调整选择器)。
引入 tokens/index.css(已含 tokens/shadows.css)后,使用 box-shadow: var(--shadow-elevation-100) 至 --shadow-elevation-500。
Aboat 软阴影:--shadow-aboat-soft-1 … --shadow-aboat-soft-6(L4 为插值)
默认字体 MiSans VF · 来源 Figma Text Styles(Large Title → Caption2)
紧凑视口(max-width ≤1512px,或高度 ≤900px 且宽度 ≥640px)下,typography-responsive.css 将各级 --text-* 字号与行高等效降一档;Caption 维持 10px / 13px。
与 Figma 映射一致,使用 --font-weight-* 或各样式的 --text-*-weight-*。
引入 tokens/index.css 后,页面默认使用 font-family: var(--font-family-sans)。标题/正文使用 font-size: var(--text-body-size); line-height: var(--text-body-line-height) 等 Token;粗细使用 font-weight: var(--text-title3-weight-semibold) 等。
小船品牌 Logo · 随主题亮/暗色自动适配文字色
Brand SVG 内联 --color-text-2引入 components/brand/logo.css 后,使用 class brand-logo,内层文字用 brand-logo__text 即可随主题切换颜色。
7 种变体 · 4 种交互状态 · 支持图标 · 亮色/暗色自适应
7 种变体 Hover / Click / Disabled 暗色模式浅底灰字,hover/click 叠加深色遮罩,按压 scale(0.96)。用于日历「上一月/今天/下一月」、编辑任务等。
32×32、圆角 8px;默认透明底,hover/active 在圆角方形内用 ::after 叠层,颜色见 --color-icon-button-hover-bg / --color-icon-button-pressed-bg。与 .btn 勿混用(高度冲突)。弹窗关闭加 modal-standard-header__close。
小船标准弹窗顶栏 · 与弹窗容器圆角衔接 · Figma 23193:48757 · 关闭图标 23190:42269
Title1 / Semibold text-3 标题色 16px 关闭图标btn-icon-ghost + 圆角 8px · hover 用 --color-icon-button-*互斥分段 Tab · 用于统计/筛选等「近两周 / 近一个月 / … / 自定义」场景;未选中约 36px 高 · Headline(--text-headline-*)· 默认 1px --color-btn-outline-border(若写成 transparent 会看不见);hover 加深为 --color-neutral-3;选中 .is-active 为 2px --color-progress-alpha-2 · 学习页见 learn.html
.range-segment--grid-5 固定 5 列等宽.is-active.range-segment__btn 同用;内嵌 chevron SVG--grid-5--text-headline-size · --text-headline-line-height · --text-headline-weight通栏(默认 .range-segment)
5 列等宽(.range-segment.range-segment--grid-5)
单行文本输入 .aboat-input 与单选图标 .aboat-radio;学习页设置弹窗、用户名编辑等已复用。
type="text" 等单行输入--color-neutral-5;聚焦 --color-progress-3 + 环 --color-progress-alpha-2img.aboat-radio__state,选中态由父级 .is-selected 控制透明度过渡assets/components/.settings-radio-card / .settings-time-card 联用当前产品内已落地的过渡与动画汇总 · Token 见 tokens/motion.css(由 tokens/index.css 引入)
prefers-reduced-motion: reduce 降级(缩短时长、去掉位移动画或改为淡入)
学习页统计弹窗、图表、老虎机等已在 learn.html 内做降级处理。
首页主标题/按钮同款:opacity + translateY,约 0.75~0.85s,缓动 --motion-ease-out-soft。
home.html · heroFadeUp
进入视区后自下浮入:较大位移 + 淡入,约 0.75s,用于区块/大卡片。
home.html · .reveal
仅透明度 0→1,约 --motion-duration-lg(0.45s),避免抢内容动效。
home.html · img.img-loaded
微上浮 + 阴影略增强,模拟主按钮可点反馈(时长约 0.35s)。
components/button.css
悬停时无限旋转,周期 0.8s linear,用于 Loading 状态。
components/button.css · btn-spin
缩小 + 下移 + 淡入,约 0.34s,接近统计弹窗内日期 Popover。
learn.html · stats-range-custom-popover-in
与产品一致:上移 --motion-distance-entrance-sm + 0.52s 淡入。
learn.html · stats-total-chart--entered
多根柱依次 opacity 拉起,每根约 0.05s 阶梯延迟。
learn.html · 柱图入场
stroke-dashoffset 拉线,缓动 --motion-ease-line-draw,时长接近图表折线。
learn.html · playStatsChartEnterAnimation
相对圆点固定在上方或下方,仅透明度 0→1(约 0.2s),无位移动画。
learn.html · stats-chart-tooltip
| 场景 | 效果摘要 | 参考 |
|---|---|---|
| 首页 Hero | 标题/按钮 heroFadeUp 约 0.85s;截图区 slideUpCenter 1s;功能卡 screenshotSlideUp 约 0.95s;均用 cubic-bezier(0.22, 1, 0.36, 1) | home.html |
| 滚动出场 | .reveal / .reveal-card:opacity + translateY,0.75s / 0.55s | home.html |
| 图片加载 | img 默认 opacity 0 → .img-loaded 淡入 0.45s | home.html |
| 弹性滚动 | WebKit 惯性 + overscroll-behavior,非 CSS 关键帧 | components/scroll-elastic.css |
| 按钮 | Hover 微位移 / 阴影 0.1~0.15s;加载圈 btn-spin 0.8s linear infinite | components/button.css |
| 全屏加载 | 整屏 --color-bg-app;小船 logo-icon 形 + currentColor/--color-brand;胶囊条轨道 --color-neutral-3、填充 --color-brand,宽约 360px、高 4px,aboat-full-page-loading-bar 呼吸动效(可减少动效静态约 48%)。Figma 19655-12494 | components/full-page-loading.css · full-page-loading.js · learn.html「开始学习」 |
| 弹窗遮罩 | .modal-overlay + 面板(如 .stats-modal / .message-modal)打开时可有过渡;关闭时透明度淡出(--modal-fade-duration),见 components/modal-instant-close.js · aboatModalLayer.applyClose | learn.html |
| 自定义日期浮层 | stats-range-custom-popover-in 0.34s;降级为纯淡入 0.2s | learn.html |
| 学习总时长老虎机 | 每位数字窗 stats-user-metric-reel-window-in 0.32s,错位 delay;条带 JS 滚动至目标值 | learn.html |
| 总体摘要数值跳动 | stats-overall-heading-tick 0.42s;切换时间范围时平均分钟数可缓动 | learn.html |
| 图表卡片入场 | --stats-entrance-duration 0.52s、--stats-entrance-y 14px;类 stats-total-chart--entered 与专项卡 stats-skill-cards--inview 联动 | learn.html |
| 图表内 SVG | 折线:clip 面积展开 ~1.08s、描边 dashoffset ~1.18s、数据点层 0.55s 淡入;柱图:各柱 opacity 错开 ~0.48s;hover 圆点放大 | learn.html JS playStatsChartEnterAnimation |
| 图表 Tooltip | 仅透明度显隐(约 0.2s);相对数据点置于上/下方,无入场位移 | learn.html |
| 设计系统文档页 | 侧栏/代码块等以 0.15~0.2s 过渡为主 | docs.css |
--motion-ease-out-soft,用于区块入场、弹层、Reveal。--motion-ease-line-draw 与较长时长。transition-delay 或 animation-delay 按序号递增(如 0.05s 步进)。Web Audio API 程序化合成 · 事件 ID 与 components/sfx.js 一致;主音量 --sfx-master-gain(tokens/sfx.css)。品牌向仪式感音效见 aboat.sfx.brand.*(奥德赛隐喻 · 非配乐短音),规则见 设计规则.md §1.1。
| 原则 | 说明 |
|---|---|
| 与动效一致 | 触发时机与 tokens/motion.css 语义对齐;系统「减少动态效果」开启时不播放。 |
| 可关闭 | <html data-sfx="off"> 全局静音;局部用 data-sfx="none"。 |
| 克制 | 高频操作(如每次按键)宜极轻或默认不绑音效,避免疲劳。 |
| 气质 | 偏清晰、温暖、不刺耳;可与品牌「进度」系情绪呼应(轻快确认感)。 |
| 品牌向 | 仪式感 / 背景气质用 aboat.sfx.brand.*;非旋律配乐,短音为主;长垫音仅草案、不宜默认自动播(见设计规则 §1.1)。 |
aboat.sfx.<类别>.<动作>,全小写,段间用 .。sfx-<类别>-<动作>.webm 或 .mp3,与资源目录约定一致即可。<!-- tokens/index.css 已含 sfx.css -->
<script src="./components/sfx.js"></script>
<script src="./components/sfx-behavior.js"></script>
<script src="./components/toast.js"></script>
sfx-behavior:按钮/链接 .btn、.range-segment__btn、.aboat-radio / .ds-radio-chip;类名含 modal-overlay 的遮罩在 is-open 切换时播放开/关。Toast 入场由 toast.js 调用 feedback.toast.in。
| 事件 ID | 触发场景 | 听感方向 | 建议时长 | 优先级 |
|---|---|---|---|---|
| aboat.sfx.ui.tap.primary | 主按钮、主要确认 | 短促、略饱满确认感 | ~50–120 ms | P0 |
| aboat.sfx.ui.tap.secondary | 次要、描边按钮 | 比主按钮更轻、更短 | ~40–80 ms | P1 |
| aboat.sfx.ui.tap.ghost | 图标 / 幽灵按钮 | 极轻、几乎无尾音 | ~30–60 ms | P1 |
| aboat.sfx.ui.tap.disabled | 不可点区域 | 闷、短否定感或触觉 | ~40–80 ms | P2 |
| aboat.sfx.ui.scroll.snap | 横向滚动吸附、滚轮刻度(如月历换月) | 轻短刻度;页面侧通常 每卡一声,用 playScrollSnapVelocity(px/s) 随速变调 | ~18–30 ms | P2 |
| 事件 ID | 触发场景 | 听感方向 | 建议时长 | 优先级 |
|---|---|---|---|---|
| aboat.sfx.ui.toggle.on | Switch / 复选开 | 上行感 | ~80–150 ms | P1 |
| aboat.sfx.ui.toggle.off | Switch / 复选关 | 温和落下,与 on 成对 | ~80–150 ms | P1 |
| aboat.sfx.ui.radio.select | 单选(.aboat-radio) | 轻点 + 极短共鸣 | ~60–100 ms | P1 |
| aboat.sfx.ui.segment.change | 时间范围分段、Tab | 轻滑咔嗒或软切换 | ~50–100 ms | P1 |
| 事件 ID | 触发场景 | 听感方向 | 建议时长 | 优先级 |
|---|---|---|---|---|
| aboat.sfx.form.focus | 输入框获焦(可选) | 极轻,或默认关闭 | ~30–60 ms | P2 |
| aboat.sfx.form.error | 校验失败 | 柔和警示 | ~150–300 ms | P1 |
| aboat.sfx.form.success | 字段级成功 | 短促正向叮 | ~80–150 ms | P2 |
| 事件 ID | 触发场景 | 听感方向 | 建议时长 | 优先级 |
|---|---|---|---|---|
| aboat.sfx.overlay.open | 模态打开 | 轻气声垫 | ~100–200 ms | P1 |
| aboat.sfx.overlay.close | 模态关闭 | 与 open 配对,略短更轻 | ~80–180 ms | P1 |
| aboat.sfx.nav.sheet.down | 底部表 / 抽屉拉出 | 低频轻滑入 | ~120–250 ms | P2 |
| aboat.sfx.nav.sheet.up | 抽屉收起 | 与 down 对称 | ~120–250 ms | P2 |
| aboat.sfx.nav.pop | 返回 / 出栈 | 轻退感 | ~80–150 ms | P2 |
| 事件 ID | 触发场景 | 听感方向 | 建议时长 | 优先级 |
|---|---|---|---|---|
| aboat.sfx.feedback.success | 操作成功 | 温暖短音、略上升 | ~150–350 ms | P0 |
| aboat.sfx.feedback.warning | 警告 Toast | 中性偏暖 | ~150–300 ms | P1 |
| aboat.sfx.feedback.error | 严重错误 | 可与 form.error 区分轻重 | ~150–350 ms | P1 |
| aboat.sfx.feedback.toast.in | Toast 入场 | 极轻垫音 | ~60–120 ms | P2 |
| aboat.sfx.feedback.toast.out | Toast 消失 | 通常静音 | — | P3 |
| 事件 ID | 触发场景 | 听感方向 | 建议时长 | 优先级 |
|---|---|---|---|---|
| aboat.sfx.time.wait.loop | 加载中循环 | play 仅单次脉冲(试听);真实循环用 startWaitLoop() / stopWaitLoop() | 单次~22 ms;循环间隔约 1.4 s | P3 |
| aboat.sfx.time.wait.end | 加载结束 | 轻落定或与 success 合并 | ~80–150 ms | P2 |
| 事件 ID | 触发场景 | 听感方向 | 建议时长 | 优先级 |
|---|---|---|---|---|
| aboat.sfx.learning.progress.tick | 进度条前进一格 | 极轻 tick | ~20–50 ms | P3 |
| aboat.sfx.learning.complete | 单课 / 单任务完成 | F 大三和弦分解(正弦 + 低通、慢步进),与阶段完成同系气质,非街机式爬音 | ~0.6–0.9 s | P2 |
| aboat.sfx.learning.streak | 连续打卡等里程碑 | 可分档 | 可变 | P3 |
与《奥德赛》漂泊—归乡隐喻一致:**自然向**(海水、港湾、海风、鸥鸣等程序化声景)与 **功能向短动机**(公有领域经典之极短片段 + 原创调式动机)并列;整体仍是 **西方史诗抽象 × AI 干净合成**,非完整配乐。下列为可试听草案,迭代时以产品为准。
| 事件 ID | 触发场景 | 听感方向 | 建议时长 | 优先级 |
|---|---|---|---|---|
| aboat.sfx.brand.session.arrive | 登录成功 / 进入学习会话 | 极轻风噪垫 + 低音区纯五度(正弦、慢起音)— 偏沉静入港,非「升级」高光 | ~500–700 ms | P2 |
| aboat.sfx.brand.phase.complete | 完成一阶段训练 / 大里程碑 | 大三和弦慢速分解(正弦、低动态)— 沉淀感,非街机式通关铃 | ~650–900 ms | P2 |
| aboat.sfx.brand.beacon.ping | 关键节点提示 / 「灯塔」式轻指引 | 中音区下行滑音、较长尾音 — 远处信号、柔化 | ~150–260 ms | P3 |
| aboat.sfx.brand.chapter.turn | 章节切换 / 叙事转折 | 中低音下行扫频 + 极轻中频点(非明亮叮声) | ~170–260 ms | P3 |
| aboat.sfx.brand.ambient.sea.draft | 海面 / 远海气质垫(草案) | 极低 + 风噪垫 — 非循环、约 2.2s | ~2.2 s | P3 |
| aboat.sfx.brand.ambient.waves.draft | 海浪拍岸(草案) | 多段浪涌 + 低频涌动 | ~1.7 s | P3 |
| aboat.sfx.brand.ambient.harbor.draft | 港湾 / 系泊(草案) | 中频空间 + 码头低频脉冲 | ~2.1 s | P3 |
| aboat.sfx.brand.ambient.breeze.draft | 轻海风垫(草案) | 偏高、薄风噪 | ~1.5 s | P3 |
| aboat.sfx.brand.ambient.gull.draft | 海鸥啼(草案) | 两声短啼 | ~0.5 s | P3 |
| aboat.sfx.brand.motif.ode.draft | 正向反馈 / 大里程碑(可选) | 贝多芬《欢乐颂》首句前四音 — 公有领域;正弦 + 低通、慢步进(弱化街机感) | ~0.75–0.85 s | P3 |
| aboat.sfx.brand.motif.furelise.draft | 轻量正向 / 发现(可选) | 贝多芬《致爱丽丝》:第一小节止(交替 + B–D–C–A),不进入第二句 — 公有领域;柔化步进 | ~1.0–1.1 s | P3 |
| aboat.sfx.brand.motif.twinkle.draft | 温和提示 / 儿童向(可选) | 传统儿歌《小星星》首句前四音 — 公有领域;柔化 | ~0.7–0.8 s | P3 |
| aboat.sfx.brand.motif.fate.draft | 强调 / 转折(慎用) | 贝多芬《第五交响曲》「命运」动机前四音 — 公有领域;略放慢 | ~0.65–0.75 s | P3 |
| aboat.sfx.brand.motif.amazing.draft | 沉静 / 回顾(可选) | 《奇异恩典》首句前四音 — 公有领域;慢步进 | ~0.8–0.95 s | P3 |
| aboat.sfx.brand.motif.voyage.draft | 旅途 / 小节完成(可选) | 原创多利亚四音上行 — 品牌独有;柔化、慢于旧版 | ~0.55–0.65 s | P3 |
迭代时可在内部文档为每条补充:保留 / 删除 / 合并;是否与动效 Token 对齐(如 --motion-duration-*);默认是否开启(P0 主路径建议默认开,P3 默认关)。
试听区已 data-sfx="none",避免与全局点击音叠加。全产品默认音量由 tokens/sfx.css 的 --sfx-master-gain 决定;下方滑块与 sfx.js 每次播放前读取同一变量(试听满意后请把数值写回该 Token)。月历等横向滑动请用 aboatSfx.playScrollSnapVelocity(速度px/s):学习页月历为每换一张卡片(月份索引变化)响一声,音色仍随当时速度变化;设计系统内试听 scroll.snap 为中等速度示例。
顶部居中弹出 · 4 种状态 · 自动消失 · 来源 Figma 17015:15431 / 17015:14609
| 属性 | 值 |
|---|---|
| 背景 | var(--color-card-4) 纯白 |
| 圆角 | 24px(胶囊型) |
| 内边距 | 8px 16px 8px 9px |
| 图标间距 | 8px |
| 图标尺寸 | 24 × 24px |
| 文字 | var(--text-title3-size) · Regular · var(--color-text-2) |
| 阴影 | var(--shadow-elevation-500) |
| 位置 | fixed · top: 20px · left: 50% · translateX(-50%) |
| 默认时长 | 1600ms 自动消失 |
| type | 图标 | Figma 对应 | 使用场景 |
|---|---|---|---|
success |
check_circle |
复制、保存、操作成功 | |
info |
info |
中性信息、状态同步 | |
warning |
report_problem |
网络不稳定、注意提示 | |
error |
dangerous |
复制失败、操作出错 |
/* 1. 引入 CSS + JS */
<link rel="stylesheet" href="./components/toast.css">
<script src="./components/toast.js"></script>
/* 2. 调用 */
window.showToast('复制成功'); // success,1600ms
window.showToast('已同步到云端', 'info');
window.showToast('网络连接不稳定', 'warning', 4000);
window.showToast('操作失败,请重试', 'error');
32px 圆底 · 18×18 线型 · 与 Figma 14933:4904 规格一致;矢量命名与资源总表 11:490 对齐。
assets/icons/skills/*.svg(阅读 book-02、写作 pencil-02、口语 message-text-01、听力 headphones、综合 atom)<!-- 引入样式 -->
<link rel="stylesheet" href="./components/task-skill-icon.css">
<!-- 容器类名:reading | writing | speaking | listening | comprehensive -->
<span class="task-card-icon reading" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18" fill="none">…</svg>
</span>
/* 路径与 assets/icons/skills/book-02.svg 等同;内联 svg 才能使 currentColor 吃到专项 token */