CH.07 · 財金程式設計互動教材

金融網站 UI、RWD、SEO 與流量分析

網站上線只是起點——把導覽整理成六個分類、讓手機也能順暢操作、讓搜尋引擎找得到、讓你知道使用者真的有沒有在用工具。

UI → RWD → SEO → 分析

本章學習目標

  • 規劃六個主分類的導覽架構,做出桌面/手機雙模式選單
  • 用 RWD 讓工具卡片在不同裝置自動改變欄數
  • 完成 title、meta description、OG、sitemap 等 SEO 設定
  • 理解 GA4 事件追蹤,並知道什麼資料絕對不能傳送

01UI、UX 與資訊架構

第六章已完成 GitHub 版本控制與 Cloudflare Pages 部署,網站現在可以透過公開網址讓其他人使用。然而,網站能夠上線,不代表網站已經成熟——若沒有清楚的分類與導覽,使用者可能找不到工具;若只在桌面正常顯示,手機使用者可能無法操作;若沒有正確設定 SEO,內容充實也可能長期無法被搜尋到;若沒有流量分析,管理者無法知道哪些工具真正有人使用。

概念包含範圍核心關注
UI 使用者介面
使用者直接看到與操作的元件
導覽列與下拉選單、按鈕、輸入欄位、卡片與表格、色彩、字體、圖示、圖表畫面是否清楚、元件是否一致、操作是否直觀
UX 使用者體驗
使用者完成任務的整體感受
找到工具是否容易、輸入後結果是否清楚、錯誤訊息是否有幫助、手機上是否順暢操作使用者從進入網站到完成目標的整個過程
資訊架構 IA
網站內容的分類、命名與層級
導覽分類決策、哪些內容在首頁、下拉選單層級、頁面之間的關聯使用者是否能找到所需內容,系統是否有邏輯
i

常見誤解:UI 好看不代表 UX 好。一個設計美觀但使用者找不到入口的網站,UX 評分仍低。金融網站更需要注意:計算結果若沒有清楚解析,使用者無法判斷數字意義,UX 仍然失敗。

02金融網站的主要使用者類型

使用者類型主要需求設計對應
學生考照題庫、課程講義、互動測驗、複利計算明顯的「開始學習」入口,題庫分類清楚
金融從業人員金融科技新知、AI 案例、永續金融、法規文章文章分類完整,支援關鍵字搜尋
一般投資人複利試算、債券評價、退休規劃、風險分析工具卡片直覺,計算結果有解析
教師/創作者教材、題庫、案例、可嵌入工具提供下載或嵌入功能,授權說明清楚
i

網站架構應同時考慮不同使用者的入口路徑。若只為一種使用者設計,其他族群可能找不到所需內容。可在首頁提供多個明確的「開始點」,讓不同使用者快速分流。

03金融網站導覽架構設計

反面教材:十五個項目的導覽列

首頁、文章、AI、ESG、金融科技、考照、書籍、Podcast、
影片、遊戲、債券、股票、選擇權、退休、關於

問題:
→ 手機版需左右滑動
→ 使用者無法判斷哪個分類包含所需內容
→ 重要入口不突出(債券和書籍同層)
→ 視覺上造成認知負擔

建議主導覽架構(六個分類)

主導覽下拉子項目設計說明
首頁(無下拉)平台定位、核心入口、熱門工具
學習專區最新文章、學習影片、PDF 與 PPT 講義可以廣泛,重要性次於工具
金融考照CFP/AFP、模擬考題、互動測驗、題庫解鎖證照是核心流量入口,需獨立分類
金融工具複利試算、時間價值、債券評價、股票分析本書 1–5 章的核心工具
閱讀與影音書籍、文學作品、Podcast、影劇作品閱讀相關,低頻但高價值
關於與合作平台介紹、作者介紹、課程合作、聯絡放末尾,低頻使用

首頁四層內容架構

