DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> HTML基礎知識 >> HTML5詳解 >> [譯][轉]避免常見的六種html5錯誤用法
[譯][轉]避免常見的六種html5錯誤用法
編輯:HTML5詳解     

本文根據原文對譯文做了簡單的一些修改,增加了一些可能引起誤解的英文原文。

一、不要使用section代替div

人們在標簽使用中最常見到的錯誤之一就是隨意將Html5的<section>等價於<div>——具體地說,就是直接用作替代品(用於樣式)。在XHTML或者Html4中,我們常看到這樣的代碼:

<!-- Html 4-style code --><div id="wrapper"> <div id="header"> <h1>My super duper page</h1> <!-- Header content --> </div> <div id="main"> <!-- Page content --> </div> <div id="secondary"> <!-- Secondary content --> </div> <div id="footer"> <!-- Footer content --> </div></div>

而現在在Html5 中,會是這樣:

<!-​​- 請不要復制這些代碼!這是錯誤的!--><section id="wrapper"> <header> <h1>My super duper page</h1> <!-- Header content --> </header> <section id="main"> <!-- Page content --> </section> <section id="secondary"> <!-- Secondary content --> </section> <footer> <!-- Footer content --> </footer></section>

這樣使用並不正確:<section>並不是樣式容器[wrapper]。<section>元素表示的是內容中用來幫助構建文檔概要的語義部分。它應該包含一個頭部[heading]。如果你想找一個用作頁面容器的元素(就像HTML或者XHtml的風格),那麼考慮如Kroc Camen所說,直接把樣式寫到body元素上吧。如果你仍然需要額外的樣式容器,還是繼續使用div吧。

基於上述思想,下面才是正確的使用Html5和一些ARIA roles特性的例子(注意,根據你自己的設計,你也可能需要加入div)

<body> <header> <h1>My super duper page</h1> <!-- Header content --> </header> <div role="main"> <!-- Page content --> </div> <aside role="complementary"> <!-- Secondary content --> </aside> <footer> <!-- Footer content --> </footer></body>

如果你還是無法確定使用哪種元素,那麼我建議你參考Html5 sectioning content element flowchart。

二、只在需要的時候使用header和hgroup

寫不需要寫的標簽當然是毫無意義的。不幸的是,我經常看到<header>和<hgroup>被無意義的濫用。你可以閱讀一下關於<header>和<hgroup>元素的兩篇文章做一個詳細的了解,其中內容簡單總結如下:

  • <header>元素表示的是一組介紹性或者導航性質的輔助文字,經常用作section的頭部。
  • 當頭部有多層結構時,比如有子頭部,副標題,各種標識文字等,使用<hgroup>將h1-h6元素組合起來作為section的頭部。

<header>

由於header可以在一個文檔中使用多次,可能使得這樣代碼風格受到歡迎:

<!-​​- 請不要復制這段代碼!此處並不需要header --><article> <header> <h1>My best blog post</h1> </header> <!-- Article content --></article>

如果你的<header>元素只包含一個頭部元素,那麼丟棄<header>元素吧。既然<article> 元素已經保證了頭部會出現在文檔概要中,而<header>又不能包含多個元素(如上文所定義的),那麼為什麼要寫多余的代碼。簡單點寫成這樣就行了:

<article> <h1>My best blog post</h1> <!-- Article content --></article>

<hgroup>的錯誤使用

在headers這個主題上,我也經常看到hgroup的錯誤使用。有時候不應該同時使用<hgroup>和<header>:

  • 如果只有一個子頭部
  • 如果hgroup自己就能工作的很好。

第一個問題一般是這樣的:

<!-​​- 請不要復制這段代碼!此處不需要hgroup --><header> <hgroup> <h1>My best blog post</h1> </hgroup> <p>by Rich Clark</p></header>

此例中,直接拿掉hgroup,讓heading 裸奔吧。

<header> <h1>My best blog post</h1> <p>by Rich Clark</p></header>

第二個問題是另一個不必要的例子:

