共用方式為


有意義的標籤:POSH 及其超越

Emily P. Lewis | 2010 年 6 月 21 日

 

回到 1998 年,我在一家會計事務所擔任市場行銷,我負責設計和撰寫客戶的新聞稿和許多印刷品為主的活動。有一天,我的老闆要我看一下公司的網站,並且重整內容。

當我經歷編輯和重寫的過程,我對網站背後的機制越來越感興趣。在 Internet 上搜尋之後,我知道了所謂的 HTML。在某個關鍵的一天,我打開了記事本,輸入:

<h1>This is a test</h1>

我用 .html 的格式儲存這個文字檔,然後用 Internet Explorer 開啟,結果讓人驚訝。這太神奇了,我可以立即發佈網頁,而我的世界就此改變。此後我離開行銷工作,開始自學 HTML(以及 CSS),並且以專業的網站開發人員身份,開始全新的歷險。

12 年後,HTML 標籤對我而言仍有神奇的魅力。從我的觀點來說,它是 Web 的基礎。它的美麗來自於它的簡單。儘管我的技巧不斷累積,技術也日新月異,我仍然強烈地迷戀標籤。每一個我設計的網站,我都盡可能試著寫出最精簡、有效、並具有語義的標籤。另外我們也別忘了有效性。

令我難過的是,並非每一個人都有志於寫出好的語法。網站充斥著 標籤大雜匯div 主義者span 狂熱份子。而且老實說,我不知道為什麼會這樣。

當然,我知道當中有些限制。每一個設計師和開發人員身上其實都有,無論是陳舊的系統限制了修改標籤的能力,或是老闆寧願將資源和時間分配給前端開發以外的人。但在這些限制中開發出優秀的網站,才是真正專業的標誌。

大多數我遇到 Web 業界的人,都是真正的專家。他們擁有熱情、把工作當志業,持續地建立優秀的網站和應用程式。然而他們之中有那麼多人,為什麼忘了好的標籤帶來的力量?就我後來的了解,那不全然和限制有關。那和把 HTML 當作成是拖油瓶來對待無關。它甚至也不是懶惰的緣故(雖然我承認有時候的確是)。

這個問題必然是缺少了一些認識和知識。幸運的是,這是我能力所及,並能透過這篇文章帶來的一些改變。我們將會了解語義標籤究竟是什麼,看起來像什麼樣子,以及它帶來的好處。我們也將帶著語義的觀念,超越標籤的範疇,進到 CSS 的領域。最後,我們會看到語義標籤如何擴充,應用到機器解讀意義的應用上。

什麼是語義標籤?

語義標籤就是標籤具有意義;標籤描述它所包含的內容,而不是內容應該看起來是什麼樣。這意味著不再用 <font> 標籤,不再用 <b> 標籤,不再用 <table> 元素來排版。

取而代之的是,語義標籤鼓勵你優先思考內容。所以,如果你有個清單,你就應該用清單的元素,像是 <ul>。假如你有一個段落,就應該用 <p> 標籤而不是 <div> 標籤。如果你有一個標題,你就該用標題的元素,像是 <h2>。

相對來說,如果你需要一個內縮的內容,不要使用 <blockquote> ,除非它真的是一段引言。如果你希望內容字體加大、變成粗體字,不要使用 <h1>,除非它是頁面中的主要標題。這些視覺效果的需求,CSS 才是你的好伙伴,而不是標籤。

語義標籤的概念是今日 網頁標準 的基石,它鼓勵分離內容、外觀(CSS)和行為(JavaScript)。事實上,語義標籤通常被當作是「標準相容」(standards-compliant)。而在技客所愛的頭字縮寫中,語義標籤也是所謂的 POSH (Plain Old Semantic HTML,質樸陳舊的語義 HTML)。

暫且不管術語,語義標籤也應該能通過有效性驗證。這意味著你的標籤要能符合指定的 DOCTYPE 驗證。當你在寫 HTML 4、XHTML 甚至是 HTML 5,你的標籤應該保持沒有錯誤發生,而且沒有不合法的元素和屬性。

你要怎麼知道標籤是否有效?很簡單,使用 W3C 的線上驗證。

語義標籤的效益

到目前為止,你也許稍稍了解語義標籤的精神,但也許仍然疑惑,這真的重要嗎?

效率

