跳到主要內容
全部文章

2026年9月14日·閱讀約 3 分鐘

iframe 標題:為甚麼螢幕閱讀器會跳過嵌入內容

缺少標題的 iframe 在螢幕閱讀器裡只會被讀作「frame」。瞭解 WCAG 4.1.2 規則、三個真實的修復方法,以及能找出每一處問題的免費掃描。

wcagaccessibilityiframescreen-readeraxe-corewcag-4-1-2wordpressshopify

螢幕閱讀器讀到沒有標題的 iframe 時只會說「frame」。它完全不會告訴使用者這是地圖、影片還是信用卡表單。 新增一個簡短、具體的 title 屬性即可解決,滿足 WCAG 4.1.2(名稱、角色、值),也是完整無障礙稽核中最快、最便宜的收穫之一。

分屏圖示。左側是視力正常的使用者的瀏覽器,嵌入的地圖、影片和支付表單清晰可見。右側是螢幕閱讀器的框架列表,讀出三個相同且毫無幫助的標籤:「frame」「frame」「frame」。

要點

  • <iframe> 需要 title 屬性,輔助技術才能說明它包含甚麼。沒有它,螢幕閱讀器只會說「frame」、一個 URL 或一個檔名。
  • 這是 WCAG 4.1.2 下的 A 級要求,意味著在幾乎所有引用 WCAG 的無障礙法律中,它都是法定最低要求,而不只是錦上添花。
  • axe-core(Chrome DevTools 無障礙面板背後的引擎)用兩條規則檢查這一點。一條規則檢查是否存在標題,這才是真正的 WCAG 要求。第二條僅屬於最佳實踐,檢查標題是否唯一。大多數指南把兩者混為一談。
  • 小企業網站上最常失敗的三類是嵌入的 Google 地圖小元件,還有 YouTube 或 Vimeo 影片。另一個常見問題是 Stripe 或 PayPal 支付表單。它們往往是從程式碼片段直接貼上進來的。
  • 自動化工具可以放心地為知名的第三方嵌入內容寫出標題。但對於自定義或同源的 iframe,它們無法有把握地猜出標題。猜錯比誠實地標記「需要稽核」更糟。
  • Axeazy 的免費掃描使用與 Chrome DevTools 無障礙面板相同的 axe-core 引擎。它能在大約 60 秒內找出您首頁上每一個沒有標題的 iframe。無需開發人員,無需註冊。

title 屬性到底起甚麼作用

<iframe> 會在您的頁面中載入一個獨立的文件。它可以顯示地圖、影片播放器、聊天小元件或支付表單。

視力正常的訪客直接看到內容,根本不會多想。螢幕閱讀器使用者的體驗則不同。他們的輔助技術需要在他們決定是否進入之前說明這個框是甚麼,因為進入 iframe 會改變他們整個閱讀上下文,類似於開啟一個新標籤頁。

title 屬性就是告訴他們的方式。它成為 iframe 的可訪問名稱,也就是螢幕閱讀器朗讀的那個簡短標籤。使用者用 Tab 鍵進入框架時會讀出它,使用者開啟框架列表時也會讀出它。NVDA 和 JAWS 都允許使用者以這種方式在框架之間跳轉。

如果省略該屬性,體驗會根據瀏覽器和螢幕閱讀器的組合以幾種方式變差:有的只讀出一個光禿禿的「frame」,有的讀出原始的源 URL,有的則甚麼有用的都沒說。這些結果都無法告訴使用者他們是即將觀看影片、輸入支付資訊,還是落入一個廣告。

還有一個值得了解的細節。各瀏覽器對透過鍵盤到達 iframe 的支援並不一致。

Firefox 預設會給 iframe 增加一個 Tab 停靠點。Chrome 和 Safari 通常不會,只有當框架內有可聚焦的內容時才會新增。

