LESSON-02 · 自主延伸

HTML 文件語意與可理解內容

把「HTML 文件語意與可理解內容」拆成 4 個可獨立完成、可重設、可驗證的自主學習 module。

1. 現在要做什麼

成果:完成一份語言、行動裝置、內容結構、圖片與連結都可被理解的首頁骨架。

需要的檔案:files/starter/index.html(整合起點,保留跨 module 的最小缺口。)

完成後:完成一份語言、行動裝置、內容結構、圖片與連結都可被理解的首頁骨架。

0 / 8 個操作已記錄

2. 先備自我檢查

逐項展開;答不出來時先走補救連結,不必硬做。

已完成本章基礎練習並能找到 Starter。

自我檢查:我能否指出本章 Starter 入口與唯一 TODO?

不足時補救:回到本章 README,先完成基礎練習與入口導覽。

能開啟本機 HTML 並讀取至少一種瀏覽器證據。

自我檢查:我能否開啟 Elements、Console 或 Network 並找到本頁?

不足時補救:先開 DevTools,重新整理一次,確認目前文件與第一筆 request。

3. 完整學習目標與 Learning Map

每一個目標只對應一個 module;成功狀態必須能指出證據。

能在文件根節點與 head 設定正確語言、UTF-8 編碼與行動 viewport。

為什麼重要
語音閱讀、文字解碼與行動版面都依賴這三個文件級訊號。
完成條件
在一份缺少三項 metadata 的 Starter 補齊後重新讀取 DOM。
成功狀態
documentElement.lang=zh-Hant、charset=utf-8,viewport 含 width=device-width 與 initial-scale=1。
證據位置
html.lang、meta.charset、meta[name=viewport].content

能依內容關係選擇 paragraph、ul/ol 與 list item。

為什麼重要
正確結構讓人與輔助技術都能快速理解哪些是數項同類內容。
完成條件
把逗號分隔的三項服務改成真實 ul/li,保留一段說明 p。
成功狀態
DOM 有 1 個說明段落、1 個清單與 3 個同層 li。
證據位置
paragraphCount=1、listCount=1、itemCount=3

能讓圖片從正確相對路徑載入,並按圖片目的提供等價 alt。

為什麼重要
路徑錯會破圖;alt 錯則會讓無法看圖的人失去同等資訊。
完成條件
從目前 HTML 所在位置解析圖片 URL,並替有資訊圖寫目的導向 alt。
成功狀態
image.complete=true、naturalWidth>0、currentSrc 為本地 fixture,alt 非檔名且說明圖片用途。
證據位置
loaded=true、currentSrc 可解析、naturalWidth>0、alt 符合用途

能讓連結離開周邊段落後仍能說明目的地或動作。

為什麼重要
語音與鍵盤使用者常以連結清單快速瀏覽;「點這裡」離開上下文就失去意義。
完成條件
在不看周邊段落時,只讀連結 textContent 仍能預測目的地。
成功狀態
連結文字為「查看三項網站規劃服務」,不含點這裡/更多。
證據位置
linkText 包含網站規劃服務且 ambiguous=false

4. 4 個知識模組與 Micro Labs

依序展開;每次只改一項,操作後確認該模組自己的 DOM、progress 與 evidence。

1lang、charset 與 viewport

完整解釋

白話:告訴瀏覽器「這頁用什麼語言、怎麼解讀文字、手機要用多寬畫面」。

正式說法:lang 是全域語言屬性;meta charset 宣告文件字元編碼;viewport meta 指示行動 layout viewport。

何時使用:每一份可獨立開啟的 HTML 文件。

修改前後:Before:語音可能用錯語言、中文亂碼、手機頁面被縮小。After:三項 DOM metadata 均可查證。

常見混淆:viewport 不是 CSS breakpoint;charset 也不是字型 font-family。

名詞與最小範例

lang、charset 與 viewport Document language, character encoding, and viewport

白話
告訴瀏覽器「這頁用什麼語言、怎麼解讀文字、手機要用多寬畫面」。
正式定義
lang 是全域語言屬性;meta charset 宣告文件字元編碼;viewport meta 指示行動 layout viewport。
何時使用
每一份可獨立開啟的 HTML 文件。
最小範例
`<html lang="zh-Hant">` 與 head 內 UTF-8/viewport 兩個 meta。
驗收證據
html.lang、meta.charset、meta[name=viewport].content
常混淆
viewport 不是 CSS breakpoint;charset 也不是字型 font-family。

Micro Lab|lang、charset 與 viewport

情境:新首頁在手機上被縮得很小,語音工具也用錯語言。

起始狀態:fixture 的 lang、charset 與 viewport 值都是待修正狀態。

  1. 套用 zh-Hant、UTF-8 與 width=device-width viewport,再讀取三個 DOM 值。
  2. 執行下方操作,觀察獨立的 DOM 與資料狀態。
  3. 依證據欄位重新驗收。