其中一個重要的效益是它的可攜性(portability)。使用 POSH 的網頁不只能用在瀏覽器,也能應用在各種裝置上,包含螢幕閱讀器、行動裝置和文字瀏覽器。所以你一旦你用 POSH 方法寫了一次,你就能把內容應用在許多設備上,無論是現在或以後。

語義標籤也提供了開發階段的效率,尤其是團隊的開發工作。透過 POSH,你建立了網站標籤的共通語彙。開發人員不用花時間去思考標籤和各式各樣內容之間的對應。段落就是用 <p>,循序清單就是用 <ol> 等等。

此外,藉由遵循這些標準,以及消除不必要的 <div>、<span> 和巢狀的 <table> 標籤,它會更容易閱讀。而可閱讀性對於找出問題、除錯、維護都會帶來重大影響。

無障礙

另一個語義標籤的效益是它提供了無礙障網站基礎架構。如同在我這篇 web accessibility and WAI-ARIA primer 文章所說,輔助技術像是螢幕閱讀器,會透過網站結構來導覽網站。舉例來說,使用標題元素(<h1>到<h6>)來傳達內容結構的階層性,可以提供螢幕閱讀器的使用者,跳到階層中的不同章節。

當然 WCAG 2.0 準則也鼓勵語義標籤,不止針對頁面結構,也包含了清單(<ul>、<ol>、<dl>)和需要強調的特別文字(<strong>、<blockquote>、<abbr>)。此外,這些準則並不鼓勵使用 <table> 元素去做表格資料以外的任何用途。

使用者體驗

利用 POSH 開發的網頁通常會比標籤大雜匯的更為輕量。這個特性通常可以提供頁面下載和反應時間的正面影響,換句話說,能提昇使用者體驗。記住,不是每個人都使用最新、最好的技術。POSH 允許你可以開發符合最低標準的分母,因此就能更有效率地提供內容給所有使用者。

搜尋引擎最佳化?

這些年來,我聽過語義標籤在有機 SEO(Search Engine Optimization,搜尋引擎最佳化)的效益。我也常聽到巢狀表格會影響搜尋引擎會結果;而 Google 會給包含標題的內容更高的評價;精簡、具語義的網頁能讓網頁爬蟲更快、更有效率。

可惜的是,多數的證據顯示這些只是謠傳。我努力找出有效、具語義的標籤能讓主要的搜尋引擎改善搜尋結果的事實。但是 Google 甚至表示,利用 CSS 來代替 table 的佈局,對他們的演算法差別不大

這和我的認知有些差距,搜尋引擎的演算法似乎這幾年來有所改善。巢狀的 <table> 對於 Google 而言,拜精妙的演算法所賜,已經不再是阻礙了。

話雖如此,我個人保持懷疑,在搜尋引擎和語義標籤之間,必然有什麼關係。例如 Google 建議使用使用 h1 元素時必須有所判斷,以避免潛在的不利因素,而且它也建議適當地使用標題標籤。Google 也鼓勵網站管理員使用較精簡的標籤,以改善效能。對我而言,這些建議意味著 Google 的演算法是關切語義標籤的,並且有所擴充。

撰寫語義標籤

現在你已經知道語義標籤的意義和效益,現在讓我們談談實際的使用方法。首先,雖然我得承認如果你剛入門,語義標準是需要多花費一點心力來改變心態。假如你已經開發過 <table> 標籤來控制外觀,或是使用 <div> 元素在每一個區塊等級的內容元素上,在轉換到 POSH 時,會覺得有點奇怪,甚至是感到挫折。

相信我,我知道你的痛苦。我也經歷過。當我開始學 HTML 時,我對 Web 標準沒有什麼概念,更別說是語義標籤是什麼東西了。我的網站那時是非常標準的標籤大雜匯。不過一旦我知道有 HTML 標準,而且能帶來許多我沒想過的效益,我無法繼續用過去開發網站的方式。