<!-​​- 請不要復制這段代碼!此處不需要header --><header> <hgroup> <h1>My company</h1> <h2>Established 1893</h2> </hgroup></header>

如果<header>唯一的子元素是<hgroup>,那還要<header>干神馬?如果<header>中沒有其他的元素(比如多個<hgroup>),還是直接拿掉<header>吧。

<hgroup> <h1>My company</h1> <h2>Established 1893</h2></hgroup>

關於

更多的例子和解釋,請參閱相關文章。

三、不要把所有列表式的鏈接放在nav裡

隨著Html5引入了30個新元素(截止到原文發布時),我們在構造語義化和結構化的標簽時的選擇也變得有些不慎重。也就是說,我們不應該濫用超語義化的元素。不幸的是,nav就是這樣一個被濫用的例子。nav元素的規范描述如下:

The nav element represents a section of a page that links to other pages or to parts within the page: a section with navigation links.

Not all groups of links on a page need to be in a nav element — the element is primarily intended for sections that consist of major navigation blocks. In particular, it is common for footers to have a short list of links to various pages of a site, such as the terms of service, the home page, and a copyright page. The footer element alone is sufficIEnt for such cases; while a nav element can be used in such cases, it is usually unnecessary.

User agents (such as screen readers) that are targeted at users who can benefit from navigation information being omitted in the initial rendering, or who can benefit from navigation information being immediately available, can use this element as a way to determine what content on the page to initially skip or provide on request (or both).

nav元素表示頁面中鏈接到其他頁面或者本頁面其他部分的區塊;包含導航連接的區塊。

注意:不是所有頁面上的鏈接都需要放在nav元素中——這個元素本意是用作主要的導航區塊。舉個具體的例子,在footer中經常會有眾多的鏈接,比如服務條款,主頁,版權聲明頁等等。footer元素自身已經足以應付這些情況,雖然nav元素也可以用在這裡,但通常我們認為是不必要的。

WHATWG Html spec

關鍵的詞語是“主要的”導航。當然我們可以互相噴上一整天什麼叫做“主要的”。而我個人是這樣定義的:

  • 主要的導航(Primary navigation)
  • 站內搜索(Site search)
  • 二級導航(略有爭議)(Secondary navigation (arguably))
  • 頁面內導航(比如很長的文章)(In-page navigation (within a long article, for example))

既然並沒有絕對的對錯,所以根據一個非正式投票以及我自己的解釋,以下的情況,不管你放不放,我反正不放在<nav>中:

  • 分頁控制(Pagination controls)
  • 社交鏈接(雖然有些社交鏈接也是主要導航,比如“關於”“收藏”)(Social links (although there maybe exceptions where social links are the major navigation, in sites like About me or Flavours, for example))
  • 博客文章的標簽(Tags on a blog post)
  • 一篇博客中的博客分類(CategorIEs on a blog post)
  • 三級導航(Tertiary navigation)
  • 過長的footer(Fat footers)

如果你不確定是否要將一系列的鏈接放在<nav>中,問你自己:“它是主要的導航嗎?”為了幫助你回答這個問題,考慮以下首要原則:

  • 如果使用<section>和<hx>也同樣合適,那麼不要用<nav> — HixIE on IRC
  • 為了方便訪問,你會在某個“快捷跳轉”中給這個<nav>標簽加一個鏈接嗎?

如果這些問題的答案是“不”,那就跟<nav>鞠個躬,然後獨自離開吧。

四、figure元素的常見錯誤

<figure>以及<figcaption>的正確使用,確實是難以駕馭。讓我們來看看一些常見的錯誤。

不是所有的圖片都是<figure>上文中

我曾告訴各位不要寫不必要的代碼。這個錯誤也是同樣的道理。我看到很多網站把所有的圖片都寫作figure。看在圖片的份上請不要給它加額外的標簽了。你只是讓你自己蛋疼,而並不能使你的頁面內容更清晰。

規范中將<figure>描述為“一些流動的內容,有時候會有包含於自身的標題說明。一般在文檔流中會作為獨立的單元引用。”這正是figure的美妙之處——它可以從主內容頁移動到sidebar中,而不影響文檔流。這些問題也包含在之前提到的Html5 element flowchart中。