目前主題:lang、charset 與 viewport

未設定未設定未設定
尚未執行;DOM data-state=starter。

預期:documentElement.lang=zh-Hant、charset=utf-8,viewport 含 width=device-width 與 initial-scale=1。

證據:html.lang、meta.charset、meta[name=viewport].content

第一個檢查:先在 Elements 展開 html 與 head,不要先調 CSS。

重設:重設後回到 lang 空白、編碼未確認、viewport 未設定。

卡住時

  • 症狀:手機預覽仍像桌機頁面整張縮小。
    可能原因:viewport meta 缺少、name 拼錯或 content 未含 width=device-width。
    先檢查:在 Elements 找 `meta[name=viewport]` 並讀 content。
    修正:保留一個正確 viewport meta,刪除重複或拼錯項。

理解檢查

哪一項直接告訴語音工具文件語言?

尚未作答。

查看解釋

lang 是文件語言訊號,字型只控制視覺。

本模組官方來源:MDN|lang global attribute

2段落、清單與可掃讀內容

完整解釋

白話:一段完整的話用 p;數個同類項目用清單,每項用 li。

正式說法:p 表示文字段落;ul 表示無特定順序的項目群,li 是清單項目。

何時使用:服務特色、步驟、注意事項或任何有群組關係的內容。

修改前後:Before:三項服務擠在一個 p 中。After:說明與三個 li 可分別被計數。

常見混淆:不要為了視覺縮排就用 br 假裝清單;ol 只用在順序會改變意義時。

名詞與最小範例

段落、清單與可掃讀內容 Paragraphs, lists, and scannable content

白話
一段完整的話用 p;數個同類項目用清單,每項用 li。
正式定義
p 表示文字段落;ul 表示無特定順序的項目群,li 是清單項目。
何時使用
服務特色、步驟、注意事項或任何有群組關係的內容。
最小範例
`<p>我們提供三項服務。</p><ul><li>盤點</li>...</ul>`。
驗收證據
paragraphCount=1、listCount=1、itemCount=3
常混淆
不要為了視覺縮排就用 br 假裝清單;ol 只用在順序會改變意義時。

Micro Lab|段落、清單與可掃讀內容

情境:首頁用一長行逗號文字列出三種服務,很難掃讀。

起始狀態:fixture 只有一段包含三項文字的 p。

  1. 將三個文字項目建成 ul/li,再計算 p、ul、li 數量。
  2. 執行下方操作,觀察獨立的 DOM 與資料狀態。
  3. 依證據欄位重新驗收。

目前主題:段落、清單與可掃讀內容

我們提供三項服務。

盤點,設計,交付
尚未執行;DOM data-state=starter。

預期:DOM 有 1 個說明段落、1 個清單與 3 個同層 li。

證據:paragraphCount=1、listCount=1、itemCount=3

第一個檢查:先數內容有幾項,再選 ul 或 ol。

重設:重設回單一長段落。

卡住時

  • 症狀:畫面有三行,但 itemCount 仍為 0。
    可能原因:只用 br 換行,沒有建立 li。
    先檢查:在 Elements 確認 ul 內是否真有三個 li。
    修正:把每個項目包成 li,並放在同一 ul。

理解檢查

三項無先後的服務應使用什麼?

尚未作答。

查看解釋

ul/li 表達無必要順序的項目群。

本模組官方來源:MDN|The Unordered List element

3img、alt 與圖片相對路徑

完整解釋

白話:src 要從這份 HTML 的位置找到圖;alt 是圖看不到時要交付的文字資訊。

正式說法:img src 是可解析 URL;alt 是圖像替代文字,其內容取決於圖像在文件中的功能與資訊。

何時使用:每張 img;相對路徑搬動檔案夾層級後尤其要重驗。

修改前後:Before:src 指向不存在檔案,alt 只寫 hero.jpg。After:圖載入且 alt 交付等價意思。

常見混淆:alt 不是圖片 caption,也不是關鍵字清單;純裝飾圖通常用 alt=""。

名詞與最小範例

img、alt 與圖片相對路徑 Image source, alternative text, and relative URL

白話
src 要從這份 HTML 的位置找到圖;alt 是圖看不到時要交付的文字資訊。
正式定義
img src 是可解析 URL;alt 是圖像替代文字,其內容取決於圖像在文件中的功能與資訊。
何時使用
每張 img;相對路徑搬動檔案夾層級後尤其要重驗。
最小範例
`<img src="./images/team.svg" alt="兩位顧問在白板前整理網站內容">`。
驗收證據
loaded=true、currentSrc 可解析、naturalWidth>0、alt 符合用途
常混淆
alt 不是圖片 caption,也不是關鍵字清單;純裝飾圖通常用 alt=""。

