HTML作為頁面的骨架,可能簡單得不值一提,但是要清晰、透徹地寫出一份HTML
可能你需要了解更多
本文知識點如下:
- HTML快速講解
-
meta
元信息 - 語義化
- 代碼規范
HTML快速講解
HTML
叫超文本標記語言
如果你把“超文本標記語言”分開讀,那就很好理解了:超文本(鏈接)、標記
概念清楚了,我們再來看看可能只有一些老頭子才會問的問題(你可以跳過這部分,現在已經可以不關注這個問題了,但有些老文章還會說起這個問題,所以稍微解答下):
XHTML
和XML
是什么鬼
簡單說,我們現在的HTML
,其實是HTML 4.01
(這個東西也有版本的)。但是它并不嚴格,在HTML中即使你不按要求寫上結束標簽,瀏覽器打開可能一樣好好的
為了不讓你亂寫,就有了XHTML
,但是這東西殺傷力太大,對以前的HTML中的錯誤無法包容,很多程序員為了避免重新修改以前雖然錯了但是還能正常顯示的頁面,實際采用XHTML
的很少
然后,HTML5
登場,HTML5
作為新一代標準身份出來,與XHTML
不同的是,HTML5
引入了新特性,同時不破壞以前的代碼
XHTML
現在來看只是作為4和5作為中間的一個產物
最后來說說xml
xml
是SGML
(標準通用標記語言)的一個子集,而HTML
也是SGML
的子集,兩個應用場景不同,xml更關注的是數據
順便提一句,從HTML5
起,HTML
不再堅守SGML
的語法。
來看代碼吧
為了避免每次敲重復的內容以及保持代碼規范,你可以自己寫一個空模板,每次直接使用就行了。下邊是我使用的模板:
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="utf-8" />
<title>網站標題</title>
<meta name="description" content="不超過150個字符">
<!-- 使用最新的IE和chrome -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- 禁止手機上縮放 -->
<meta name ="viewport" content ="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<!-- 禁止百度轉碼 -->
<meta http-equiv="Cache-Control" content="no-siteapp">
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/main.css">
</head>
<body>
</body>
</html>
meta 元信息
meta
有兩個作用(分別對應name
和http-equiv
屬性)
- 提供頁面信息給計算機識別——
name
name
屬性對應網頁內容,以便于搜索引擎機器人查找、分類,其中最常用的是description和keywords;還有就是瀏覽器廠商定義的meta值,譬如ios的諸多屬性移動端頁面必帶的viewport。 - 模擬http響應報頭——
http-equiv
http-equiv
舉一個最常見例子
<meta charset="utf-8">
設置編碼方式,其實它完整寫法是這樣的
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
除了設置編碼,還有cookie,refresh等
如果感興趣,可以讀讀這篇文章
更多的meta標簽,可以參考常用的HTML頭部標簽
語義化
初學者需要避免的是,遇到塊級元素都是<div>
, 行內元素都是<span>
。HTML5引入了更多的語義標簽,比如:
-
<header>
——頁眉 -
<footer>
——頁腳 -
<article>
——文章 -
<nav>
——導航
html5語義化標簽參考
語義化一方面是SEO,另外一方面,自己也更好組織代碼;在后邊實際給大家體會怎么寫語義化的結構,現在先有個概念。
對于IE有些HTML5標簽不支持,可以引入normalize.css。
代碼規范
這部分內容來自mdo,你可以參看原文
語法
- 用兩個空格來代替制表符(tab) -- 這是唯一能保證在所有環境下獲得一致展現的方法。
- 嵌套元素應當縮進一次(即兩個空格)。
- 對于屬性的定義,確保全部使用雙引號,絕不要使用單引號。
- 不要在自閉合(self-closing)元素的尾部添加斜線 -- HTML5 規范中明確說明這是可選的。
- 不要省略可選的結束標簽(closing tag)(例如,</li> 或 </body>)。
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<title>Page title</title>
</head>
<body>
<img src="images/company-logo.png" alt="Company">
<h1 class="hello-world">Hello, world!</h1>
</body>
</html>
HTML5 doctype
為每個 HTML 頁面的第一行添加標準模式(standard mode)的聲明,這樣能夠確保在每個瀏覽器中擁有一致的展現。
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
</head>
</html>
語言屬性
根據 HTML5 規范,強烈建議為 html 根元素指定 lang 屬性,從而為文檔設置正確的語言。這將有助于語音合成工具確定其所應該采用的發音,有助于翻譯工具確定其翻譯時所應遵守的規則等等。
更多關于 lang
屬性的知識可以從 此規范 中了解。
這里列出了語言代碼表。
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
</head>
</html>
IE 兼容模式
IE 支持通過特定的 <meta> 標簽來確定繪制當前頁面所應該采用的 IE 版本。除非有強烈的特殊需求,否則最好是設置為 edge mode,從而通知 IE 采用其所支持的最新的模式。
閱讀這篇 stack overflow 上的文章可以獲得更多有用的信息。
字符編碼
通過明確聲明字符編碼,能夠確保瀏覽器快速并容易的判斷頁面內容的渲染方式。這樣做的好處是,可以避免在 HTML 中使用字符實體標記(character entity),從而全部與文檔編碼一致(一般采用 UTF-8 編碼)。
<head>
<meta charset="utf-8">
</head>
引入 CSS 和 JavaScript 文件
根據 HTML5 規范,在引入 CSS 和 JavaScript 文件時一般不需要指定 type 屬性,因為 text/css 和 text/javascript 分別是它們的默認值。
HTML5 spec links
Using link
Using style
Using script
<!-- External CSS -->
<link rel="stylesheet" href="code-guide.css">
<!-- In-document CSS -->
<style>
/* ... */
</style>
<!-- JavaScript -->
<script src="code-guide.js"></script>
實用為王
盡量遵循 HTML 標準和語義,但是不要以犧牲實用性為代價。任何時候都要盡量使用最少的標簽并保持最小的復雜度。
屬性順序
HTML 屬性應當按照以下給出的順序依次排列,確保代碼的易讀性。
- class
- id, name
- data-*
- src, for, type, href
- title, alt
- aria-*, role
class 用于標識高度可復用組件,因此應該排在首位。id 用于標識具體組件,應當謹慎使用(例如,頁面內的書簽),因此排在第二位。
<a class="..." id="..." data-modal="toggle" href="#">
Example link
</a>
<input class="form-control" type="text">
<img src="..." alt="...">
布爾(boolean)型屬性
布爾型屬性可以在聲明時不賦值。XHTML 規范要求為其賦值,但是 HTML5 規范不需要。
更多信息請參考 WhatWG section on boolean attributes:
元素的布爾型屬性如果有值,就是 true,如果沒有值,就是 false。
如果一定要為其賦值的話,請參考 WhatWG 規范:
如果屬性存在,其值必須是空字符串或 [...] 屬性的規范名稱,并且不要再收尾添加空白符。
簡單來說,就是不用賦值。
<input type="text" disabled>
<input type="checkbox" value="1" checked>
<select>
<option value="1" selected>1</option>
</select>
減少標簽的數量
編寫 HTML 代碼時,盡量避免多余的父元素。很多時候,這需要迭代和重構來實現。請看下面的案例:
<!-- Not so great -->
<span class="avatar">
<img src="...">
</span>
<!-- Better -->
<img class="avatar" src="...">