如果純粹只是為了呈現的圖,也不在文檔其他地方引用,那就絕對不是

。其他視情況而定,但一開始可以問自己:“這個圖片是否必須和上下文有關?”如果不是,那可能也不是
(也許是個)。繼續:“我可以把它移動到附錄中嗎?”如果兩個問題都符合,則它可能是<figure>。

Logo並不是figure

進一步的說,logo也不適用於figure。下面是我常見的一些代碼片段:

<!-​​- 請不要復制這段代碼!這是錯的--><header> <h1> <figure> <img src="/img/mylogo.png" alt="My company" class="hide" /> </figure> My company name </h1></header><!-​​- 請不要復制這段代碼!這也是錯的--><header> <figure> <img src="/img/mylogo.png" alt="My company" /> </figure></header>

沒什麼好說的了。這就是很普通的錯誤。我們可以為logo 是否應該是H1 標簽而互相噴到牛都放完回家了,但這裡不是我們討論的焦點。真正的問題在於figure 元素的濫用。figure 只應該被引用在文檔中,或者被section 元素圍繞。我想你的logo 並不太可能以這樣的方式引用吧。很簡單,請勿使用figure。你只需要這樣做:

<header> <h1>My company name</h1> <!-​​- More stuff in here --></header>

figure也不僅僅只是圖片

另一個常見的關於figure的誤解是它只被圖片使用。figure可以是視頻,音頻,圖表,一段引用文字,表格,一段代碼,一段散文,以及任何它們或者其他的組合。

不要把figure局限於圖片。web標准的職責是精確的用標簽描述內容。

五、不要使用不必要的type屬性

這是個常見的問題,但並不是一個錯誤,我認為我們應該通過最佳實踐來避免這種風格。在Html5中,script和style元素不再需要type屬性。然而這些很可能會被你的CMS自動加上,所以要移除也不是那麼的輕松。但如果你是手工編碼或者你完全可以控制你的模板的話,那真的沒有什麼理由再去包含type屬性。所有的浏覽器都認為腳本是Javascript而樣式是CSS樣式,你沒必要再多此一舉了。

<!-​​- 請不要復制這段代碼!它太沉余了! --><link type="text/css" rel="stylesheet" href="css/styles.CSS" /><script type="text/Javascript" src="JS/scripts" /></script>

其實只需要這樣寫:

<link rel="stylesheet" href="CSS/styles.CSS" /><script src="JS/scripts" /></script>

甚至指定字符集的代碼都可以省略掉 ​​。Mark Pilgrim在Dive into Html5的語義化一章中作出了解釋。

六、form屬性的錯誤使用

Html5引入了一些form的新屬性,以下是一些使用上的注意事項:

布爾屬性

一些多媒體元素和其他元素也具有布爾屬性。這裡所說的規則也同樣適用。有一些新的form屬性是布爾型的,意味著它們只要出現在標簽中,就保證了相應的行為已經設置。這些屬性包括:

  • ‧autofocus
  • autocomplete
  • ‧required

坦白的說,我很少看到這樣的。以required為例,常見的是下面這種:

<!-​​- 請不要復制這段代碼! 這是錯的! --><input type="email" name="email" required="true" /><!-​​- 另一個錯誤的例子--><input type="email" name="email" required="1" />

嚴格來說,這並沒有大礙。浏覽器的Html 解析器只要看到required 屬性出現在標簽中,那麼它的功能就會被應用。但是如果你反過來寫equired=”false”呢?

<!-​​- 請不要復制這段代碼! 這是錯的! --><input type="email" name="email" required="false" />

析器仍然會將required屬性視為有效並執行相應的行為,盡管你試著告訴它不要去執行了。這顯然不是你想要的。有三種有效的方式去使用布爾屬性。(後兩種只在xthml中有效)

requiredrequired=""required="required"

上述例子的正確寫法應該是:

<input type="email" name="email" required />
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved