做爲程序員,技術的落實與鞏固是必要的,所以想到寫個系列,名爲 why what or how
每篇文章解釋清楚一個問題。php
做爲 why what or how
的第一章,選一個較爲簡單的話題,什麼是 HTML
?css
HTML
- HyperText Markup Language
,超文本標記語言html
標記語言,一類以固定的形式描述文檔結構或是數據處理細節的語言,通常爲純文本形式,其內容做爲其餘程序的輸入。java
所以,HTML
是一種用於描述網頁的標記語言,純文本,其內容做爲瀏覽器的輸入。瀏覽器會解析 HTML
文本內容,最終呈現頁面。git
在網頁出現前,人們的閱讀習慣是從前日後,從上到下,就像閱讀小說,必須從頭至尾的看完,思惟是單向的,並不存在岔路口。而超文本從字面上理解就是:超出了通常的閱讀習慣,看文章的時候思惟是發散的,即經過連接的形式,跳出當前的思惟流,轉到另一個頁面,故而這些能夠點擊跳轉的區域咱們稱之爲超文本連接
(具體到 HTML
標籤上就是 a
標籤),而具備這種特性的標記語言理所應當的被稱爲超文本標記語言。程序員
那麼爲什麼瀏覽器恰恰要接收 HTML
而不接受其餘的標記語言呢?這就不得不談談 HTML
與瀏覽器的誕生。github
1990
年,Tim Berners-Lee
提出了超文本的概念1991
年,Tim Berners-Lee
在 SGML 的基礎上定義了 HTML
,併發布了 WorldWideWeb
瀏覽器,爲了不同 WWW
混淆,這個瀏覽器後來更名爲 Nexus
。同年發佈了世界第一個站點 info.cern.ch/1993
年,IETF(國際互聯網工程任務組)
正式開始制定 HTML
規範,同年 Mosaic
瀏覽器發佈,Web
的概念正式流行起來,以後的瀏覽器仍然在延用 Mosaic
的圖形化操做界面思想1994
年,Tim Berners-Lee
爲了 Web
發展而成立了 W3C
,同年 Netscape
成立,發佈了第一款商業瀏覽器 Netscape Navigator(FireFox 的前身)
1995
年,IETF
發佈 HTML 2.0
版本,同年 IE 3.0
正式發佈,瀏覽器戰爭爆發1996
年,W3C
接管了 HTML
的標準化工做,同年 Opera
瀏覽器發佈1997
年,W3C
發佈 HTML 3.2
推薦標準1998
年,Netscape
在於 IE
瀏覽器的戰爭中失利,將 Netscape Navigator
開源1999
年,W3C
發佈 HTML 4.0
2000
年,HTML 4.0
成爲 ISO(國際標準化組織)
標準,至此以後 W3C
致力於 XHTML
2002
年,IE
成爲主流瀏覽器2003
年,Safari
攜 Webkit
渲染引擎登場2004
年,因爲 Web
的高速發展,HTML 4.0
中一些不合理的設計以及缺失的特性開始暴露,不滿於 W3C
想要放棄 HTML
,由瀏覽器廠商發起組織了 WHATWG
工做組,推動 HTML
的繼續發展,也就是 HTML5
2004
年,Firefox
登場,第二場瀏覽器戰爭爆發,IE
潰敗2007
年,WHATWG
和 W3C
握手言和,一塊兒制定 HTML5
的標準2008
年,兩個工做組發佈第一份草案,同年 Chrome
攜 V8
解析引擎登場,加速戰爭,統一戰場2014
年,發佈 HTML5
,同時 HTML
再也不基於 SGML ,而是以一門單獨的標記語言出現縱觀瀏覽器與 HTML
的發家史,瀏覽器的起起落落,HTML
版本的更新迭代,源頭都是 Tim Berners-Lee
,或許 HTML
的命名與瀏覽器能解析 HTML
只是一種偶然,但這兩種事物的出現倒是一種必然,而這背後的主導者,是互聯網,Tim Berners-Lee
也僅是執筆而已,爲了記念,他所創做的第一個站點也將被永久保存:info.cern.ch/。web
這是 HTML
中一個 p
標籤,在 HTML
中大部分元素都有着一樣的結構數據庫
只要是符合以上 5
個條件,就是一個合法的 HTML
標籤。編程
固然大部分標籤都有如上的結構,但還有小部分標籤並無標籤內容,所以結束標籤也就沒必要要的,好比引入圖片
<img src="xxx.jpg" />
複製代碼
可是,針對於這種標籤,須要在開始標籤以後加上 /
表明該標記結束。
僅僅定義了標籤固然是不夠的,一個頁面的呈現必須還要一個合理的結構。
而 HTML
結構的定義很簡單:標籤內容是標籤的集合。這就像是函數的遞歸,嵌套的元素就構成了頁面的結構。
在
HTML
中一段文字、換行、或其餘文本內容也是一種元素,屬於文本節點,這種節點僅有內容,而不具有標籤的結構。
正所謂沒有規矩,不成方圓,想要讓瀏覽器認識併成功顯示頁面須要有一個統一的模板,以下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>my site</title>
</head>
<body>
<p>hello world</p>
</body>
</html>
複製代碼
從上到下每一行所表明的含義以下
HTML
文檔,因爲 HTML
的發展,版本迭代了很多,各個版本的文檔聲明又不盡相同,而 HTML5
獨立成一門單獨的標記語言後,就不須要像以前版本同樣寫各類各樣的聲明,所以就簡化爲 <!DOCTYPE html>
。utf-8
的編碼集呈現網頁my site
,一般瀏覽器會將該內容呈如今標題欄上hello world
所以,咱們能夠大體知道,瀏覽器須要咱們提供兩部分的信息
head
的子元素,用於設置瀏覽器,好比編碼方式,視口大小等body
的子元素,用於呈現頁面除此以外,因爲 head
中不須要有結構(信息只要一段一段的給便可,不須要嵌套),所以 head
中的元素只有一層,即沒有子元素。
那麼咱們可使用的標籤都有哪些?
在 head
中所能使用到的標籤總共只有 6
個,以下
定義文檔標題,通知瀏覽器頁面的主體內容,瀏覽器通常將此信息置於標籤欄,同時收藏或查看歷史記錄時,會以該信息做爲關鍵字。形式以下:
<title>文檔標題</title>
複製代碼
爲網頁上全部的超文本連接規定默認地址。瀏覽器在處理 body
中的連接會以該標籤規定的默認地址爲標誌,該標籤主要規定了兩個內容
href
- 全部的連接都以該屬性的值做爲默認連接target
- 規定瀏覽器打開某一連接的方式
_blank
- 在新窗口中打開_self
- 在當前窗口中打開(若是是 iframe
中的文檔,則在當前 iframe
中打開)_parent
- 在父窗口中打開(經常使用於 iframe
嵌套)_top
- 在頂層窗口中打開(經常使用於 iframe
多層嵌套)framename
- 在指定的 iframe
中打開一個簡單的例子
<base href="https://xxx.com" target="_blank" />
複製代碼
樣式標籤,其標籤內容規定了頁面的樣式信息。能夠在 MDN
上查看:CSS 介紹。
腳本標籤,其標籤內容爲瀏覽器須要執行的腳本信息。能夠在 MDN
上查看:JavaScript。
當頁面不支持 script
或是用戶主動關閉了 script
的執行時,瀏覽器將該標籤內容做爲提示信息,用於提示用戶。
通知瀏覽器請求外部資源,豐富網頁內容,或是優化體驗,常見用法以下
icon
<link rel="icon" type="image/x-icon" href="/path/to/icons/favicon.ico" />
複製代碼
如何使用網頁 icon
以及瀏覽器具體對這個 icon
作了什麼能夠查看:詳細介紹HTML favicon
<link rel="stylesheet" type="text/css" href="xxx.css" />
複製代碼
該種方式相信你們都已經耳熟能詳了,主要是讓樣式進行分離,方便管理。
rss
訂閱<link rel="alternate" type="application/rss+xml" title="RSS" href="rss/path" />
複製代碼
這個主要是通知搜索引擎,當前頁面的 rss
訂閱在哪,瀏覽器上的插件也有能力獲取到該信息。
<link rel="canonical" href="main/page/path" />
複製代碼
主要用於搜索引擎,告知當前頁面是附屬於某個頁面,引導搜索引擎去加載主頁面。
<link rel="dns-prefetch" href="//xxx.com" />
複製代碼
通知瀏覽器提早抓取到 xxx.com
站點的 dns
信息,當頁面下有大量關於 xxx.com
站點的請求時,添加該信息會加速數據的獲取。
<link rel="prefetch" href="source/uri" />
複製代碼
通知瀏覽器提早抓取相應資源的內容,當用戶加載該資源時,瀏覽器就會直接從緩存獲取。
<link rel="preconnect" href="//xxx.com" />
複製代碼
通知瀏覽器提早與 xxx.com
站點進行 TCP
連接,加速資源的獲取。
<link rel="prerender" href="//xxx.com" />
複製代碼
通知瀏覽器提早加載 xxx.com
站點的全部內容,當用戶進去該站點時,就會立馬呈現頁面。
以上 4
個內容主要用於提高資源的加載速度,提高用戶體驗。但利弊時同時存在,當瀏覽器加載了大量資源,用戶又不去訪問時,就會照成資源大量消耗又得不到利用的狀況。所以,合理的設置纔是最正確的。
最重要的老是最後出場,meta
單詞意義就爲元數據,該標籤存在主要是幫助瀏覽器設置網頁信息,常見用法以下:
<meta charset="utf-8" />
複製代碼
從 HTML5
開始,用該種方式聲明當前頁面所採用的字符集,至於 HTML5
之前版本的聲明方式,不推薦使用。
<meta http-equiv="refresh" content="3;url=http://www.mozilla.org/" />
複製代碼
通知瀏覽器 3
秒後重定向到 url
所規定的地址。若是地址和當前網頁是同一個地址,也就作到了隔 3
秒刷新一次的效果。
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
複製代碼
通知瀏覽器設置視口,包括 寬度、初始縮放比例、最新縮放比例、最大縮放比例、是否容許用戶進行縮放。
<meta name="author" content="頁面做者" />
<meta name="description" content="頁面大體描述" />
<meta name="keywords" content="頁面關鍵字" />
複製代碼
經常使用到的 name
屬性就是這些,但還有一些不經常使用的屬性,如 application-name
、generator
、referrer
、creator
、robots
等能夠在 MDN - META 上了解。
OK 總結一下就兩點
head
中有 6
個子元素,title
base
style
script
noscript
link
meta
head
中的元素主要是告知瀏覽器一些信息,以及通知瀏覽器或搜索引擎作出相應動做body
就是描述網頁內容的主體了,經過標籤的嵌套來描述頁面的內容。內容相關的標籤主要分爲幾個大類:
至於如何編寫 body
中的內容,能夠參考該篇文章 文檔與網站架構。
網頁佈局是一門藝術,可是 body
中的內容僅僅是標籤的嵌套而已,至於如何編寫出好看耐看的頁面結構,這裏就不過多的深刻了。
這裏列舉一些經常使用的各個分類的標籤
類型 | 經常使用標籤 |
---|---|
塊級標籤 | p h[1-6] header nav main article aside footer div pre |
內聯標籤 | a code em i strong addr |
列表 | ul ol li dl dt dl |
表格 | table tr th td thead tbody tfoot caption |
多媒體 | img audio video |
表單 | form input textarea button |
這裏列舉一下經常使用的通用標籤屬性
屬性名 | 含義 |
---|---|
id | 設置 ID 一個元素僅能擁有一個 id,經常使用於 js 獲取元素 |
class | 設置類名,一個元素能夠有多個類名,用於 css 設置元素樣式 |
data-* | 用於給元素設置一個附加屬性,js 能夠獲取設置的值 |
type | 用於表單元素,表示該元素爲什麼種表單 |
完整的 HTML 標籤可參照該篇文檔 HTML 元素參考 。
想必你們都訪問過 xxx.com/a.jsp
之類的網頁,那麼是否說瀏覽器請求了一個 jsp
文件,並解析展現了網頁?
固然不是,能被瀏覽器解析並最終渲染成頁面的只有 HTML
格式的文本,那麼這種類型的連接又改如何解釋呢?
在互聯網的發展歷程中,開發者發現有不少數據須要從數據庫或是本地的文本文件中獲取,可是手動寫 HTML
文件太過於麻煩。以 java
爲例,若是網站天天都會發生變化,那按照生成 HTML
文件的思路只能是天天生成一個 HTML
文件供用戶訪問,而且天天都要替換它,對很麻煩,那麼該如何解決呢?
這就誕生了 jsp
。仍是上面這個例子,jsp
的解決思路以下
xxx.com/a.jsp
java
程序捕獲到用戶的請求java
程序尋找相應的 jsp
文件java
程序到數據庫或是本地文件中查出相應信息java
程序將這些信息填充到 jsp
文件中java
程序生成 HTML
格式的字符流java
程序將該字符流發送給瀏覽器HTML
格式,開始解析並渲染因此雖然瀏覽器的請求後綴爲 jsp
但最終服務器發送給瀏覽器的仍是 HTML
字符流。相似 ASP/PHP
等都是相似流程,所以 HTML
是單獨於編程語言以外的語言,也能夠說 HTML
是這些語言的輸出,而 JSP/ASP/PHP
只不過輔助了程序進行輸出 HTML
的一箇中間文件而已。
本文敘述了 HTML
標準和瀏覽器的誕生以及不斷迭代的歷史,和一些 HTML
的知識,既然以問句開篇,那麼就以問句收尾,思考下這幾個問題
HTML
標籤的結構如何?HTML
是如何表述整個網頁內容的?HTML
文檔結構是怎樣?head
的做用是什麼?又有哪些子元素?body
是幹嗎用的?經常使用的標籤所表明的意義瞭解了嗎?HTML
與 jsp/asp/php
的關係如何?本文僅僅設計 HTML
不涉及 JS
和 CSS
,本文不在於學習 HTML
在於概括和總結,以及本身對 HTML
的一些見解,用於在已經瞭解 HTML
的基礎上進一步鞏固,至於想系統的學習,推薦幾個網站
該系列全部問題由 minimo
提出,愛你喲~~~