Micro Lab|img、alt 與圖片相對路徑

情境:首頁 hero 破圖,語音只讀出 hero-final.svg。

起始狀態:img src 指向 missing.svg,alt 是檔名。

  1. 將 img 切到可載入的本地 data image,設定用途導向 alt,讀取 complete/currentSrc/naturalWidth。
  2. 執行下方操作,觀察獨立的 DOM 與資料狀態。
  3. 依證據欄位重新驗收。

目前主題:img、alt 與圖片相對路徑

hero-final.svg
尚未執行;DOM data-state=starter。

預期:image.complete=true、naturalWidth>0、currentSrc 為本地 fixture,alt 非檔名且說明圖片用途。

證據:loaded=true、currentSrc 可解析、naturalWidth>0、alt 符合用途

第一個檢查:先看 Network/currentSrc 找路徑,圖成功載入後再審 alt。

重設:重設回 missing src 與檔名 alt。

卡住時

  • 症狀:currentSrc 有值,但 naturalWidth=0。
    可能原因:URL 已解析但資源不存在或無法解碼。
    先檢查:在 Network 打開該 currentSrc 的 status/response。
    修正:修正相對路徑或換成可解碼的圖片檔。

理解檢查

什麼最能證明圖片不只有 URL,而是真的載入?

尚未作答。

查看解釋

currentSrc 只表示選定 URL,naturalWidth 才反映圖像已解碼。

本模組官方來源:MDN|The Image Embed element

4可單獨理解的連結文字

完整解釋

白話:連結自己就要說清楚按下去會去哪裡或做什麼。

正式說法:accessible name 應使連結目的可在上下文中或由連結本身確定;本練習以連結自身文字完成。

何時使用:導覽、CTA、文章內文與下載連結。

修改前後:Before:連結清單只有多個「點這裡」。After:每個文字能分辨目的地。

常見混淆:title attribute 不是用來補救模糊連結的主要方法;URL 完整也不代表連結文字可理解。

名詞與最小範例

可單獨理解的連結文字 Descriptive link text

白話
連結自己就要說清楚按下去會去哪裡或做什麼。
正式定義
accessible name 應使連結目的可在上下文中或由連結本身確定;本練習以連結自身文字完成。
何時使用
導覽、CTA、文章內文與下載連結。
最小範例
`<a href="services.html">查看三項網站規劃服務</a>`。
驗收證據
linkText 包含網站規劃服務且 ambiguous=false
常混淆
title attribute 不是用來補救模糊連結的主要方法;URL 完整也不代表連結文字可理解。

Micro Lab|可單獨理解的連結文字

情境:首頁有三個「點這裡」,使用者從連結清單無法分辨。

起始狀態:a.textContent 為「點這裡」。

  1. 將「點這裡」改為描述目的地的文字,再程式檢查 textContent。
  2. 執行下方操作,觀察獨立的 DOM 與資料狀態。
  3. 依證據欄位重新驗收。

目前主題:可單獨理解的連結文字

點這裡

三項網站規劃服務

尚未執行;DOM data-state=starter。

預期:連結文字為「查看三項網站規劃服務」,不含點這裡/更多。

證據:linkText 包含網站規劃服務且 ambiguous=false

第一個檢查:先只讀連結文字,不看前後段落。

重設:重設將連結恢復模糊文字。

卡住時

  • 症狀:連結畫面上改了,檢查仍判斷 ambiguous=true。
    可能原因:只改 aria-label 或 title,可見 textContent 仍是模糊文字。
    先檢查:在 Elements 直接讀 a.textContent。
    修正:將可見連結文字改成目的導向文案。

理解檢查

哪一個連結離開段落仍可理解?

尚未作答。

查看解釋

它直接說出要查看的內容。

本模組官方來源:MDN|The Anchor element

5. HTML 文件語意與可理解內容|整合 Lab

情境:在同一份章節作品中整合 4 個 module,排除單項通過但組合失敗的問題。

交付:完成一份語言、行動裝置、內容結構、圖片與連結都可被理解的首頁骨架。

