
大家好我是落塵,一名新進晉級的菜鳥小編,也是一名前端開發攻城獅,從今天起帶大家重新了解前端,重新學習前端,讓大家有新的了解,每天都會更新些前端知識,如果小主們覺得還可以那就關注一下吧!
我們平時寫 HTML 語言,都習慣把關注點放到各種标簽上,很少去深究它的文法。我想你應該會有模糊的感覺,HTML 這樣的語言,跟 JavaScript 這樣的語言會有一些本質的不同。
實際上,JavaScript 語言我們把它稱為“程式設計語言”,它最大的特點是圖靈完備的,我們大緻可以了解為“包含了表達一切邏輯的能力”。像 HTML 這樣的語言,我們稱為“标記語言(mark up language)”,它是純文字的一種更新,“标記”一詞的概念來自:編輯審稿時使用不同顔色筆所做的“标記”。
在上世紀 80 年代,“富文本”的概念在計算機領域的熱門,猶如如今的“AI”和“區塊鍊”,而 Tim Berners-Lee 當時去設計 HTML,也并非是憑空造出來,他使用了當時已有的一種語言:SGML。
SGML 是一種古老的标記語言,可以追溯到 1969 年 IBM 公司所使用的技術,SGML 十分複雜,嚴格來說,HTML 是 SGML 中規定的一種格式,但是實際的浏覽器沒有任何一個是通過 SGML 引擎來解析 HTML 的。
今天的 HTML 仍然有 SGML 的不少影子,那麼接下來我們就從 SGML 的一些特性來學習一下 HTML。這裡我最想講的是 SGML 留給 HTML 的重要的遺産:基本文法和 DTD。
基本文法
首先,HTML 作為 SGML 的子集,它遵循 SGML 的基本文法:包括标簽、轉義等。
SGML 還規定了一些特殊的節點類型,在我們之前的 DOM 課程中已經講過幾種節點類型,它們都有與之對應的 HTML 文法,我們這裡複習一下:
這裡我們從文法的角度,再逐個具體了解一下。
标簽文法
标簽文法産生元素,我們從文法的角度講,就用“标簽”這個術語,我們從運作時的角度講,就用“元素”這個術語。
HTML 中,用于描述一個元素的标簽分為開始标簽、結束标簽和自閉合标簽。開始标簽和自閉合标簽中,又可以有屬性。
- 開始标簽:
- 帶屬性的開始标簽:
- 結束标簽:
- 自閉合标簽:
HTML 中開始标簽的标簽名稱隻能使用英文字母。
這裡需要重點講一講屬性文法,屬性可以使用單引号、雙引号或者完全不用引号,這三種情況下,需要轉義的部分都不太一樣。
屬性中可以使用文本實體(後文會介紹)來做轉義,屬性中,一定需要轉義的有:
- 無引号屬性:
五種字元&
- 單引号屬性:
'
兩種字元&
- 雙引号屬性:
"
兩種字元&
一般來說,靈活運用屬性的形式,是不太用到文本實體轉義的。
文本文法
在 HTML 中,規定了兩種文本文法,一種是普通的文本節點,另一種是 CDATA 文本節點。
文本節點看似是普通的文本,但是,其中有兩種字元是必須做轉義的:
<
和
&
。
如果我們從某處拷貝了一段文本,裡面包含了大量的
<
和
&
,那麼我們就有麻煩了,這時候,就輪到我們的 CDATA 節點出場了。
CDATA 也是一種文本,它存在的意義是文法上的意義:在 CDATA 節點内,不需要考慮多數的轉義情況。
CDATA 内,隻有字元組合
]]>
需要處理,這裡不能使用轉義,隻能拆成兩個 CDATA 節點。
注釋文法
HTML 注釋文法以
結尾,注釋的内容非常自由,除了
-->
都沒有問題。
如果注釋的内容一定要出現
-->
,我們可以拆成多個注釋節點。
DTD 文法(文檔類型定義)
SGML 的 DTD 文法十分複雜,但是對 HTML 來說,其實 DTD 的選項是有限的,浏覽器在解析 DTD 時,把它當做幾種字元串之一,關于 DTD,我在本篇文章的後面會詳細講解。
ProcessingInstruction 文法(處理資訊)
ProcessingInstruction 多數情況下,是給機器看的。HTML 中規定了可以有 ProcessingInstruction,但是并沒有規定它的具體内容,是以可以把它視為一種保留的擴充機制。對浏覽器而言,ProcessingInstruction 的作用類似于注釋。
ProcessingInstruction 包含兩個部分,緊挨着第一個問号後,空格前的部分被稱為“目标”,這個目标一般表示處理 ProcessingInstruction 的程式名。
剩餘部分是它的文本資訊,沒有任何格式上的約定,完全由文檔編寫者和處理程式的編寫者約定。
DTD
現在我們來講一下 DTD,DTD 的全稱是 Document Type Defination,也就是文檔類型定義。SGML 用 DTD 來定義每一種文檔類型,HTML 屬于 SGML,在 HTML5 出現之前,HTML 都是使用符合 SGML 規定的 DTD。
如果你是一個上個時代走過來的前端,一定還記得 HTML4.01 有三種 DTD。分别是嚴格模式、過渡模式和 frameset 模式。
複制代碼