假如你也得到相同的結論,那麼這是我建議你如何開始的方法:

  1. 取得對 HTML 元素的基礎認識,以及他們的結構和語義,這樣你就可以適當地使用它們。知道 <ul> 和 <ol> 之間的差異,學習 <table> 元素真正使用的方式。你可以打開 規格書,不過如果你像我一樣,那只會讓事情弄得更複雜,超過原來所需。我建議可以參考 Built In Semantics in HTML 和 Semantic Classifications of HTML Elements 這兩篇文章。
  2. 在你開始寫標籤之前,了解你的內容。你有連續列點的清單嗎?有引言嗎?有標題和次標嗎?透過思考內容,你已經進入了語義標籤的心態中。
  3. 開始寫標籤的時候,專注在為內容和結構上。不要寫任何綁住視覺呈現的標籤。舉例來說,即使你覺得需要一個 <div> 做容器來設計背景圖,暫時先不要寫下標籤。你應該做只透過 HTML 來描述內容。也許就會發現,應用在導覽列上的 <ul>,已經提供了必要的結構來設計 CSS,而不需要額外,非語義的 <div>。
  4. 一旦你已經為內容寫好適當的標籤,花點時間來做有效性驗證。這可以協助你在添加任何視覺效果或行為之前,確保核心標籤的有效性。
  5. 當你準備好開始寫 CSS 的時候,盡你所能將風格樣式套用在為內容所寫 的標籤上。花點時間去質疑為了視覺呈現所寫的 <div> 或 <span>。那真的是必要的嗎?你是否已經有適當的元素,可以做為套用 CSS 時的鉤子?
  6. 所有的標籤都就位後,包含你深思熟慮後加入的視覺樣式或動作,再驗證一次

當然,這些步驟是我如何撰寫標準的過程。也許你會發現其他更適合你的工作流程(或是你的團隊)。重點是,花時間想一下。相信我,你越常去想它,寫出具語義標籤的過程就會越快、越簡單。不過這個過程的確需要一些信念,也需要你多花一點時間。接受它、深入其中,我相信它會帶來較少挫折感。

一些範例

讓我們來試作一些真實世界的例子,就從簡單的導覽連結開始。從內容角度出發,讓我們使用下面這些內容:

首頁 產品 服務 關於我們

我看過有些網站用下面的方式來撰寫標準:

<div>
<p><a href="/">首頁</a></p>
<p><a href="/Products/">產品</a></p>
<p><a href="/Services/">產品</a></p>
<p><a href="/About/">關於我們</a></p>
</div>

不過,讓我們來思考一下內容:這些連結真的是一個段落嗎?<div> 在這裡出現的目的是什麼?

從我的觀點來看,導覽連結事實上是一群相關的內容元素。這個性質讓它們非常適合使用無序清單的標籤 <ul>。因此,以 POSH 來處理導覽連結的方式會像這樣:

<ul>
<li><a href="/">首頁</a></li>
<li><a href="/Products/">產品</a></li>
<li><a href="/Services/">服務</a></li>
<li><a href="/About/">服務</a></li>
</ul>

現在,讓我們來看另外一個例子,這次是網站的聯絡資訊:

ABC Company

123 Main Street

Albuquerque, NM 87106

info@abc.com 888-555-4567

一個非語義的方法來處理這些內容,寫起來也許像這樣:

<div>ABC Company</div>
<div>123 Main Street<br />Albuquerque, NM 87106</div>
<div><a href="mailto:info@abc.com">info@abc.com</a></div>
<div>888-555-4567</div>

就我而言,我會利用另一種方法,專注在語義上,像是:

<dl>
    <dt>ABC Company</dt>
    <dd>
<ul>
<li>123 Main Street</li>
<li>Albuquerque, <abbr title="New Mexico">NM</abbr> 87106</li>
        </ul>
    </dd>
    <dd><a href="mailto:info@abc.com">info@abc.com</a></dd>
<dd>888-555-4567</dd>
</dl>

語義標籤的主觀性

撰寫語義標籤的更大挑戰,是找出可以使用的「正確」元素。就某些內容來說,很明確就能判斷應該使用 <p> 或 <h1>。但對另一些內容而言,它可能適用多種語義方法。

想想上面的 ABC Company 的例子。在我的語義標籤中,我使用了定義清單(<dl>)。有些人也許會(強烈地)反對,因為他們遵循學校的思維,定義清單應該嚴格地限制在詞條和定義內容上。

從另一個角度,我則認為定義清單也可以用在內容元素彼此間有直接關係,如同 <dd> 內容相對於 <dt> 一樣。以 ABC Company 的聯絡資訊來說,我看到了地址、電子郵件和電話資訊(使用 <dd> 標籤),這些和公司的名稱直接相關(使用 <dt> 標籤)。

此外,也許不只有 <dl> 的用法會招來非議。你也許已經注意到我在地址資訊上使用 <ul>。就我的想法,這是因為這些資訊是一組相關的內容元素。