尚未執行整合步驟。
  1. 1觀察整合 Starter 並找出第一個未通過 module。

    檔案:files/starter/index.html 定位:#observe

    操作:逐項讀取 outcomes,執行一次現況操作。

    // OBSERVE:不修改程式,先記錄第一個失敗 moduleId。

    預期:能指出第一個未通過 module。

    證據:第一個 moduleId 與缺少的 evidence。

    原因:先觀察可避免未重現就直接改答案。

    卡住先查:確認開啟的是 files/starter/index.html。

  2. 2依 module 順序修改,一次只加入一個責任。

    檔案:files/starter/index.html 定位:#modify

    操作:套用 zh-Hant、UTF-8 與 width=device-width viewport,再讀取三個 DOM 值。 → 將三個文字項目建成 ul/li,再計算 p、ul、li 數量。 → 將 img 切到可載入的本地 data image,設定用途導向 alt,讀取 complete/currentSrc/naturalWidth。 → 將「點這裡」改為描述目的地的文字,再程式檢查 textContent。

    // 02-01-lang-charset-viewport: 套用 zh-Hant、UTF-8 與 width=device-width viewport,再讀取三個 DOM 值。
    // 02-02-topic: 將三個文字項目建成 ul/li,再計算 p、ul、li 數量。
    // 02-03-img-alt: 將 img 切到可載入的本地 data image,設定用途導向 alt,讀取 complete/currentSrc/naturalWidth。
    // 02-04-topic: 將「點這裡」改為描述目的地的文字,再程式檢查 textContent。

    預期:完成一份語言、行動裝置、內容結構、圖片與連結都可被理解的首頁骨架。

    證據:html.lang、meta.charset、meta[name=viewport].content;paragraphCount=1、listCount=1、itemCount=3;loaded=true、currentSrc 可解析、naturalWidth>0、alt 符合用途;linkText 包含網站規劃服務且 ambiguous=false

    原因:逐項整合能把回歸定位到明確 module。

    卡住先查:回到第一個未通過的 module,只修該處。

  3. 3驗證所有 module 在整合後仍成立。

    檔案:files/solution/index.html 定位:#verify

    操作:重新整理並依 outcomes 順序重跑所有證據。

    // VERIFY:逐項記錄 pass/fail,不以看到畫面代替 evidence。

    預期:4/4 module 通過。

    證據:每個 moduleId 都有實際結果與重設後重現紀錄。

    原因:單項通過不代表整合後沒有 selector、id 或狀態衝突。

    卡住先查:若失敗,回到第一個失敗 module,不同時修多項。

  4. 4把本章責任轉用到不同內容情境。

    檔案:files/starter/index.html 定位:#challenge

    操作:替另一個商家情境重做,仍達成:完成一份語言、行動裝置、內容結構、圖片與連結都可被理解的首頁骨架。

    // CHALLENGE:只替換內容與資料,不新增框架或跳過 self-check。

    預期:完成一份語言、行動裝置、內容結構、圖片與連結都可被理解的首頁骨架。

    證據:轉用後的作品與全數 module self-check。

    原因:能轉用才代表理解責任,而非只記住原範例。

    卡住先查:先確認共同基底與 module id 未被改壞。

重設方法:重新載入 files/starter/index.html;若 localStorage 不可用,使用頁面內記憶狀態並提供重設按鈕。

6. 自學挑戰與三層提示

挑戰:將同一組責任轉用到另一個商家情境,仍達成:完成一份語言、行動裝置、內容結構、圖片與連結都可被理解的首頁骨架。

限制:不新增框架。;保留 module id 與驗收證據。

提交證據:提交可直接開啟的作品與逐項 self-check。

提示 1|方向提示

拆小:在「HTML 文件語意與可理解內容」先完成第一個尚未通過的 module:lang、charset 與 viewport,不同時修改其他責任。

提示 2|關鍵片段

串接:依 02-01-lang-charset-viewport → 02-02-topic → 02-03-img-alt → 02-04-topic 核對各自輸入與證據。

提示 3|完整解答與原因

完整解答與原因:依序執行 套用 zh-Hant、UTF-8 與 width=device-width viewport,再讀取三個 DOM 值。 → 將三個文字項目建成 ul/li,再計算 p、ul、li 數量。 → 將 img 切到可載入的本地 data image,設定用途導向 alt,讀取 complete/currentSrc/naturalWidth。 → 將「點這裡」改為描述目的地的文字,再程式檢查 textContent。;這個順序能把每個結果對回單一 module,避免整合後無法定位。

完整解答預設收合;先留下自己的嘗試,再開第三層。

7. 症狀式除錯指南

8. 理解測驗、驗收證據與下一步

哪個狀態代表 02-01-lang-charset-viewport 完成?

尚未作答。

查看解釋

語音閱讀、文字解碼與行動版面都依賴這三個文件級訊號。

哪個狀態代表 02-02-topic 完成?

尚未作答。

查看解釋

正確結構讓人與輔助技術都能快速理解哪些是數項同類內容。

哪個狀態代表 02-03-img-alt 完成?

尚未作答。

查看解釋

路徑錯會破圖;alt 錯則會讓無法看圖的人失去同等資訊。

哪個狀態代表 02-04-topic 完成?

尚未作答。

查看解釋

語音與鍵盤使用者常以連結清單快速瀏覽;「點這裡」離開上下文就失去意義。

驗收清單

官方來源

回到課程地圖選擇下一章