層次內容目的
第一層:定位平台標語、核心說明文字讓使用者 3 秒內知道這是什麼網站
第二層:入口「開始學習」「練習考題」「使用金融工具」三個按鈕依使用者類型快速分流
第三層:熱門最新 3–6 篇文章、熱門 3 個工具、精選書籍與題庫展示核心內容,降低跳出率
第四層:信任平台特色、適合讀者、作者簡介、訂閱入口建立信任,引導訂閱或深入使用

04建立金融網站導覽列

程式區塊導覽列 HTML 結構(節錄)
<header class="site-header">
  <div class="header-container">
    <a href="index.html" class="site-logo" aria-label="金融知識平台首頁">金融知識平台</a>

    <!-- 手機版選單按鈕(桌面隱藏,手機顯示)-->
    <button type="button" id="menuButton" class="menu-button"
            aria-expanded="false" aria-controls="mainNavigation">選單</button>

    <nav id="mainNavigation" class="main-navigation" aria-label="主要導覽">
      <a href="index.html">首頁</a>

      <!-- 有下拉選單的分類 -->
      <div class="nav-group">
        <button type="button" class="nav-group-button" aria-expanded="false">學習專區</button>
        <div class="dropdown-menu">
          <a href="articles.html">最新文章</a>
          <a href="videos.html">學習影片</a>
        </div>
      </div>

      <a href="exam.html">金融考照</a>
      <a href="books.html">閱讀與影音</a>
      <a href="about.html">關於與合作</a>
    </nav>
  </div>
</header>

CSS:桌面下拉選單 + 手機收合

/* ── 頁首底色與位置 ─────────────────── */
.site-header {
  position: sticky;   /* 頁面捲動時固定在頂部 */
  top: 0;
  z-index: 1000;      /* 確保在其他內容上方 */
  background: #ffffff;
  border-bottom: 1px solid #d9e1e8;
}

/* ── 下拉選單(桌面版) ─────────────── */
.nav-group { position: relative; }
.dropdown-menu {
  position: absolute; top: calc(100% + 12px); left: 0;
  min-width: 210px; padding: 10px;
  display: none;   /* 預設隱藏 */
  border: 1px solid #d9e1e8; border-radius: 10px;
  background: #ffffff; box-shadow: 0 10px 30px rgba(0,0,0,0.10);
}
.nav-group:hover .dropdown-menu,
.nav-group:focus-within .dropdown-menu { display: grid; }

/* ── 手機選單按鈕(桌面隱藏)────────── */
.menu-button { display: none; min-height: 44px; padding: 8px 14px; }

/* ── RWD 斷點:860px 以下改為手機版 ─── */
@media (max-width: 860px) {
  .menu-button { display: inline-flex; align-items: center; }
  .main-navigation { width: 100%; display: none; flex-direction: column; }
  .main-navigation.open { display: flex; }  /* 展開 */
  .dropdown-menu {
    position: static;   /* 手機版下拉改為正常流 */
    display: grid;      /* 手機版直接展開 */
    border: none; box-shadow: none; background: transparent;
  }
}

JavaScript:手機選單開關

"use strict";

const menuButton = document.getElementById('menuButton');
const mainNavigation = document.getElementById('mainNavigation');

menuButton.addEventListener('click', function () {
  // classList.toggle:有 'open' 就移除,沒有就加入
  const isOpen = mainNavigation.classList.toggle('open');

  // 更新 aria-expanded 讓輔助科技知道選單狀態
  menuButton.setAttribute('aria-expanded', String(isOpen));
});
技術細節說明
position: sticky頁首固定在頁面頂部,不隨捲動消失
z-index: 1000確保導覽列在所有內容上方(含下拉選單)
focus-within鍵盤使用者 Tab 進入 nav-group 時也能打開下拉
aria-expanded輔助科技(螢幕閱讀器)可讀取選單目前是否展開
classList.toggle一個方法同時處理展開與收合(不需 if/else)

