動態規範:讓每一個動作都在講「電話交給 AI 之後會發生什麼」
本文件說明電話AI 體驗頁各區塊的動態設計與實作參數,並收錄前端需要的字型、色彩、陰影與撥號規格。每一節先列出可直接套用的數值(時長、曲線、觸發、層級),再附一段可操作的動態示意;示意以 HTML/CSS 依結案設計稿重繪,數值與正式頁面一致,可作為開發與驗收的比對依據。
0 全站原則、token 與開發基礎所有區塊共用;後續各節只列出與此處不同的部分
整頁的動態很克制:會自己持續動的只有 Hero(波浪、撥號鈕光暈、周圍小元素)和功能區(手機畫面自動輪播、背景呼吸圓);其他地方都只在使用者捲動、hover 或點擊時才動一次。
| token | 值 | 用在哪裡 |
|---|---|---|
--dur-micro | 150ms | 顏色、透明度、小 icon 位移(hover 離開、fade out) |
--dur-short | 240ms | hover 進入、按鈕、箭頭旋轉、accordion、置底撥打列滑入 |
--dur-panel | 350ms | 桌機情境面板展開/切換 |
--dur-base | 400ms | 捲動進場、面板內容切換 |
--dur-sheet | 450ms | 手機情境滑入面板 |
--dur-long | 600ms | Hero 大件(圓形、手機)進場 |
--ease-out | cubic-bezier(.2,.8,.2,1) | 所有「進場/展開」。快出慢停,物件像被放下來 |
--ease-in | cubic-bezier(.4,0,1,1) | 所有「離場/收合」,時長用 micro |
--ease-sheet | cubic-bezier(.32,.72,0,1) | 僅用於手機情境滑入面板 |
--ease-pop | cubic-bezier(.34,1.56,.64,1) | 僅用於 Hero 浮動 icon 的彈出 |
--ease-ambient | ease-in-out,循環 | Hero 環境動態、功能區呼吸圓(白色波塊的橫向捲動為 linear) |
--reveal-y | 24px | 捲動進場的上移距離(手機 16px) |
--stagger | 80ms | 同一列並排物件的錯開;一列最多錯開 4 個,第 5 個起同時出現 |
字型
| 項目 | 規格 | 說明 |
|---|---|---|
| 字型堆疊 | font-family: Prompt, "Noto Sans TC", sans-serif; | 英數與電話號碼用 Prompt;中文用 Noto Sans TC。現行 demo 頁只寫 Prompt,中文會落到系統字,與設計稿不一致 |
色彩與陰影
| 項目 | 規格 | 說明 |
|---|---|---|
| 主按鈕 | 底 #F75748/hover #E04E41/框 #CF483C/字 #FFFFFF | 沿用貴司網站按鈕規範 |
| 主按鈕陰影 | box-shadow: 0 4px 14px rgba(247,87,72,.35); | 僅 Hero 主按鈕與手機置底撥打列;情境面板內的撥打 pill 不加 |
| 卡片陰影 E1 | 0 2px 4px rgba(74,52,40,.05), 0 12px 32px -6px rgba(74,52,40,.12) | 暖色兩層式陰影,卡片靜止狀態 |
| 卡片陰影 E2 | 0 4px 8px rgba(74,52,40,.06), 0 20px 48px -10px rgba(74,52,40,.18) | 浮起狀態(hover、active) |
| 示意表格色 | #7986CB(Google 日曆紫) | 情境 1–4 右側資料表格 |
電話與撥號
| 項目 | 規格 | 說明 |
|---|---|---|
| 手機撥打鈕 | tel:+886277515103,201(各情境改分機 202/203/204) | 逗號=暫停後自動撥分機,上線前請以 iOS/Android 實機測試 |
| 電腦版電話 | 純文字顯示,不做按鈕、無 hover | 電腦版訪客多半用手機手動撥打,文案為「接通後按 20X」 |
其他
- Google 日曆:以 Google Calendar iframe 嵌入;設計稿中的日曆為示意截圖。
- Header/Footer:沿用現行網站,不需重新開發;設計稿中為現行網站截圖。
- 數值如與 Zeplin 標註不一致,以 Zeplin 為準。
捲動進場(scroll reveal)規則
- 觸發:區塊頂端進入視窗 15% 時(
IntersectionObserver,rootMargin: 0 0 -15% 0),只觸發一次,往回捲不重播。 - 動作:
opacity 0→1+translateY(24px→0),--dur-base、--ease-out。 - 順序:區塊標題先,內容在 +120ms 後開始,同列物件再依
--stagger錯開。 - 靜止狀態必須完整:JS 沒載入時,所有內容直接顯示,不能留在
opacity:0。做法是html.js .reveal{opacity:0},而不是在元素上直接寫 0。
hover 規則(桌機)
- 可點的卡片:上浮 4px + 陰影由 E1 變 E2,
--dur-short進、--dur-micro出。 - 按鈕:上浮 2px + 底色換 Hover 色票(
#E04E41);按下scale(.98)。 - 電話號碼卡(PhoneCard、CTA 電話卡):沒有 hover,游標維持預設。號碼不是按鈕,目的是引導使用者拿起手機撥號。
1 Hero:波浪、撥號鈕光暈、周圍元素整頁環境動態最集中的區塊,分三個層級:波浪 → 撥號鈕 → 周圍元素
Hero 要讓使用者在 1 秒內讀到「電話正在被 AI 接起來」。視覺焦點依序是:底部緩慢流動的白色波浪(第一焦點,表達聲音在傳送)、手機上紅色撥號鈕的呼吸光暈(第二焦點,引導撥號)、周圍的小 icon 與光斑(第三層,最輕)。手機本體不動,號碼永遠清楚可讀。
1a 進場序列(頁面載入後自動播放一次)
| 物件 | 延遲 | 時長 | 動作 | 曲線 |
|---|---|---|---|---|
| 標籤 → 大標 → 副標 → ✓ → 按鈕 | 0 / 100 / 180 / 260 / 440ms | 500ms | opacity 0→1, translateY(16px→0) | ease-out |
| 灰色大圓 | 200ms | 600ms | opacity 0→1, scale(.9→1),之後接呼吸縮放(1b) | ease-out |
| 手機 | 300ms | 600ms | translateY(40px→0), rotate(-7°→-3°),落定角度依設計稿,之後靜止 | ease-out |
| 浮動 icon(對話、聲波、電話) | 500 / 580 / 660ms | 450ms | scale(.6→1),有一點過衝 | ease-pop |
| 「摘要已傳送給您」 | 900ms | 400ms | 由右往左 translateX(16px→0) + fade | ease-out |
整段 1.3 秒結束。文字先到、畫面後到:文字是訴求,畫面是證據。波浪從頁面載入即開始流動,其他環境動態在各自進場後接續。
1b 環境動態(持續循環,Hero 離開視窗時暫停)
| 物件 | 屬性 | 數值 | 週期/曲線 |
|---|---|---|---|
| 一、波浪(第一視覺焦點) | |||
| 白色實色波塊 | 填色 | 純白 #FFFFFF,從波峰填滿到底部 | — |
| 曲線 | 正弦波 y = 175 − 29 × sin(2π·x / 1116 + 2.1);振幅 29px、波長 1116px、起始相位 2.1(rad) | — | |
| 橫向捲動 | 往右,等速;每圈捲動距離剛好等於一個波長,因此無縫 | 41.6s/linear | |
| 位置 | 圖層距頂部 530px、高 260px,y 以圖層頂端為 0 | — | |
| 白線 | v1.4 起移除,Hero 波浪只保留白色實色波塊 | — | |
| 灰底漸層 | 漸層 | 高 300px,上方透明 → 下方淺灰(#E2DEDD → #D9D4D3) | 靜態,不動 |
| 二、手機 CTA 按鈕(第二焦點) | |||
| 紅色撥號鈕外圈光暈 | 縮放+透明度 | scale(.92 → 1.06),opacity .75 → 1 | 3.6s/ease-in-out |
| 三、周圍元素(第三層,最輕) | |||
| 黃色對話 icon | 浮動 | 上浮 6px;相位偏移 1.8s | 7.4s/ease-in-out |
| 藍色聲波 icon | 浮動+傾斜 | 上浮 5px,微傾 1.5°;相位偏移 5.1s | 9.2s/ease-in-out |
| 綠色電話 icon | 浮動+傾斜 | 上浮 7px,微傾 1.5°;相位偏移 3.3s | 8.3s/ease-in-out |
| 「摘要已傳送給您」泡泡 | 浮動 | 上浮 6px;相位偏移 6.7s | 10.2s/ease-in-out |
| 灰色大圓 | 縮放 | scale(.985 → 1.015) | 12s/ease-in-out |
| 右上淡紅光斑 | 縮放 | scale(.92 → 1.06) | 9s/ease-in-out |
| 頂部標籤小紅點 | 透明度 | opacity .35 → 1 | 2.4s/ease-in-out |
animation-direction: alternate(或 0%→50%→100% 關鍵影格)往返。四個周圍元素以負的 animation-delay(−1.8/−5.1/−3.3/−6.7s)錯開相位,載入後立刻在動、而且永遠不會同步。波浪請以 SVG path + JS 每幀重算 y(或 canvas)實作,不使用 Lottie 或 GIF:曲線需要隨版寬延展。1c 互動
- 「撥打體驗專線」:hover 上浮 2px、底色換 Hover 色,陰影維持主按鈕陰影;桌機點擊不另外做動態(按鈕的作用是把號碼突顯給使用者),手機點擊觸發
tel:。 - 「先聽一段通話」:點擊後 ▶ 變 ‖(
--dur-micro),按鈕內右側出現一組 3 條的小聲波(scaleY(.35↔1),0.9s 週期,三條錯開 150ms),文字改為「播放中」;再點一次或播完即回復。 - Hero 捲出視窗後,環境動態用
IntersectionObserver暫停(加.paused→animation-play-state: paused,波浪停止requestAnimationFrame),避免背景持續運算。
2 四大體驗與情境面板「電話響的時候,AI 幫你接起來」
四張卡是選單,下方的面板是內容。預設第一個情境(預約)展開;點其他卡就切換到該情境,一次只展開一張,面板永遠有一個情境打開。三角指標滑到被點的卡下方,面板內容先淡出再淡入,不做左右滑(四個情境沒有順序)。
隔天上班就在行事曆裡。
這些交給 AI 回答就好。
AI 當下就能回覆。
AI 替你營造專屬體驗。
| 狀態/動作 | 時長 | 規格 |
|---|---|---|
| 預設 | — | 情境 1「AI 幫你接預約的電話」為 active,面板已展開(頁面載入即是此狀態,不做展開動畫) |
| 進場(捲動) | 400ms | 標題先;四張卡依 80ms 錯開上移進場;面板在最後一張卡後 +120ms 進場 |
| 卡片靜止/hover | 240ms | 靜止陰影 E1;hover(非 active)上浮 4px + 陰影 E2;箭頭圓不動 |
| 點另一張卡 → 切換 | 350ms | 新卡變 active(維持上浮+E2,箭頭圓反白、rotate(180°),↓ 變 ↑),原 active 卡同時還原。三角指標 left 滑到新卡中心(350ms ease-out);舊內容 opacity→0(150ms ease-in)→ 換 DOM → 新內容 opacity→1(200ms ease-out)。面板高度不同時以 height 350ms 過渡,避免下方內容跳動 |
| 再點同一張 active | — | 不收合、不做事。面板永遠有一個情境打開 |
| 鍵盤 | — | 卡片可 Tab 聚焦、Enter/Space 切換;focus ring 用品牌紅 2px |
3 面板內:對話泡泡、日曆、FAQ、表單每個情境的右欄不一樣,左欄一樣
3a 左欄「撥通後,大家都這樣問」泡泡(四個情境共用)
可以改成週日中午嗎?
你們最晚可以預約到幾點?
- 觸發:面板展開或內容切換完成後 +200ms。
- 每顆泡泡:
opacity 0→1+translateX(-8px→0),350ms ease-out;三顆間隔 400ms。像有人一句一句在講。 - 不做打字機效果、不做「正在輸入」三點:這裡是客人問的句子,不是 AI 的回覆。
- 電話卡(PhoneCard)在泡泡之前就靜態存在,沒有動態、沒有 hover;電腦版號碼為純文字。
3b 右欄依情境
日曆以 Google Calendar iframe 嵌入,進場只做 reveal。設計稿中「電話AI體驗用」事件的彈入(scale(.9→1) + fade,300ms)僅適用於示意截圖版本;正式 iframe 內部無法加動態。事件與資料表格色為 #7986CB。
手機版(agenda view)同理,進場只做 reveal。
可以使用原本的電話號碼嗎?
點分類列展開:grid-template-rows: 0fr→1fr,240ms ease-out;▾ 旋轉 180°。同時只開一個,開新的時舊的先收(150ms)。進場時第一個分類預設展開。
清單列進場各錯開 60ms。展開的那個分類裡,三個商品的價格數字從 0 跑到實際金額(600ms,ease-out,只做一次),「本月特價中」「庫存 20 件」標籤在數字跑完後 fade in。數字用 font-variant-numeric: tabular-nums 才不會抖。
欄位 focus:外框 Neutral-100 → 品牌紅,150ms。按「登錄資料」:按鈕文字變「登錄中…」(對應「送出中」畫面),步驟條 ① → ② 的連線由左到右填滿(300ms),表單卡 fade out、確認卡 fade in(同第 2 節面板切換),最上方出現電話卡。右側白底說明框進場只做 reveal,不另外動。
4 從接聽到整理:手機固定,畫面自動輪播「從接聽到整理,AI 接手電話的完整流程」
左側四張功能卡跟著頁面往上捲,右側手機在這一區固定不動(sticky)。手機畫面平常自己慢慢輪播:通話錄音 → 通話摘要 → 訊息通知 → 回寫系統,再無縫接回第一張;頁面捲動時,哪一張灰色功能卡進到視窗中央,手機就切到對應的畫面,並從該張重新計時。灰色功能卡區塊捲到底,手機才解除固定,和後面的內容一起往下。手機背後的淡綠圓做呼吸縮放。
通話錄音示意
通話摘要示意
通話 1 分 12 秒
4 位・希望靠窗
不需要回電
訊息通知示意
姓名:田中先生
電話:0912-345-678
時間:9/19 19:00
人數:4 位・希望靠窗
查看通話摘要 ›
推播到 Google Chat
自動寫入系統
【通話摘要】
來電:0912-345-678
需求:訂位 9/19 19:00
人數:4 位・希望靠窗
處理:已排入行事曆
不用手動輸入
| 狀態/動作 | 時長 | 規格 |
|---|---|---|
| 進場 | 400ms | 區塊標題先;第一張功能卡與手機一起 reveal,其餘功能卡各自進入視窗時 reveal |
| 手機固定(sticky,電腦) | — | 手機欄 position: sticky,釘在視窗垂直中央。捲動到此區時手機固定不動,灰色功能卡區塊捲到底才一起往下 |
| 畫面自動輪播 | 4s + 0.6s | 每張停 4 秒、滑動 0.6 秒(translateX 整排移動,ease-out),一張共 4.6 秒。依序 通話錄音 → 通話摘要 → 訊息通知 → 回寫系統 |
| 無縫循環 | — | 第 4 張後面複製一張第 1 張;滑到複製張後,在 transition 結束時無動畫跳回真正的第 1 張,畫面永遠往左走,看不出接縫 |
| 捲動到功能卡 → 對應畫面(電腦) | 0.6s | 判定線為視窗垂直正中央(高度為視窗的 2%,比卡片間距窄,同一時間只會有一張卡經過)。哪一張功能卡經過判定線,手機畫面就滑到對應那張(同一條 0.6s ease-out),並從該張重新計時 4 秒。往下捲畫面向左移、往回捲向右移。以 IntersectionObserver 加 rootMargin: -49% 0 -49% 0 實作,不在 scroll 事件裡計算。功能卡 1–4 依序對應 通話錄音/通話摘要/訊息通知/回寫系統 |
| 快速捲動 | — | 連續跨過多張卡時,手機只切到最後停下的那張(transition 自然合併) |
| 功能卡 | — | 只做進場 reveal,本身不變色、沒有 hover 效果(設計稿四張卡同一底色) |
| 分頁點 dot | 240ms | 跟著畫面同步;點 dot 可直接切換,切換後從該張重新計時。手機畫面也可左右滑動 |
| 背景呼吸圓 | 3.5s | 手機背後淡綠圓 scale(1 ↔ 1.06),ease-in-out 循環 |
| 離開視窗 | — | 功能區不在視窗內時暫停輪播計時與呼吸圓 |
| 畫面內容 | — | 4 張畫面為示意假資料(見 Zeplin「Device/Phone 畫面輪播」) |
5 CTA、連結卡與回到頂部「即刻讓 AI 接手你的電話」「還想多了解一點?」
只有 reveal 進場。沒有 hover、沒有游標變化、號碼不可點(桌機,純文字)。號碼可反白複製即可。
卡片本身不 hover;只有右側膠囊按鈕有:
線上填寫需求 →hover 時白色圓圈往右 3px(250ms ease-out),底色不變;按下 scale(.98)。
hover:底色 白 → Surface/Warm-Light(200ms),黑色箭頭圓往右 4px。六張卡進場錯開 60ms、兩欄交錯(左1、右1、左2…)。
上方 40px 短線先由 0 寬長到 40(300ms),標題與副標接著 reveal。四個區塊標題都一樣,這條線是全頁的節奏記號。
Header
- Header/Footer 沿用現行網站,不需重新開發;以下行為若現行網站已有則維持。
- 捲動超過 80px:加
0 2px 12px / 6%陰影,200ms;往下捲不隱藏,使用者需要隨時找得到「聯絡我們」。
回到頂部按鈕(電腦版,畫面右下角)
| 狀態/動作 | 時長 | 規格 |
|---|---|---|
| 位置 | — | position: fixed,距右 40px、距下 40px。捲到頁尾時停在 Footer 上緣上方 40px,不蓋住 Footer 內容 |
| 外觀(依 Zeplin) | — | 60×60 圓角方塊,圓角 16px;底 #FFFFFF(Neutral/0)、框 1px #E8E8E8(Neutral/100)、陰影 E2;icon Icon/Filled/arrow_upward 24px、色 #525252。切圖:雲端「30_切版素材 › Icon」 |
| 出現時機 | — | Hero 整個捲出視窗後才出現;捲回 Hero 範圍內就隱藏。以 IntersectionObserver 觀察 Hero(或 Hero 底部的 sentinel),不用 scroll 事件 |
| 出現 | 240ms | opacity 0→1 + translateY(12px→0),ease-out |
| 隱藏 | 150ms | opacity 1→0 + translateY(0→12px),ease-in;隱藏後 pointer-events: none、visibility: hidden,不可被 Tab 聚焦 |
| hover | 240ms | 上浮 2px + 底色 白 → Surface/Warm-Light;離開 150ms |
| 按下 | 100ms | scale(.96) |
| 點擊 | — | window.scrollTo({ top: 0, behavior: 'smooth' });使用者開啟「減少動態」時直接跳回頂端。回到頂端後按鈕依出現規則自然隱藏,焦點移到頁首第一個可聚焦元素 |
| 手機版 | — | 不顯示;手機以置底撥打列為主(見第 6 節) |
6 手機版差異只列出與桌機不同的部分
| 區塊 | 手機版做法 |
|---|---|
| Hero | 依手機設計稿只有半支手機、沒有浮動 icon 與泡泡。動態為:撥號鈕外圈光暈(同桌機 3.6s)、頂部標籤小紅點(同桌機 2.4s)、灰色大圓呼吸(同桌機 12s)。手機設計稿 Hero 底部為平直收邊,沒有白色波浪。進場序列同桌機但省略 icon 那一段,整段 1.0s 結束。「撥打體驗專線」按下觸發 tel:+886277515103,201。 |
| 四大體驗 | 直向堆疊,進場不錯開(一次一張進視窗,錯開沒意義)。點「立即體驗」整寬空心按鈕 → 開情境滑入面板(下表)。按鈕按下:底色 Neutral-900、字反白 100ms,放開回復。 |
| 情境滑入面板 | 由下往上滑入 450ms,cubic-bezier(0.32, 0.72, 0, 1);背景遮罩 40%(同一時長淡入)。點遮罩、按 ✕、往下拖曳(超過 120px)皆可關閉,關閉 240ms ease-in。只有中段內容可捲動,標題列與底部撥打列固定。 |
| 置底撥打列 | Hero 的「撥打體驗專線」主按鈕捲出視窗上緣後,由下滑入(240ms ease-out);捲回頂端、主按鈕回到視窗內時隱藏(150ms ease-in);情境面板開啟時隱藏,關閉後恢復。用 IntersectionObserver 觀察 Hero 按鈕,不用 scroll 事件。內容:紅底「撥打體驗專線」(主按鈕陰影)+右側對話 icon;position: fixed; bottom: 0,頁面底部多留與撥打列等高的內距,避免遮住 Footer。 |
| 功能卡+手機畫面 | 手機在上、四張功能卡在下,不做捲動固定。手機畫面同桌機自動輪播(停 4s、滑 0.6s、無縫循環),可左右滑(scroll-snap);點功能卡或 dot 切換到對應畫面(手機沒有 hover,以點擊取代)。 |
| CTA | 「撥打諮詢專線」紅底按鈕:按下 scale(.98) + 底色 Hover 色;「線上填寫需求」白底空心:按下底色 Surface/Warm。兩顆都不做 hover(手機沒有 hover)。 |
| 連結卡 | 按下底色 Surface/Warm-Light,箭頭不動。 |
隔天上班就在行事曆裡
這些交給 AI 回答就好
AI 當下就能回覆
我想預約這週六晚上六點。
可以改成週日中午嗎?
你們最晚可以預約到幾點?
7 實作與驗收開發與驗收清單
CSS 變數(可直接套用)
:root{
--dur-micro:150ms; --dur-short:240ms; --dur-panel:350ms; --dur-base:400ms; --dur-sheet:450ms; --dur-long:600ms;
--ease-out:cubic-bezier(.2,.8,.2,1); --ease-in:cubic-bezier(.4,0,1,1);
--ease-sheet:cubic-bezier(.32,.72,0,1); --ease-pop:cubic-bezier(.34,1.56,.64,1);
--reveal-y:24px; --stagger:80ms;
--shadow-e1:0 2px 4px rgba(74,52,40,.05), 0 12px 32px -6px rgba(74,52,40,.12);
--shadow-e2:0 4px 8px rgba(74,52,40,.06), 0 20px 48px -10px rgba(74,52,40,.18);
--shadow-cta:0 4px 14px rgba(247,87,72,.35);
font-family:Prompt, "Noto Sans TC", sans-serif;
}
@media (max-width:767px){ :root{ --reveal-y:16px } }
/* 捲動進場:只有在 JS 可用時才先隱藏 */
html.js .reveal{ opacity:0; transform:translateY(var(--reveal-y)) }
html.js .reveal.in{ opacity:1; transform:none;
transition:opacity var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out);
transition-delay:calc(var(--i,0) * var(--stagger)) }
/* Hero 環境動態(週期=一個完整來回) */
@keyframes float{ 0%,100%{ transform:translateY(0) rotate(0) } 50%{ transform:translateY(calc(var(--y)*-1)) rotate(var(--r,0deg)) } }
.icon-chat { --y:6px; animation:float 7.4s ease-in-out -1.8s infinite }
.icon-wave { --y:5px; --r:1.5deg; animation:float 9.2s ease-in-out -5.1s infinite }
.icon-phone { --y:7px; --r:1.5deg; animation:float 8.3s ease-in-out -3.3s infinite }
.bubble-sent{ --y:6px; animation:float 10.2s ease-in-out -6.7s infinite }
.dial-halo { animation:halo 3.6s ease-in-out infinite alternate } /* scale .92→1.06, opacity .75→1 */
.hero-circle{ animation:breathe 12s ease-in-out infinite alternate } /* scale .985→1.015 */
.hero-glow { animation:pulse 9s ease-in-out infinite alternate } /* scale .92→1.06 */
.badge-dot { animation:blink 2.4s ease-in-out infinite alternate } /* opacity .35→1 */
/* Hero 波浪(每幀重算;t 以秒計,圖層 top:530px、height:260px) */
// 波塊:y = 175 − 29·sin(2π(x − 1116·t/41.6) / 1116 + 2.1) fill #FFF 至圖層底
/* 功能區:手機固定+自動輪播 */
.flow .phone-col{ position:sticky; top:calc(50vh - 198px) }
.flow .screens{ display:flex; transition:transform 600ms var(--ease-out) } /* 每張停 4000ms;功能卡進入視窗中央時切到對應畫面 */
.flow .bg-circle{ animation:breathe2 3.5s ease-in-out infinite alternate } /* scale 1→1.06 */
/* 手機情境面板 */
.sheet{ transition:transform var(--dur-sheet) var(--ease-sheet) }
.sheet-mask{ background:rgba(0,0,0,.4) }
驗收項目
- 只用
transform與opacity做動態(波浪除外,以 canvas/SVG 重繪);不要 animatetop/left/width/height/box-shadow(陰影用兩層疊 opacity 切換)。 - 任何時間截圖,頁面都要完整:不能有停在
opacity:0的區塊。關閉 JS 再捲動一次確認。 - Hero 與功能區離開視窗時環境動態要暫停(Performance 面板看不到持續的 style recalc)。
- 桌機 hover 規則不得套到觸控裝置:用
@media (hover:hover)包起來,避免手機點一下卡在 hover 態。 - 電話卡、CTA 電話卡:游標為預設箭頭、沒有任何 hover 變化、沒有
tel:(桌機)。手機撥打鈕的tel:分機以 iOS/Android 實機測試。 - 波浪:白色波塊每 41.6 秒回到同一位置,接縫處看不出跳動;任何一幀都不能碰到按鈕或手機。
- 功能區輪播從第 4 張接回第 1 張時方向不變、沒有倒退。
- 手機置底撥打列在情境面板開啟時隱藏、關閉後恢復。
- 功能區:捲動讓功能卡 1–4 進到視窗中央時,手機切到對應畫面;往回捲同樣成立。
- 回到頂部按鈕:Hero 捲出後才出現,隱藏時無法被點擊或 Tab 聚焦。
- 中文字型為 Noto Sans TC(檢查 Computed font 不是系統字)。