瀏覽器之間的這種差異,是無障礙專家多年來一直爭論的部分原因:根據 WCAG 4.1.2,iframe 是否總是需要名稱,還是僅在表現得像互動元件時才需要。最安全、最簡單的做法是為每個 iframe 都新增標題。

無論爭論如何,每一款主流測試工具都強制要求這一點。它只需要一個屬性,而且從不會讓情況變得更糟。

背後的 WCAG 規則(以及大多數指南忽略的一個細節)

一幅簡單的示意圖,拆解「名稱、角色、值」:iframe 的角色由瀏覽器自動提供,title 屬性被突出標示為開發人員必須新增的唯一部分。

核心要求在 WCAG 成功準則 4.1.2,名稱、角色、值,這是一條 A 級準則。它規定每個使用者介面元件都需要一個輔助技術能夠確定的名稱。

對於 iframe,瀏覽器已經自動暴露了角色(它被讀作「frame」)。名稱是您唯一必須自己提供的部分,而 title 屬性是標準做法。

這也不只是美國才關心的問題。同樣的要求對應於 Section 508 的 1194.22(i),以及整個歐盟使用的 EN 301 549 中的等效條款。

下面是大多數 iframe 無障礙指南一筆帶過的細節。axe-core 是 Chrome DevTools 無障礙面板背後的開源引擎,也驅動著 Axeazy 自己的掃描器。它並不是用單一規則來檢查,而是執行兩條:

規則 檢查內容 影響等級 是否為正式的 WCAG 要求?
frame-title iframe 是否有非空標題 嚴重 是,這才是真正的 4.1.2 失敗
frame-title-unique 該標題是否與頁面上其他每個 iframe 的標題不同 嚴重 否,axe-core 把它標記為最佳實踐,而不是獨立的 WCAG 成功準則

這一區別在實踐中很重要。單個沒有標題的 iframe 是真實、可引用的 WCAG 4.1.2 失敗。三個影片 iframe 都叫「Video」,嚴格按照 4.1.2 的字面是透過的,因為每個都有名稱,但螢幕閱讀器使用者仍然無法區分它們。使用框架列表時,這會讓試圖在各嵌入內容之間跳轉的使用者感到困惑。

修復第一個,彌補的是真實的合規缺口。修復第二個是良好實踐,它讓頁面好用得多。儘管屬於另一類,但同樣值得做。

真實網站上出問題的三個地方

兩列圖示,展示文章中的三個真例項子(地圖、影片、支付表單),左側是失敗的程式碼,右側是透過的程式碼,標題文字被突出顯示。

大多數 iframe 標題失敗並不稀奇。它們出現在幾乎每個小企業網站上的同樣三個位置。人們複製貼上這些嵌入程式碼時從不多看一眼。

1. 嵌入的地圖

<!-- 失敗:沒有標題,螢幕閱讀器只會說 "frame" -->
<iframe src="https://maps.google.com/embed?..."></iframe>

<!-- 透過:說明裡面是甚麼、在哪裡 -->
<iframe
  src="https://maps.google.com/embed?..."
  title="顯示我們位於 Main 街的店面位置的地圖">
</iframe>

嵌入地圖的餐廳或診所是在幫助人們找到地點。這正是螢幕閱讀器使用者可能會訪問以獲取路線的頁面。沒有標籤的地圖 iframe 意味著這些資訊對他們實際上是看不見的。

2. 嵌入的影片

<!-- 失敗:籠統,直接照搬嵌入程式碼 -->
<iframe src="https://www.youtube.com/embed/xxxxx" title="YouTube video player"></iframe>

<!-- 透過:描述實際內容 -->
<iframe
  src="https://www.youtube.com/embed/xxxxx"
  title="產品演示:3 分鐘設定您的賬戶">
</iframe>

YouTube 和 Vimeo 都不會在交給您的嵌入程式碼裡寫入有用的標題。預設值要麼籠統,要麼為空。如果您原樣貼上嵌入程式碼而不編輯,那您是在預設釋出這個失敗,而不是出於選擇。

3. 嵌入的支付表單

<!-- 失敗 -->
<iframe src="https://js.stripe.com/v3/elements-inner-card"></iframe>

<!-- 透過 -->
<iframe
  src="https://js.stripe.com/v3/elements-inner-card"
  title="安全的銀行卡支付表單">
</iframe>

這一項分量最重。支付 iframe 的存在,是為了讓商家的頁面永遠不接觸原始的銀行卡資料,這帶來真正的安全好處。但是,螢幕閱讀器使用者在結賬時落入一個沒有標籤的 iframe,無法確認自己是在合法的支付欄位中,還是誤入了廣告框架或追蹤畫素。把這一項做對,既是信任問題,也是合規問題。

如何在大約 60 秒內檢查您自己的網站

您不需要僱開發人員來檢查是否受影響。有兩條誠實的路徑:執行自動掃描,或者自己動手檢查。

最快的方法是 Axeazy 的免費掃描。 它執行在與 Chrome DevTools 無障礙面板相同的 axe-core 引擎上。大約需要 60 秒。無需註冊或信用卡。把它指向您的首頁,它會標出該頁面上每個缺失或為空的 iframe 標題,同時還會檢查 Axeazy 涵蓋的其他 13 個修復類別。

檢查網站上的每一個頁面,而不僅僅是首頁,包含在付費方案中。這是因為掃描會變成持續的工作,而不是一次性的檢查。

如果您現在就想自己檢查一個頁面,具體步驟如下:

  1. 開啟 Chrome DevTools。 右鍵點選頁面上的任意 iframe,選擇「檢查」,然後檢視 Elements 面板中的 Accessibility 窗格。「Accessible Name」欄位會準確顯示螢幕閱讀器將讀出的內容。如果為空或只寫著「frame」,該 iframe 就不透過。這與 Axeazy 掃描器執行的是同一個引擎和同一項底層檢查,只是一次一個 iframe,而不是一次整個頁面。
  2. 在控制檯執行一行檢查程式碼。 在任意頁面的 DevTools 控制檯貼上下面的程式碼,它會列出每個缺少可用標題的 iframe:
    document.querySelectorAll('iframe')
      .forEach(f => {
        const t = f.getAttribute('title');
        if (!t || !t.trim()) console.log('No title:', f.src);
      });
    
  3. 用螢幕閱讀器抽查。 在 NVDA 中,按 Insert+F7 開啟元素列表並切換到框架。在 VoiceOver 中,使用轉子(VO+U)並選擇 Frames。任何列為空白或只有「frame」而沒有描述的項,都是真實使用者會遇到的失敗。

兩條路徑找到的是同一個問題。手動方式免費,對眼前這一頁立刻有效。它只是無法擴充套件到一次一頁之外,而這正是整站掃描存在的全部理由。

寫出真正有幫助的標題

只為透過稽核而存在的標題沒有盡到它的職責。幾條規則能讓它保持有用:

  • 描述用途,而不是供應商。 「客戶支援聊天」告訴使用者它做甚麼。「Intercom 小元件」告訴他們您付費給哪家公司,對決定是否開啟它的人來說毫無意義。
  • 要具體。 「影片」甚麼也沒說。「產品演示:設定賬戶」則說出了使用者決定是否進入所需的一切。
  • 如果有多個 iframe,讓頁面上的每個標題都唯一。 三個嵌入內容都叫「教程」,完全違背了框架導航的意義。
  • 自己為每個第三方嵌入內容新增標題。 地圖、影片播放器、聊天小元件和支付表單給您的程式碼裡幾乎從不自帶有用的標題。釋出前新增標題是您的責任。
  • 保持簡短。 大約五到十二個詞最合適。讀起來像完整句子的標題,朗讀出來會讓人疲憊。
  • 絕不要用 URL、檔名或隨機 ID 作為標題。 URL 或檔名在技術上是有效的字串,但對聽的人毫無用處。
  • 對於沒有內容可讀的裝飾性 iframe,最好對輔助技術隱藏它。例如,後臺的追蹤畫素沒有資訊價值。請使用 aria-hidden="true",而不是為不該被朗讀的東西編造標題。
  • 對於您完全掌控的框架,有些螢幕閱讀器會用所載入文件自身的 <title> 元素代替您寫的 title 屬性。把兩者設定為相同文字,可以完全避免這種不一致。