為了進一步說明語義標籤的主觀本質,我寫了另一個方法來包含這些資訊,像是這樣:

<h3>ABC Company</h3>
<ul>
<li>123 Main Street</li>
<li>Albuquerque, <abbr title="New Mexico">NM</abbr> 87106</li>
</ul>
<dl>
    <dt>Email:</dt>
    <dd><a href="mailto:info@abc.com">info@abc.com</a></dd>
    <dt>Phone:</dt>
<dd>888-555-4567</dd>
</dl>

就本質而言,並沒有所謂的「正確」語義方法(也許有些語義純粹主義候會反對)。再次重申,我鼓勵你專注於思考你的標籤。知道你為什麼選用某個元素而非另一個,並對不同的方法保持開放的學習精神。今天你覺得合理的語義,有可能會隨著你的知識增長而有所改變。

別忘了 HTML5

既然本文的焦點是語義標籤,我一定要花點時間來談談 HTML5。目前它仍然在草案階段,HTML5 引進了一些新的語義標籤,也許能減少或消除在結構上使用 <div> 的需求:

  • <section> 代表文件或應用程式的一部分,包含的是群組的主題。<section> 通常有一個 <header> ,另外也可以有一個 <footer>。
  • <header> 通常包含了標題或是頁面標題的群組,雖然 <section> 也能包含其他補充的資訊,像是導覽列、標誌等。
  • <footer> 是用來包含有關 <section> 的內容,像是作者、相關文章、版權宣告等等。
  • <nav> 是用來包含頁面的主要導覽連結。
  • <article> 是用來包含內容本身,可以作為頁面整體中,獨立使用的一部分,像是部落格的主文區塊。
  • <aside> 指的是頁面的一部分,包含於內容,但卻與它分隔的區塊,例如邊欄。

以本文的範圍而言,我不打算深入到 HTML5。此外,我也只開發過一個使用 HTML5 的網站,還在試著努力讓自己能處理規格的細微差別。不過仍建議你可以看看這些優秀的文章,我已經親身體驗過它們的用處:

超越結構

到目前為止,多數討論集中在使用語義元素來定義結構。不過語義可以超越標籤元素自身,進入屬性值的語義層面,提供更多的意義。

Class 和 ID 值

如同我在 Be a CSS Team Player 這篇文章中提到,語意命名的慣例,對於 class 和 id 而言,可以在 CSS 中提供珍貴的情境(context)和意義。讓我們來想想下面這兩種不同樣式的宣告:

.f23 {    
    background: #fff;    
    border: 1px solid #ff0;    
    font-weight: bold;    
    padding: 10px; 
}
.alert {    
    background: #fff;    
    border: 1px solid #ff0;    
    font-weight: bold;    
    padding: 10px;
}

在這個範例中,屬性/值的配對是相同的,但是哪一個更有意義?我希望這個答案是很明顯的,第二個宣告由於 class 命名的緣故,讓它更具意義。「Alert」比起「f23」更具有指示使用情境的意義,而更豐富的使用情境,能夠讓你(和其他需要處理 CSS 的人),更容易理解樣式宣告會影響哪些內容。

不只是使用情境,具有語義的 class 和 id 值(而非針對樣式來思考),能減輕維護和日後開發的負擔。假設一個網站有一個邊欄,它指定「rightSidebar」這樣的 id 名稱。乍看之下似乎具有語義,但它同時也帶著樣式意義。所以,如果這個站需要重新設計時,而這個邊欄被改置到新的視覺位置,「rightSidebar」就不再適用了。

這不止意味著 CSS 的屬性值需要調整,而且包含所有標籤中的有使用到這個 id 的,也都要改變。換過來說,如果它只是一個純語義的值,像是「relatedContent」這樣的 id 名稱,將可為日後帶來更多的彈性。

讓機器能解讀意義

除了能幫助開發人員維護和溝通之外,具語義的屬性,也可以為機器(使用代理程式、搜尋引擎、瀏覽器、應用程式等)解讀你的內容,帶來重要的意義。

舉例來說,微格式應用在具語義的 class 名稱,用來描述一般的 Web 內容,像是聯絡資訊、事件、部落格貼文和評論。機器藉由微格式,可以很容易辨識內容,並取出應用在許多範圍。

