文檔類型 推薦使用 HTML5 的文檔類型申明: <!DOCTYPE html> (建議使用 text/html 格式的 HTML。避免使用 XHTML。XHTML 以及它的屬性,比如 application/xhtml+xml 在瀏覽器中的應用支持與優化空間都十分有限)。 HTML 中最好不要將無 ...
文檔類型
推薦使用 HTML5 的文檔類型申明: <!DOCTYPE html>
(建議使用 text/html 格式的 HTML。避免使用 XHTML。XHTML 以及它的屬性,比如 application/xhtml+xml
在瀏覽器中的應用支持與優化空間都十分有限)。
HTML 中最好不要將無內容元素 [1]的標簽閉合,例如:使用 <br>
而非 <br />
.
HTML 驗證
一般情況下,建議使用能通過標準規範驗證的 HTML 代碼,除非在性能優化和控制文件大小上不得不做出讓步。
使用諸如 W3C HTML validator 這樣的工具來進行檢測。
規範化的 HTML 是顯現技術要求與局限的顯著質量基線,它促進了 HTML 被更好地運用。
不推薦
- <title>Test</title>
- <article>This is only a test.
推薦
- <!DOCTYPE html>
- <meta charset="utf-8">
- <title>Test</title>
- <article>This is only a test.</article>
省略可選標簽
HTML5 規範中規定了 HTML 標簽是可以省略的。但從可讀性來說,在開發的源文件中最好不要這樣做,因為省略標簽可能會導致一些問題。
省略一些可選的標簽確實使得頁面大小減少,這很有用,尤其是對於一些大型網站來說。為了達到這一目的,我們可以在開發後期對頁面進行壓縮處理,在這個環節中這些可選的標簽完全就可以省略掉了。
腳本載入
出於性能考慮,腳本非同步載入很關鍵。一段腳本放置在 <head>
內,比如 <script src="main.js"></script>
,其載入會一直阻塞 DOM 解析,直至它完全地載入和執行完畢。這會造成頁面顯示的延遲。特別是一些重量級的腳本,對用戶體驗來說那真是一個巨大的影響。
非同步載入腳本可緩解這種性能影響。如果只需相容 IE10+,可將 HTML5 的 async 屬性加至腳本中,它可防止阻塞 DOM 的解析,甚至你可以將腳本引用寫在 <head>
里也沒有影響。
如需相容老舊的瀏覽器,實踐表明可使用用來動態註入腳本的腳本載入器。你可以考慮 yepnope 或 labjs。註入腳本的一個問題是:一直要等到 CSS 對象文檔已就緒,它們才開始載入(短暫地在 CSS 載入完畢之後),這就對需要及時觸發的 JS 造成了一定的延遲,這多多少少也影響了用戶體驗吧。
終上所述,相容老舊瀏覽器(IE9-)時,應該遵循以下最佳實踐。
腳本引用寫在 body 結束標簽之前,並帶上 async 屬性。這雖然在老舊瀏覽器中不會非同步載入腳本,但它只阻塞了 body 結束標簽之前的 DOM 解析,這就大大降低了其阻塞影響。而在現代瀏覽器中,腳本將在 DOM 解析器發現 body 尾部的 script 標簽才進行載入,此時載入屬於非同步載入,不會阻塞 CSSOM(但其執行仍發生在 CSSOM 之後)。
所有瀏覽器中,推薦
- <html>
- <head>
- <link rel="stylesheet" href="main.css">
- </head>
- <body>
- <!-- body goes here -->
- <script src="main.js" async></script>
- </body>
- </html>
只在現代瀏覽器中,推薦
- <html>
- <head>
- <link rel="stylesheet" href="main.css">
- <script src="main.js" async></script>
- </head>
- <body>
- <!-- body goes here -->
- </body>
- </html>
語義化
根據元素(有時被錯誤地稱作“標簽”)其被創造出來時的初始意義來使用它。打個比方,用 heading 元素來定義頭部標題,p 元素來定義文欄位落,用 a 元素來定義鏈接錨點,等等。
有根據有目的地使用 HTML 元素,對於可訪問性、代碼重用、代碼效率來說意義重大。
多媒體回溯
對頁面上的媒體而言,像圖片、視頻、canvas 動畫等,要確保其有可替代的接入介面。圖片文件我們可採用有意義的備選文本(alt),視頻和音頻文件我們可以為其加上說明文字或字幕。
提供可替代內容對可用性來說十分重要。試想,一位盲人用戶如何能知曉一張圖片是什麼,要是沒有 @alt 的話。
(圖片的 alt 屬性是可不填寫內容的,純裝飾性的圖片就可用這麼做:alt=""
)。
- <img src="luke-skywalker.jpg" alt="Luke skywalker riding an alien horse">
關註點分離
理解 web 中如何和為何區分不同的關註點,這很重要。這裡的關註點主要指的是:信息(HTML 結構)、外觀(CSS)和行為(JavaScript)。為了使它們成為可維護的乾凈整潔的代碼,我們要儘可能的將它們分離開來。
嚴格地保證結構、表現、行為三者分離,並儘量使三者之間沒有太多的交互和聯繫。
就是說,儘量在文檔和模板中只包含結構性的 HTML;而將所有表現代碼,移入樣式表中;將所有動作行為,移入腳本之中。
在此之外,為使得它們之間的聯繫儘可能的小,在文檔和模板中也儘量少地引入樣式和腳本文件。
清晰的分層意味著:
- 不使用超過一到兩張樣式表(i.e. main.css, vendor.css)
- 不使用超過一到兩個腳本(學會用合併腳本)
- 不使用行內樣式(
<style>.no-good {}</style>
) - 不在元素上使用 style 屬性(
<hr style="border-top: 5px solid black">
) - 不使用行內腳本(
<script>alert('no good')</script>
) - 不使用表象元素(i.e.
<b>
,<u>
,<center>
,<font>
,<b>
) - 不使用表象 class 名(i.e. red, left, center)
HTML 內容至上
不要讓非內容信息污染了你的 HTML。現在貌似有一種傾向:通過 HTML 來解決設計問題,這是顯然是不對的。HTML 就應該只關註內容。
HTML 標簽的目的,就是為了不斷地展示內容信息。
- 不要引入一些特定的 HTML 結構來解決一些視覺設計問題
- 不要將
img
元素當做專門用來做視覺設計的元素 - 圖片和 SVG 圖形能被引入到 HTML 中的唯一理由是它們呈現出了與內容相關的一些信息。
Type 屬性
省略樣式表與腳本上的 type 屬性。鑒於 HTML5 中以上兩者預設的 type 值就是 text/css 和 text/javascript,所以 type 屬性一般是可以忽略掉的。甚至在老舊版本的瀏覽器中這麼做也是安全可靠的。
不推薦
- <link rel="stylesheet" href="main.css" type="text/css">
- <script src="main.js" type="text/javascript"></script>
推薦
- <link rel="stylesheet" href="main.css">
- <script src="main.js"></script>
可用性
如果 HTML5 語義化標簽使用得當,許多可用性問題已經引刃而解。ARIA 規則在一些語義化的元素上可為其添上預設的可用性角色屬性,使用得當的話已使網站的可用性大部分成立。假如你使用 nav
, aside
, main
, footer
等元素,ARIA 規則會在其上應用一些關聯的預設值。
更多細節可參考 ARIA specification
另外一些角色屬性則能夠用來呈現更多可用性情景(i.e. role="tab"
)。
Tab Index 在可用性上的運用
檢查文檔中的 tab 切換順序並傳值給元素上的 tabindex,這可以依據元素的重要性來重新排列其 tab 切換順序。你可以設置 tabindex="-1"
在任何元素上來禁用其 tab 切換。
當你在一個預設不可聚焦的元素上增加了功能,你應該總是為其加上 tabindex
屬性使其變為可聚焦狀態,而且這也會激活其 CSS 的偽類 :focus
。選擇合適的 tabindex
值,或是直接使用 tabindex="0"
將元素們組織成同一 tab 順序水平,並強制干預其自然閱讀順序。
ID 和錨點
通常一個比較好的做法是將頁面內所有的頭部標題元素都加上 ID. 這樣做,頁面 URL 的 hash 中帶上對應的 ID 名稱,即形成描點,方便跳轉至對應元素所處位置。
打個比方,當你在瀏覽器中輸入 URL http://your-site.com/about#best-practices
,瀏覽器將定位至以下 H3 上。
- <h3 id="best-practices">Best practices</h3>
格式化規則
在每一個塊狀元素,列表元素和表格元素後,加上一新空白行,並對其子孫元素進行縮進。內聯元素寫在一行內,塊狀元素還有列表和表格要另起一行。
(如果由於換行的空格引發了不可預計的問題,那將所有元素併入一行也是可以接受的,格式警告總好過錯誤警告)。
- <blockquote>
- <p><em>Space</em>, the final frontier.</p>
- </blockquote>
- <ul>
- <li>Moe</li>
- <li>Larry</li>
- <li>Curly</li>
- </ul>
- <table>
- <thead>
- <tr>
- <th scope="col">Income</th>
- <th scope="col">Taxes</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>$ 5.00</td>
- <td>$ 4.50</td>
- </tr>
- </tbody>
- </table>
HTML 引號
使用雙引號(“”) 而不是單引號(”) 。
不推薦
- <div class='news-article'></div>
推薦
- <div class="news-article"></div>
[1]: 此處的空白元素指的是以下元素:area
, base
, br
, col
, command
, embed
, hr
, img
, input
, keygen
, link
, meta
, param
, source
, track
, wbr