仍然無法透過稽核的常見錯誤

即使是明顯下過功夫的網站,也會反覆出現一些模式:

  • title=""。 空標題比沒有標題更糟。它明確告訴輔助技術「這裡沒有名稱」,而不是留出讓任何後備機制起作用的空間。
  • 多個 iframe 複製了同一個標題。 滿足 4.1.2 的字面,卻背離其目的。
  • 第三方嵌入內容原封不動。 網站自己的 iframe 都加了標題;貼上進來的 Calendly 或 Typeform 嵌入內容卻漏掉了,因為沒人想到要編輯它。
  • 被完全遺漏的隱藏 iframe。 設定為 display: none 的分析畫素和追蹤 iframe 仍會被自動掃描標出,並且視設定而定,輔助技術仍可能觸及它們。像「Analytics tracker」這樣簡單的標題就能透過檢查,並且如實說明了它是甚麼。

自動化工具能(以及不能)誠實地修復甚麼

一幅簡單的流程圖,顯示掃描到的 iframe 分為兩條路徑:「已識別的嵌入內容(自動修復)」和「未識別或同源(標記待稽核)」,反映了自動修復的誠實範圍。

這是大多數無障礙內容略過的部分,值得直截了當地講。

axe-core 在掃描中一旦發現缺失或為空的 iframe 標題,就會把它標記為影響等級「嚴重」的 WCAG 4.1.2 失敗,無論是 Axeazy 的掃描器、Chrome DevTools,還是任何基於同一開源引擎的工具。發現問題是容易的部分。

自動寫出修復內容,才是誠實的侷限所在。Axeazy 的修復引擎透過網址模式識別約二十個常見的第三方嵌入來源,包括 YouTube、Vimeo、Google Maps、Calendly、Typeform、Stripe 和 PayPal。它會為識別出的每個來源寫出具體、合理的標題。這是真實、可用的自動修復,而不是佔位符。

對於那份已知列表之外的任何內容,比如您網站上的同源 iframe,它不會猜測。對於它不認識的第三方嵌入內容也是如此。它會標出違規,並把具體措辭留給人來決定。

這是刻意的選擇,而不是有人遺忘的缺口。自信地寫出的錯誤標題,比誠實的「需要稽核」標記更糟。這與 title="" 比缺失屬性更糟是同樣的邏輯。讓同一頁面上多個 iframe 的標題保持唯一,仍然是人工稽核步驟,因為指令碼無法可靠判斷兩個嵌入內容是否真的有意義上的區別。

修復最終如何落到您的網站上,也取決於您的平臺:

  • 連線到 GitHub 的 React、Next.js 或自定義程式碼網站會收到一個真實的 pull request。其中包含引擎能識別的嵌入型別的精確行級修改。您或您的開發人員像審查其他程式碼更改一樣審查併合並它。
  • Shopify 商店會得到同樣準確的掃描結果。修復是引導式清單中的一個通俗步驟,而不是對您 Liquid 主題的自動更改。目前沒有針對 Shopify 的自動 pull request。
  • WordPress 站點的免費外掛會在渲染時應用三項即時修復:新增跳過導航、設定語言屬性,以及為缺失的替代文字提供後備文字。iframe 標題不在這三項之內。在 WordPress 上,這透過清單處理,目前還不是外掛的即時修復。瞭解 WordPress 外掛自動修復了甚麼。