05金融工具卡片設計

卡片應包含的五個元素

元素說明HTML 對應
工具分類標籤如「理財規劃」「固定收益」<p class='tool-category'>
工具名稱清楚描述工具的標題<h3>複利終值計算器</h3>
一行說明告訴使用者可以得到什麼結果<p>輸入本金...試算資產成長。</p>
行動按鈕導向工具頁面<a class='tool-link'>開始試算</a>
視覺層級按鈕永遠置底flex-direction: column + margin-top: auto
<article class="tool-card">
  <p class="tool-category">理財規劃</p>
  <h3>複利終值計算器</h3>
  <p>輸入本金、報酬率與年數,試算資產長期成長結果。</p>
  <a href="index.html" class="tool-link">開始試算</a>
</article>
.tool-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr)); /* 桌面:3欄 */
  gap: 22px;
}
.tool-card { display: flex; flex-direction: column; padding: 24px;
  border: 1px solid #d9e1e8; border-radius: 14px; }
.tool-link {
  margin-top: auto;   /* 按鈕永遠對齊卡片底部 */
  min-height: 46px;   /* ≥ 44px 保障手機點擊範圍 */
}

/* ── 平板(900px 以下):2 欄 ─────── */
@media (max-width: 900px) { .tool-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
/* ── 手機(620px 以下):1 欄 ─────── */
@media (max-width: 620px) { .tool-grid { grid-template-columns: 1fr; } }

06RWD 響應式網頁設計

設定程式碼作用
Viewport meta<meta name="viewport" content="width=device-width, initial-scale=1.0">告訴手機瀏覽器依裝置寬度顯示,不縮小成桌面版
Media Query@media (max-width: 700px) {...}螢幕寬度 ≤ 700px 時套用額外 CSS 規則
相對單位width: min(1180px, 92%)不使用固定像素,版面自動縮放

常見 RWD 斷點參考

寬度範圍裝置本書主要調整
1200px 以上大型桌面電腦正常顯示(3 欄工具卡、完整導覽)
900–1199px一般桌面、大型平板工具卡片改 2 欄
619px 以下手機工具卡片改 1 欄、導覽收合、表單 1 欄

手機版金融表格處理——金融網站常有債券資料表、題庫表格等複雜表格,在手機上無法完整顯示:

/* HTML:table 外層加 wrapper */
<div class="table-wrapper">
  <table>...</table>
</div>

/* CSS */
.table-wrapper { overflow-x: auto; }
table { min-width: 720px; } /* 確保表格不擠壓 */
i

手機版按鈕最小高度應為 44px(Apple HIG 與 Google Material 的建議標準),確保手指點擊不易誤觸。

07SEO 搜尋引擎最佳化

SEO 的目的是讓搜尋引擎找到網站、理解內容、建立索引,並在適當搜尋情境中呈現頁面。SEO 不是保證排名第一,也不是大量塞入關鍵字。

SEO 三個層次

技術 SEO內容 SEO使用體驗
網站可正常開啟、HTTPS、手機版、robots.txt、sitemap.xml、頁面速度、內部連結無失效每頁不同 title、meta description 具體、標題層級清楚、內容回答真實問題、關鍵字自然、lastmod 正確導覽清楚、易讀、手機操作正常、無失效連結、工具有清楚解析、內容可信、能自然延伸閱讀
i

三個層次同等重要。技術 SEO 是地基,沒做好會讓爬蟲找不到頁面;內容 SEO 是主體,好內容才有排名機會;使用體驗是衡量標準,Google 越來越重視 Core Web Vitals 等使用體驗指標。

08title 與 meta description

頁面建議 title不好的寫法
首頁金融知識平台|考照題庫、金融工具與投資教材金融知識平台
複利計算複利終值計算器|本金、報酬率與投資年數試算計算器
債券資料庫債券資料庫|票面利率、信用評等與到期年限金融知識平台

title 設計原則——準確描述頁面主題、每頁不同、重要主題放前面、不要堆疊關鍵字、可在末尾加入品牌名稱。

meta description 設計原則——概括頁面(約 120–160 字)、鼓勵點擊、不完全相同、自然包含主題、不保證顯示(搜尋引擎可能自動選用其他文字)。

09Canonical 與 Open Graph 設定

若同一內容有多個網址(如 pages.dev 與自有網域),可用 canonical 告訴搜尋引擎主要版本,避免被判定為重複內容。當連結分享到 Facebook、LINE 或其他平台時,Open Graph 控制分享標題、說明、圖片與連結。

程式區塊完整 SEO <head> 設定(首頁範例)
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <!-- ① 頁面標題(每頁不同)-->
  <title>金融知識平台|考照題庫、金融工具與投資教材</title>

  <!-- ② 頁面說明(搜尋結果摘要)-->
  <meta name="description"
    content="整合金融考照、複利試算、債券分析、股票工具、AI 金融與永續金融教材。">

  <!-- ③ 指定主要網址(避免重複內容)-->
  <link rel="canonical" href="https://example.com/">

  <!-- ④ Open Graph(社群分享效果)-->
  <meta property="og:type" content="website">
  <meta property="og:title" content="金融知識平台">
  <meta property="og:description" content="金融考照、投資工具與互動教材。">
  <meta property="og:url" content="https://example.com/">
  <meta property="og:image" content="https://example.com/images/og-cover.jpg">
  <!-- ↑ og:image 必須是完整 HTTPS 網址,圖片需公開可存取 -->

  <link rel="stylesheet" href="css/main.css">
</head>
!

og:image 常見錯誤:使用相對路徑(images/og-cover.jpg)或本機路徑。社群平台在解析 OG 標籤時,必須能直接存取完整 HTTPS 網址。

10robots.txt 與 sitemap.xml

程式區塊robots.txt(放在網站根目錄)
User-agent: *
Allow: /

Sitemap: https://example.com/sitemap.xml

# 若有後台,可禁止爬蟲進入:
User-agent: *
Disallow: /admin/
Disallow: /private/
!

robots.txt 不是安全機制!它只是建議性的爬蟲指引,知道網址的人仍可直接開啟頁面。機密內容絕對不能只靠 robots.txt 保護。

程式區塊sitemap.xml(放在網站根目錄)
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

  <!-- 首頁:最高優先度,週更新 -->
  <url>
    <loc>https://example.com/</loc>
    <lastmod>2026-06-23</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>

  <!-- 核心工具頁:次高優先度,月更新 -->
  <url>
    <loc>https://example.com/time-value.html</loc>
    <lastmod>2026-06-23</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>

</urlset>
sitemap 欄位說明金融網站建議值
<loc>頁面完整網址(必填)使用自有網域的 HTTPS 網址
<lastmod>最後修改日期 YYYY-MM-DD更新文章或工具時同步更新
<priority>站內相對重要性(0.0–1.0)首頁 1.0、核心頁 0.8、文章 0.6
i

sitemap 不列後台頁面、測試頁、404 頁或只供登入用戶看到的頁面。priority 是站內相對重要性,不代表搜尋排名保證。

11Google Search Console

功能說明金融網站應用
索引狀況哪些頁面已被 Google 建立索引確認所有工具頁都被找到
搜尋分析曝光、點擊、平均排名、查詢關鍵詞了解使用者搜尋什麼詞進入
Sitemap 提交提交後監控是否成功讀取所有頁面網站上線後必做步驟
  1. 進入 search.google.com/search-console
  2. 選擇「網域」(驗證整個網域,含 www 與非 www)
  3. 複製 TXT 記錄值 → 在 Cloudflare DNS 新增 TXT 記錄 → 驗證
  4. 驗證成功後,左側選單 → 網站地圖 → 貼上 sitemap.xml 網址 → 提交
  5. 等待 Google 索引(通常數天至數週)
!

提交 sitemap 不代表立即出現在搜尋結果!Google 仍依網站品質、內容價值與外部連結決定抓取與排名。

12GA4 流量分析

分析維度可以知道的資訊金融網站應用
流量來源搜尋、社群、直接、推薦了解哪個管道帶來最多使用者
使用裝置手機/桌面/平板比例確認手機版佔比,決定 RWD 優先度
事件點擊、計算、下載、訂閱等自訂事件了解工具是否真正被使用
程式區塊GA4 追蹤碼(放在 </head> 前)
<!-- 替換 G-XXXXXXXXXX 為您的 Measurement ID -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag() { dataLayer.push(arguments); }
  gtag('js', new Date());
  gtag('config', 'G-XXXXXXXXXX');
</script>
i

GA4 資料可能延遲,也可能受瀏覽器廣告阻擋影響。分析應著重趨勢與行為,不應把每個數字視為絕對精確。測試流量(自己開啟頁面)建議過濾掉。

13Cloudflare Web Analytics

比較項目GA4Cloudflare Web Analytics
詳細事件追蹤✅ 強⚡ 基本
設定複雜度🔵 較高🟢 較低
隱私保護需視 Cookie 設定通常較簡單(無 Cookie)
與 Cloudflare 整合無特別優勢✅ 高,部署後自動整合
i

建議搭配使用:Cloudflare Web Analytics 觀察基本流量趨勢;GA4 分析金融工具點擊、計算完成等自訂事件。兩者不互斥。

14GA4 事件追蹤

追蹤類型能知道什麼不能知道什麼
頁面瀏覽(page_view)使用者開啟了哪個頁面使用者有沒有使用工具
自訂事件使用者做了什麼操作(點擊、計算、完成)使用者的個人資料
程式區塊GA4 事件追蹤(複利計算)
"use strict";

// ── 報酬率分組(不傳送精確數值)────────────────────
function getRateGroup(ratePercent) {
  if (ratePercent < 0) return 'negative';
  if (ratePercent <= 5) return '0_to_5';
  if (ratePercent <= 10) return '5_to_10';
  return 'above_10';
}

// ── 追蹤複利計算事件 ────────────────────────────────
function trackCompoundCalculation(years, ratePercent) {
  if (typeof gtag !== 'function') return;   // 先確認 GA4 已載入

  gtag('event', 'compound_calculation', {
    investment_years: years,
    annual_rate_group: getRateGroup(ratePercent),
    // ⚠️ 不傳送:精確本金、精確報酬率、使用者名稱 / Email
  });
}

金融工具建議事件命名規則

事件名稱說明參數
compound_calculation複利計算完成investment_years、annual_rate_group
bond_filter_used債券篩選條件使用filter_type(rating/maturity/keyword)
exam_completed完成一輪測驗score_percent(分數百分比)
!

GA4 事件絕對不應傳送:使用者姓名、Email、身分證號、電話、銀行帳號、精確資產金額或完整投資組合。使用分類後的「區間」資料(如 annual_rate_group: '5_to_10'),而非原始數值。

15金融網站核心分析指標

指標類別重要指標用來判斷
流量使用者數、頁面瀏覽、回訪比例、手機比例、流量來源整體規模與成長趨勢
工具使用工具頁瀏覽、計算按鈕點擊、成功計算次數、完成率工具是否真正被使用
內容導流工具→文章→題庫→課程→購買的路徑轉換率內容能否引導深度參與
i

只看「頁面瀏覽」不夠,需同時追蹤工具完成率、測驗完成率等行為指標。一個有 10,000 次瀏覽但 0 次計算的工具頁面,代表入口正確但功能設計有問題。

16SEO 內容品質原則

// ✗ 關鍵字堆疊(可能被搜尋引擎降低評分)
債券、債券投資、債券價格、債券評價、債券教學、
債券網站、最好債券工具、債券推薦、台灣債券......

// ✓ 回答使用者真實問題的標題
市場利率上升時,債券價格為什麼下跌?
如何使用存續期間估算債券價格變動?
十年後要累積 100 萬元,每月需要投入多少?

建立主題群組(Topic Cluster)

主題包含內容
債券主題群組債券入門文章(支柱頁)+ 債券定價工具 + 殖利率曲線圖 + 存續期間教材 + 債券選擇題
複利主題群組複利基礎文章 + 複利計算器 + 複利 vs 單利圖表 + 退休規劃計算 + 72 法則說明
i

主題群組讓相關頁面彼此連結,有助於搜尋引擎理解網站的主題深度,也讓使用者在一個主題下自然延伸閱讀,降低跳出率。

17頁面速度與效能優化

常見問題改善方式
圖片檔案過大使用適當尺寸;照片用 JPG,圖示用 PNG,可考慮 WebP 格式
非首屏圖片阻擋載入加入 loading="lazy" 延遲載入
首頁載入全部資料只顯示精選與最新內容(文章 6 篇、工具 3 個)
Plotly HTML 過大使用 include_plotlyjs="cdn" 而非內嵌整份 JS 程式庫
<!-- 使用 WebP 格式、加入 alt 與 lazy loading -->
<img
  src="images/bond-cover.webp"
  alt="債券投資教材封面,介紹票面利率與信用評等基礎概念"
  loading="lazy"
  width="400"
  height="260"
>
<!-- width/height 屬性幫助瀏覽器預先保留空間,減少版面位移(CLS) -->

18無障礙設計要點

要點說明程式碼範例
圖片 alt螢幕閱讀器讀出圖片描述<img alt="本金十萬元...">
表單 label每個輸入欄位都需有對應 label<label for="principal">
顏色不唯一錯誤提示不能只靠紅色,需有文字本金必須大於 0(紅色 + 文字)
鍵盤操作所有互動元件應可 Tab 鍵操作導覽列、按鈕、下拉選單都需支援
標題層級每頁一個 h1,依序 h2/h3不要只因字體大小而亂用 h1

19完整 SEO 專案結構

financial-platform/
├─ index.html              ← 含 title/description/canonical/OG
├─ time-value.html         ← 含獨立的 title/description
├─ bond-database.html      ← 含獨立的 title/description
├─ visualization.html      ← 含獨立的 title/description
├─ robots.txt              ← 放在根目錄
├─ sitemap.xml             ← 放在根目錄
├─ css/
│  ├─ main.css             ← 全域樣式
│  ├─ navigation.css       ← 導覽列樣式
│  └─ responsive.css       ← RWD 斷點
├─ js/
│  ├─ navigation.js        ← 手機選單 JS
│  └─ analytics.js         ← GA4 事件追蹤
└─ images/
   └─ og-cover.jpg         ← Open Graph 分享圖片

20實務案例

(一)導覽列過度擁擠(十五個項目)

某金融網站導覽列放入十五個同層項目,手機使用者必須左右滑動。改善:保留五至六個主分類,使用下拉選單,手機版使用收合按鈕,首頁提供核心入口卡片。

(二)所有頁面 title 完全相同

網站所有頁面都使用「金融知識平台」作為 title,搜尋引擎難以區分各頁差異。改善:債券頁 →「債券資料庫|票面利率、信用評等與到期年限」;考照頁 →「金融考照題庫|CFP、AFP 模擬練習」。

(三)有內容但 Google 找不到

可能原因:尚未驗證 Search Console、沒有 sitemap、頁面無內部連結(孤立頁面)、robots.txt 錯誤設定了 Disallow、網站使用 pages.dev 與自有網域造成重複內容、或網站剛上線尚未被索引。

(四)GA4 有流量但不知道工具是否被使用

只有 page_view 無法判斷使用者是否完成計算。應增加 compound_calculation、bond_filter_used 等事件,才能知道工具的真實使用情況與完成率。

(五)事件追蹤傳送個人金融資料(資料治理問題)

某退休工具將使用者年齡、資產、收入、Email 全部傳送到 GA4。正確做法:只追蹤年齡區間、資產區間、工具類型、是否完成計算,不傳送任何可辨識個人的資料。

(六)手機版按鈕太小(44px 標準)

桌面版按鈕高度 20px,在手機上難以精準點擊。改善:設定 min-height: 44px,同時保留足夠間距。

21常見錯誤與除錯

症狀最可能原因修正方式
手機選單無法開啟JS 未載入或 id 不一致F12 Console 查看錯誤;確認 menuButton id 一致
下拉選單被其他內容遮住z-index 不足或父層 overflow:hiddenheader z-index: 1000;移除不必要的 overflow:hidden
robots.txt 無法存取檔案不在根目錄確認 https://example.com/robots.txt 可開啟
GA4 即時報表沒有資料Measurement ID 錯誤或廣告阻擋確認 ID 正確;使用無痕視窗測試
社群分享沒有圖片og:image 使用相對路徑或圖片不公開改為完整 HTTPS 網址且圖片需公開可存取

22關鍵字

UIUX資訊架構(IA) 導覽列下拉選單卡片設計 RWDMedia QueryViewport aria-expandedclassList.toggleSEO titlemeta descriptioncanonical Open Graphog:imagerobots.txt sitemap.xmlGoogle Search ConsoleGA4 Measurement IDgtag()Cloudflare Web Analytics page_view事件追蹤主題群組 lazy loadingWebP無障礙設計 alt 屬性Core Web Vitals

23實作練習

(一)基礎操作
  • 將現有導覽列整理為六個主要分類,加入「金融工具」下拉選單(含四個連結)
  • 建立手機版選單按鈕,確認 860px 以下時選單可收合
  • 建立三張金融工具卡片(Grid 三欄),確認 620px 以下改為單欄
  • 為每個頁面設定不同的 <title>,確認每頁 title 都描述該頁主題
  • 建立 robots.txt 與 sitemap.xml,確認可在 https://你的網域/robots.txt 開啟
  • 加入 GA4 追蹤碼,在瀏覽器即時報表中確認頁面瀏覽事件
(二)功能修改
  • 手機選單展開時,按鈕文字從「選單」改為「關閉」
  • 為目前頁面的導覽連結加入高亮(aria-current 或 active class)
  • 為每張工具卡片加入 GA4 點擊事件(tool_card_clicked)
  • 在複利計算器的計算完成後加入 compound_calculation 事件
  • 為非首屏圖片加入 loading='lazy',並設定 width/height 屬性
(三)進階挑戰
  • 使用 Python 自動產生 sitemap.xml(讀取 data/ 資料夾產生對應網址)
  • 建立結構化資料(JSON-LD)標記,讓 Google 顯示豐富搜尋結果
  • 建立麵包屑導覽(breadcrumb)提升頁面層級清楚度
  • 設定 GA4 自訂漏斗:工具頁 → 計算完成 → 閱讀相關文章

上面「功能修改」的第一項,正是本章挑戰任務(04 分頁)任務一的原型——導覽列的手機選單邏輯是純前端 JavaScript,可以在瀏覽器裡真的執行,所以挑戰任務延續第一~三、五章的「真實執行」模式。SEO/meta 標籤/GA4 的部分則是設定與檢查清單,沒有可執行的程式邏輯,留在教材導讀中完整呈現。

本章結語——本章將已上線的金融網站進一步優化為容易使用、容易搜尋並能持續分析的平台。在網站介面方面,讀者重新整理資訊架構、建立主導覽與下拉選單、設計金融工具卡片,並使用 RWD 讓網站在桌面、平板與手機上正常操作。

在 SEO 方面,讀者完成 title、meta description、canonical、Open Graph、robots.txt 及 sitemap.xml,並了解 Google Search Console 如何協助網站建立索引及分析搜尋表現。在流量分析方面,讀者理解 GA4 與 Cloudflare Web Analytics 的分工,並建立複利計算、債券篩選、測驗完成等自訂事件。

下一章進入 Streamlit 金融網站管理後台。讀者將使用 Python 建立新增、修改、上架、排序、圖片上傳與 GitHub 發布等管理功能,讓網站管理者不必直接修改 JSON,也能持續更新金融文章、題庫、書籍與工具內容。

金融網站導覽列(教材原始範例)

把瀏覽器縮小到 860px 以下(或直接在手機上開啟),可以看到導覽列自動收合成漢堡選單;滑鼠移到「學習專區」「金融工具」上會看到下拉選單。這就是課本第四~五節的導覽列與工具卡片完全對應的成品,等一下的挑戰任務就是在這份程式碼上動手修改。

  navigation.html — 在瀏覽器中執行(試著縮小視窗寬度)

觀念測驗

共 15 題選擇題,涵蓋本章所有核心觀念。每題作答後會立即顯示解析。

0 / 15 已作答

挑戰任務:修改程式碼,讓工具自己告訴你哪裡錯

手機選單的開關邏輯是純前端 JavaScript,可以在瀏覽器中真的執行。下面三個練習都是「真的會執行」的程式碼,修改完成後按下「執行測試」,系統會把你的程式碼放進真實瀏覽器環境中運行,並用白話文告訴你哪裡不對。

任務一:功能修改

對應教材「二十三、實作練習(二)功能修改」

難度:入門
  • 點擊選單按鈕展開選單後,按鈕文字應從「選單」變成「關閉」
js/navigation.js — 可直接編輯
提示(卡住了再打開)
menuButton.setAttribute("aria-expanded", ...) 之後,加入一行文字切換邏輯。
💡 查看範例解答(建議自己先試過再打開)


            

看完解答後,可以按「還原初始程式碼」重新自己動手做一次,或按「換一題再練習」挑戰另一個類似的任務。

任務二:抓出隱藏的錯誤

對應教材「二十一、常見錯誤與除錯」— 手機選單無法開啟

難度:除錯
  • 這份程式碼交接自另一位同學,點擊選單按鈕完全沒有反應
  • 找出問題並修正,讓選單恢復正常運作
js/navigation.js — 藏有 1 個 bug
提示(卡住了再打開)
F12 → Console 如果出現「Cannot read properties of null」,代表 document.getElementById("...") 抓到的是 null。若沒有紅字錯誤但點擊完全沒反應,檢查 addEventListener 裡的事件名稱是不是打錯字了。
💡 查看範例解答(建議自己先試過再打開)


            

看完解答後,可以按「還原初始程式碼」重新自己抓一次,或按「換一題再練習」練習抓另一個錯誤。

任務三:無障礙標記與畫面狀態不一致

對應教材「四、(三)JavaScript:手機選單開關」— aria-expanded

難度:除錯
  • 這份程式碼可以正常執行、選單也能正常開關,但螢幕閱讀器會收到錯誤的狀態資訊
  • 選單展開後,aria-expanded 屬性應該要是 "true",但沒有正確反映
  • 找出問題所在並修正
js/navigation.js — 畫面正常,但無障礙標記不對
提示(卡住了再打開)
這是「畫面看起來沒問題,但某個屬性值不對」的類型。仔細檢查 isOpen 這個變數是「在切換之前」讀取的,還是「切換之後」的最新狀態,或者 aria-expanded 有沒有被寫死成固定值。
💡 查看範例解答(建議自己先試過再打開)


            

看完解答後,可以按「還原初始程式碼」重新自己抓一次,或按「換一題再練習」練習抓另一種不一致的成因。