以之前提到的 ABC 公司作為例子。身為人類,你和我都能立刻辨識出內容是什麼:姓名、地址、電話和電子郵件資訊。然而,機器卻不具備這樣的能力。對機器來說,內容就和網頁中的任何一個段落一樣。

但是如果你套用 hCard 微格式,你就在告訴機器,這個資訊包含了聯絡訊息。透過這種方式,機器就能轉換網頁內容的資訊,舉例來說,做成一個可下載的名片。

另一個例子將內容轉成機器可以閱讀,透過語義屬性值達到機器可讀性,而這個標準就是 WAI-ARIA。如前所述,我的 web accessibility and ARIA primer 文章中,你可以指派角色到標籤元素,協助輔助技術了解文件的結構,以及元件做了什麼,又讓如何與之互動。

深入討論機器可讀屬性在微格式和 ARIA 上的應用,已經超過本文的範圍。不過他們在語義標籤的議題中佔有一席之地,你可以再去深入了解。

想了解微格式,可以看看我在部落格分作 8 篇系列文章 Getting Semantic With Microformats。想了解 ARIA,可以看我寫的 Script Junkie primer

說到純粹主義者…

現在我已經給你語義標籤的基礎概念,並且提供一些資訊和資源,幫助你開始。在結束這段旅程之前,我們先繞出去,談一下我前面提過的純粹主義者思維。

當我開始接觸網頁標準時,我很驕傲地自稱「標準擁護者」,並且反對任何非語義、沒有遵循標準的作法。我採用了純粹主義者的觀點,而且老實說,這些情緒中,許多成份只是自我感覺良好,和滿腔的正義感,而非真心擁抱網頁的本質。

現實是,非語義的標籤在今日仍然存在。只要 CSS 需要支援跨瀏覽器,就必須得用到一些 <div> 和 <span>,才能達到某些目的。只要有系統限制設計師和開發人器去改變標籤,就還是會有非語義元素、甚至是無效的標籤出現。而且別忘了,還有我說過的主觀性… 不是任何人都同意 POSH 的每一項作法。

即使是有效性,仍然有例外。在這篇文章開頭中,我說語義標籤同時也是有效的標準。不過,當你擁抱 WAI-ARIA 角色來增加意義,幫助使用輔助技術的人,你的標籤就無法通過有效性驗證,因為這些屬性沒有定義 HTML 或 XHTML 的 DTD 中。雖有解決的辦法,,不過問題是哪個更為重要,是一些有效性的錯誤,或是讓網站或應用程式更具親和力?

我的想法是,一個純粹主義者必然會受到限制。成為純粹主義者,會限制你理解現今網頁開發人員究竟受了什麼束縛。成為純粹主義者,也會使得如何在這樣的限制中,展開對話變得更不可能。

就我自己而言,我仍然自認為是個標準擁護者。不過時至今日,我尋求平衡勝過一種尋求語義標籤的「正確感」。我追求精簡的標籤。我追求有效性的標準。但同時也我使用非語義的 <div> 和 <span>。我也許為會了機器的可讀性,犧牲標籤的有效性。我甚至會使用無法通過驗證的 CSS 屬性。而且我不會為此道歉。這樣並不會讓我變成一個差勁的開發人員,而是讓我成為一個務實的開發人員,一個知道規則是什麼,而且可以為我的網站和用戶,聰明地選擇該例外的時候。

延伸閱讀

這個語義和標準相容標籤的旅程,只是更大議題的一部分。看看下面這些資源,你可以更深入地理解這些議題:

About the Author

Emily Lewis is the author of Microformats Made Simple and an independent web designer. She has been working as a web professional since 1998, dabbling in project management and programming until she realized her true loves (HTML and CSS) and became a front-end developer.

Emily is a web geek of the "standardista" variety, and gets excited about things like usability, semantics, microformats, valid markup and CSS, and accessibility.

In addition to loving all things web, Emily is passionate about community building and knowledge sharing. She is the co-creator and co-manager of Webuquerque, the New Mexico Adobe User Group for web practitioners.

Emily also writes about web design (amongst a range of other topics) on A Blog Not Limited, as well as for industry publications including MIX Online and .net magazine.

Emily speaks about web standards, markup, CSS, accessibility and microformats for various groups and conferences, including the University of New Mexico, the New Mexico Technology Council, InterLab, Environments for Humans and Voices That Matter.

Find Emily on:

More from Emily:

 

Articles