這些都不是跳過自動掃描的理由。瞭解其中的差別很重要,因為它告訴您當工具說「已修復」時到底意味著甚麼。iframe 標題是一個龐大標準中真正可以自動化的一小塊。關於實際措辭,以及保持頁面上標題唯一的判斷,仍然需要人來做。檢視哪些會自動修復、哪些需要稽核的完整說明。

常見問題

1. 如果我把 iframe 的標題留空會怎樣?

螢幕閱讀器會讀出框架的角色而沒有名稱,聽起來通常只有「frame」。根據瀏覽器和螢幕閱讀器的不同,使用者也可能聽到原始的源 URL 或檔名。無論哪種情況,他們在決定是否進入之前,都得不到關於裡面內容的有用資訊。

2. 我可以在 iframe 上用 aria-label 代替 title 嗎?

可以。aria-label 同樣有效地為 iframe 命名,還避免了 title 對使用滑鼠的視力正常使用者顯示為懸停提示這一小副作用。如果該提示在您的頁面上沒有價值,aria-label 是完全合理的選擇。title 仍然是最簡單、支援最廣泛的預設選項,如果兩者同時存在,aria-label 優先。

3. 隱藏的或追蹤用的 iframe 也需要標題嗎?

需要,既是為了掃描結果乾淨,也是為了如實說明該框架的實際用途。自動化工具對 display: none 的 iframe 和可見的一視同仁,視設定而定,輔助技術仍可能遇到它們。像「Analytics tracker」這樣簡短而準確的標題就能透過檢查,而且不會假裝成別的東西。

4. 原告律所真的會在 ADA 索賠函中引用缺失的 iframe 標題嗎?

iframe 標題不在真實索賠函中最常被引用的那幾類之列:替代文字、跳過導航、語言屬性、表單標籤,以及連結或按鈕名稱。但它仍然是真實、現行的 WCAG 4.1.2 失敗,小企業網站很容易有五六個沒有標籤的嵌入內容(地圖、影片、預約小元件、支付表單),在完整稽核中累積成真正的問題。值得憑其自身的價值去修復,而不只是作為法律上的對沖。

5. 修復每個 iframe 標題就能讓我的網站無障礙了嗎?

沒有任何單一修復能讓網站變得無障礙,對聲稱如此的說法應保持懷疑。iframe 標題解決的是 WCAG 2.2 AA 五十條成功準則中的一個 4.1.2 失敗。這是更大圖景中紮實而真實的一塊,而不是終點線。

6. 這對您意味著甚麼

iframe 標題是一小段程式碼,卻對螢幕閱讀器使用者能否使用嵌入內容有著不成比例的影響。修復只是一個屬性。難點在於找出它在模板、第三方嵌入內容和多年無人檢視的頁面中缺失的每一處,並誠實地區分哪些工具可以放心自動修復,哪些仍需人的判斷。

Axeazy 的免費掃描會在一分鐘內找出您首頁上每一個沒有標題的 iframe,同時檢查並在程式碼層面修復它涵蓋的另外 13 個類別。每一項修復,包括這一項,都會被記錄進帶日期和時間戳的檔案,供您日後舉證,這是真實努力的記錄,而不是合規徽章。

參考來源

想在電郵中收到這類內容嗎?

The ADA Alert。每週資訊。

逢星期二:無障礙新聞、常見 WCAG 問題及程式碼層面的修正。免費。一鍵取消訂閱。 本電子報以英文撰寫。

我們交付的每份報告的範圍: 範圍限制:本報告記錄的是使用 axe-core v4.11.0 進行 WCAG 2.2 AA 自動掃描所發現的違規問題。自動化工具無法測試所有 WCAG 準則;許多準則需要人工審查。本報告不構成法律意見,不保證符合 ADA,亦不能防止法律行動。是否符合 ADA 是由法院作出的法律裁定。如需完整的 WCAG 合規評估,請聘請獲 IAAP 認證的無障礙專業人士。