最近關注winter的「重學前端」系列文章,也想把已知的前端知識體系梳理一遍,夯實基礎的同時,總結提高。接下來會從HTML、CSS、JS、性能、網絡安全、框架通識進行分類總結。
<!DOCTYPE>
聲明位於HTML文檔的第一行,處於<html>
以前。<!DOCTYPE>
聲明不是 HTML 標籤;它是指示 web 瀏覽器關於頁面使用哪一個 HTML 版本進行編寫的指令。Doctype不存在或者格式不正確都會致使文檔以兼容模式/混雜模式呈現。<!DOCTYPE HTML>
?HTML5 不基於 SGML,所以不須要對DTD進行引用,可是須要doctype來規範瀏覽器的行爲(讓瀏覽器按照它們該有的方式來運行)
而HTML4.01基於SGML,因此須要對DTD進行引用,才能告知瀏覽器文檔所使用的文檔類型。css
整體上應該分爲三類: HTML5
,HTML4.01
,XHTML
。html
HTML5模式是目前最經常使用的模式。直接在DOCTYPE後面添加html便可。前端
<!DOCTYPE html>
分爲三種模式:嚴格模式(strict)、過分模式(transitional)、Frameset模式。區別在因而否容許使用展現性和棄用元素,以及是否容許使用框架集。html5
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
font
、color
等),不容許使用框架集。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
XHTML是一種比較嚴格的模式,全部元素必須以XML格式編寫。分類和HTML4.01比較相似,分爲嚴格模式、過渡模式、Frameset模式,同時添加了1.1模式。css3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
最後附上各類文檔類型支持的元素列表:HTML5/HTML 4.01/XHTML 元素和有效的 DTDweb
XHTML要求編寫符合XML的語法。主要區別在於:算法
<html>
、<body>
等都用大寫或大小寫混用如<HTML>
、<BODY>
或<Html>
、<Body>
」排版,可是XHTML統一要求須要用<html>
、<body>
小寫。img
標籤裏均可加可不加alt
屬性,可是如今xhtml要求必須加上alt
屬性,否則xhtml驗證將提示錯誤,哪怕alt
的值爲空均可以。<meta>
元素可提供有關頁面的元信息(meta-information),好比針對搜索引擎和更新頻度的描述和關鍵詞。<meta>
標籤位於文檔的頭部,不包含任何內容。<meta>
標籤的屬性定義了與文檔相關聯的名稱/值對。
經常使用列表以下:chrome
<!DOCTYPE html> <!-- H5標準聲明,使用 HTML5 doctype,不區分大小寫 --> <head lang="en"> <!-- 標準的 lang 屬性寫法 --> <meta charset="utf-8"> <!-- 聲明文檔使用的字符編碼 --> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> <!-- 優先使用 IE 最新版本和 Chrome --> <meta name="description" content="不超過150個字符"/> <!-- 頁面描述 --> <meta name="keywords" content=""/> <!-- 頁面關鍵詞 --> <meta name="author" content="name, email@gmail.com"/> <!-- 網頁做者 --> <meta name="robots" content="index,follow"/> <!-- 搜索引擎抓取 --> <meta name="viewport" content="initial-scale=1, maximum-scale=3, minimum-scale=1, user-scalable=no"> <!-- 爲移動設備添加 viewport --> <!-- 設置頁面不緩存 --> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0">
在移動端開發,最常看到head裏面設置了下面這個屬性:json
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" >
經常使用的6個屬性:segmentfault
"width-device"
特殊說明:(IE6,7,8)支持,須要使用css3mediaqueries.js
<!--[if lt IE 9]> <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script> <![endif]>
深刻了解,移步至:移動前端開發之viewport的深刻理解
http-equiv顧名思義,至關於http的文件頭做用。把 content 屬性關聯到 HTTP 頭部。
http-equiv屬性主要有如下幾種參數:
說明:用於設定網頁字符集,便於瀏覽器解析與渲染頁面舉例:
<meta http-equiv="content-Type" content="text/html;charset=utf-8"> <!--舊的HTML,不推薦 --> <meta charset="utf-8"> <!-- HTML5設定網頁字符集的方式,推薦使用UTF-8 -->
說明:用於告知瀏覽器以何種版原本渲染頁面。(通常都設置爲最新模式,在各大框架中這個設置也很常見。)舉例:
<meta http-equiv="X-UA-Compatibel" conent="IE=edge,chrome=1" > <!-- 指定IE和Chrome使用最新版本渲染當前頁面 -->
說明:指定瀏覽器如何緩存某個響應以及緩存多長時間。舉例:
<meta http-equiv="cache-contorl" conent="no-cache">
共有如下幾種用法:
- no-cache: 先發送請求,與服務器確認該資源是否被更改,若是未被更改,則使用緩存。 - no-store: 不容許緩存,每次都要去服務器上,下載完整的響應。(安全措施) - public : 緩存全部響應,但並不是必須。由於max-age也能夠作到相同效果。 - private : 只爲單個用戶緩存,所以不容許任何中繼進行緩存。(好比說CDN就不容許緩存private的響應) - maxage : 表示當前請求開始,該響應在多久內能被緩存和重用,而不去服務器從新請求。例如:max-age=60表示響應能夠再緩存和重用 60 秒。
關於瀏覽器緩存,可移步至:瀏覽器緩存機制
說明:用於設定網頁的到期時間,過時後網頁必須到服務器上從新傳輸。舉例:
<meta htttp-equiv="expires" content="Sunday 26 October 2019 01:00 GMT">
說明:是用於設定禁止瀏覽器從本地機的緩存中調閱頁面內容,設定後一旦離開網頁就沒法從Cache中再調出 。舉例:
<meta http-equiv="pragma" content="no-cache">
說明:若是網頁過時。那麼這個網頁存在本地的cookies也會被自動刪除。舉例:
<meta http-equiv="Set-Cookie" content="name, date"> <!-- 格式 --> <meta http-equiv="Set-Cookie" content="User=Lxxyx; path=/; expires=Sunday, 10-Jan-16 10:00:00 GMT"> <!-- 具體範例 -->
說明:網頁將在設定的時間內,自動刷新並調向設定的網址。舉例:
<meta http-equiv="refresh" content="2;URL=https://segmentfault.com/u/clearlove07"> <!-- 意思是2秒後跳轉向個人博客 -->
根據內容的結構,選擇合適的標籤(代碼語義化)恰當地表示文檔結構,便於開發者閱讀的同時讓瀏覽器的爬蟲和機器很好地解析。
title
、alt
用於解釋名詞或解釋圖片信息、label
標籤的活用。在 HTML5 中,就引入了這個表示 ruby 的標籤,它由ruby、rt、rp 三個標籤來實現。用於註音或者意思的註解。
<ruby> 漢 <rt><rp>(</rp>ㄏㄢˋ<rp>)</rp></rt> </ruby>
好比當沒有上下文時,如何消除歧義呢?這就要用到咱們的 em 標籤,em 表示重音:
今天我吃了一個 <em> 蘋果 </em>。 今天我吃了 <em> 一個 </em> 蘋果。
實際上,不只僅是讀音,這裏的意思也發生了變化。前一段中,表示我今天吃的是蘋果,而不是別的什麼東西,後一段中,則表示我今天只吃了一個蘋果,沒有多吃。
語義化的 HTML 可以支持自動生成目錄結構,HTML 標準中還專門規定了生成目錄結構的算法,即便咱們並不打算深刻實踐語義,也應該儘可能在大的層面上保證這些元素的語義化使用。例如:
<section> <h1>HTML 語義 </h1> <p>balah balah balah balah</p> <section> <h1> 弱語義 </h1> <p>balah balah</p> </section> <section> <h1> 結構性元素 </h1> <p>balah balah</p> </section> ...... </section>
隨着愈來愈多的瀏覽器推出「閱讀模式」,以及各類非瀏覽器終端的出現,語義化的 HTML 適合機器閱讀的特性變得愈來愈重要。
應用了語義化結構的頁面,能夠明確地提示出頁面信息的主次關係,它能讓瀏覽器很好地支持「閱讀視圖功能」,還可讓搜索引擎的命中率提高,同時,它也對視障用戶的讀屏軟件更友好。例如:
<body> <header> <nav> …… </nav> </header> <aside> <nav> …… </nav> </aside> <section>……</section> <section>……</section> <section>……</section> <footer> <address>……</address> </footer> </body>
div
和span
。div
或者p
時,儘可能用p
, 由於p
在默認狀況下有上下間距,對兼容特殊終端有利。b
、font
、u
等,改用css設置。caption
,表頭用thead
,主體部分用tbody
包圍,尾部用tfoot
包圍。表頭和通常單元格要區分開,表頭用th
,單元格用td
。fieldset
標籤包起來,並用legend
標籤說明表單的用途。input
標籤對應的說明文本都須要使用label
標籤,而且經過爲input
設置id
屬性,在lable
標籤中設置for=someld
來讓說明文本和相對應的input關聯起來。注意不要由於html5新標籤的出現,而隨意用之,錯誤的使用確定會事與願違。因此有些地方仍是要用div
的,就是由於div
沒有任何意義的元素,他只是一個標籤,僅僅是用來構建外觀和結構。所以是最適合作容器的標籤。
header
元素表明「網頁」或section
的頁眉。
一般包含h1-h6元素或hgroup,做爲整個頁面或者一個內容塊的標題。也能夠包裹一節的目錄部分,一個搜索框,一個nav,或者任何相關logo。
<header> <hgroup> <h1>網站標題</h1> <h2>網站副標題</h2> </hgroup> </header>
header
使用注意:
footer
元素表明「網頁」或section
的頁腳,一般含有該節的一些基本信息,譬如:做者,相關文檔連接,版權資料。若是footer
元素包含了整個節,那麼它們就表明附錄,索引,提拔,許可協議,標籤,類別等一些其餘相似信息。
<footer> COPYRIGHT@clearlove07 </footer>
footer
使用注意:
hgroup
元素表明「網頁」或section
的標題,當元素有多個層級時,該元素能夠將h1
到h6
元素放在其內,譬如文章的主標題和副標題的組合。
<hgroup> <h1>this is main title</h1> <h2>this is sub title</h2> </hgroup>
hgroup
使用注意:
nav元素表明頁面的導航連接區域。用於定義頁面的主要導航部分。
<nav> <ul> <li>HTML</li> <li>CSS</li> <li>Javascript</li> </ul> </nav>
nav
使用注意:
nav
元素。aside
元素被包含在article
元素中做爲主要內容的附屬信息部分,其中的內容能夠是與當前文章有關的相關資料、標籤、名次解釋等。(特殊的section)
在article
元素以外使用做爲頁面或站點全局的附屬信息部分。最典型的是側邊欄,其中的內容能夠是日誌串連,其餘組的導航,甚至廣告,這些內容相關的頁面。
<article> <p>this is content</p> <aside> <h1>author decalation</h1> <p>i'm a font-end</p> </aside> </article>
aside
使用總結:
aside
在article
內表示主要內容的附屬信息。article
以外則可作側邊欄,沒有article
與之對應,最好不用。section
元素表明文檔中的「節」或「段」,「段」能夠是指一篇文章裏按照主題的分段;「節」能夠是指一個頁面裏的分組。section
一般還帶標題,雖然html5
中section
會自動給標題h1-h6
降級,可是最好手動給他們降級。以下:
<section> <h1>section是啥?</h1> <article> <h2>關於section</h1> <p>section的介紹</p> <section> <h3>關於其餘</h3> <p>關於其餘section的介紹</p> </section> </article> </section>
section
使用注意:
article
、nav
、aside
能夠理解爲特殊的section
,因此若是能夠用article
、nav
、aside
就不要用section
,沒實際意義的就用div
。article
元素最容易跟section
和div
容易混淆,其實article
表明一個在文檔,頁面或者網站中自成一體的內容,其目的是爲了讓開發者獨立開發或重用。譬如論壇的帖子,博客上的文章,一篇用戶的評論,一個互動的widget
小工具。(特殊的section)
<article> <h1>一篇文章</h1> <p>文章內容..</p> <footer> <p><small>版權:html5jscss網所屬,做者:小北</small></p> </footer> </article>
article
使用注意:
article
。section
。div
。address
標籤訂義文檔做者/全部者的聯繫信息。
<address> Written by <a href="mailto:webmaster@example.com">Jon Doe</a>.<br> Visit us at:<br> Example.com<br> Box 564, Disneyland<br> USA </address>
address
使用注意:
address
標籤來描述郵政地址,除非這些信息是聯繫信息的組成部分。address
元素一般被包含在 footer
元素的其餘信息中。header
、footer
、nav
、aside
、article
、section
等)audio
、video
)Canvas
)APIGeolocation
) APIlocalStorage
和sessionStorage
manifest
Notifications
date
、time
、url
、search
、email
、calendar
等Web Worker
Web Socket
History
visibilitychange
PostMeaage
document.querySelector
、document.querySelectorAll
basefont
、big
、center
、font
、s
、u
、tt
、strike
frameset
、frame
、noframes
<!--[if lt IE 9]> <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script> <![endif]>
用戶在線時,保存更新用戶機器上的緩存文件;當用戶離線時,能夠正常訪離線儲存問站點或應用內容
html
標籤設置 manifest
屬性,如 manifest="/offline.appcache"
manifest
文件,manifest
文件的命名建議:xxx.appcache
MIME-type
,即 text/cache-manifest
<!DOCTYPE html> <html manifest="cache.manifest"> .... </html>
cache.manifest文件的書寫方式,就像下面這樣:
CACHE MANIFEST #v0.11 CACHE: js/app.js css/style.css NETWORK: resourse/logo.png FALLBACK: / /offline.html
CACHE
:表示須要離線存儲的資源列表,因爲包含manifest
文件的頁面將被自動離線存儲,因此不須要把頁面自身也列出來。NETWORK
:表示在它下面列出來的資源只有在在線的狀況下才能訪問,他們不會被離線存儲,因此在離線狀況下沒法使用這些資源。不過,若是在CACHE
和NETWORK
中有一個相同的資源,那麼這個資源仍是會被離線存儲,也就是說CACHE
的優先級更高。FALLBACK
:表示若是訪問第一個資源失敗,那麼就使用第二個資源來替換他,好比上面這個文件表示的就是若是訪問根目錄下任何一個資源失敗了,那麼就去訪問offline.html
。html
標籤有 manifest
屬性,它會請求 manifest
文件manifest
文件的內容下載相應的資源而且進行離線存儲manifest
文件與舊的 manifest
文件,若是文件沒有發生改變,就不作任何操做。若是文件改變了,那麼就會從新下載文件中的資源並進行離線存儲manifest
文件以後這些資源才能被瀏覽器從新下載,若是隻是更新了資源而沒有更新manifest
文件的話,瀏覽器並不會從新下載資源,也就是說仍是使用原來離線存儲的資源。manifest
文件進行緩存的時候須要十分當心,由於可能出現一種狀況就是你對manifest
文件進行了更新,可是http的緩存規則告訴瀏覽器本地緩存的manifest
文件還沒過時,這個狀況下瀏覽器仍是使用原來的manifest
文件,因此對於`manifest文件最好不要設置緩存。manifest
文件中的資源的時候,它會一次性下載全部資源,若是某個資源因爲某種緣由下載失敗,那麼此次的全部更新就算是失敗的,瀏覽器仍是會使用原來的資源。window.applicationCache.swapCache()
方法來使之生效,出現這種現象的緣由是瀏覽器會先使用離線資源加載頁面,而後再去檢查manifest是否有更新,因此須要到下次打開頁面才能生效。關於Page Visibility
的原理和應用場景,請移步至阮大神的:Page Visibility API 教程
WebSocket
是一種在單個TCP
鏈接上進行全雙工通訊的協議。
HTTP 協議有一個缺陷:通訊只能由客戶端發起。
這種單向請求的特色,註定了若是服務器有連續的狀態變化,客戶端要獲知就很是麻煩。大多數 Web 應用程序將經過頻繁的異步JavaScript和XML(AJAX)請求實現長輪詢。輪詢的效率低,很是浪費資源(由於必須不停鏈接,或者 HTTP 鏈接始終打開)。
關於WebSocket的使用介紹,請移步至軟大神的:WebSocket 教程
src
用於替換當前元素,href
用於在當前文檔和引用資源之間確立聯繫。
src
是source
的縮寫,指向外部資源的位置,指向的內容將會嵌入到文檔中當前標籤所在位置;在請求src
資源時會將其指向的資源下載並應用到文檔內,例如js
腳本,img
圖片和frame
等元素。
<script src ="js.js"></script>
當瀏覽器解析到該元素時,會暫停其餘資源的下載和處理,直到將該資源加載、編譯、執行完畢,圖片和框架等元素也如此,相似於將所指向資源嵌入當前標籤內。這也是爲何將js腳本放在底部而不是頭部。
href
是Hypertext Reference
的縮寫,指向網絡資源所在位置,創建和當前元素(錨點)或當前文檔(連接)之間的連接,若是咱們在文檔中添加:
<link href="common.css" rel="stylesheet"/>
那麼瀏覽器會識別該文檔爲css
文件,就會並行下載資源而且不會中止對當前文檔的處理。這也是爲何建議使用link
方式來加載css
,而不是使用@import
方式。
二者都是外部引用CSS的方式,可是存在必定的區別:
link
是XHTML
標籤,除了加載CSS
外,還能夠定義RSS
等其餘事務;@import
屬於CSS
範疇,只能加載CSS
。link
引用CSS
時,在頁面載入時同時加載;@import
須要頁面網頁徹底載入之後加載。link
是XHTML
標籤,無兼容問題;@import
是在CSS2.1
提出的,低版本的瀏覽器不支持。link
支持使用Javascript
控制DOM
去改變樣式;而@import
不支持。iframe
可以原封不動的把嵌入的網頁展示出來。iframe
,那麼你只須要修改iframe
的內容,就能夠實現調用的每個頁面內容的更改,方便快捷。iframe
來解決。不容易管理
。iframe
框架結構有時會讓人感到迷惑,若是框架個數多的話,可能會出現上下、左右滾動條,會分散訪問者的注意力,用戶體驗度差
。不利於搜索引擎優化
。設備兼容性差
。增長服務器的http請求
,對於大型網站是不可取的。分析了這麼多,如今基本上都是用Ajax來代替iframe,因此iframe已經漸漸的退出了前端開發
。
從搜索引擎角度來講,title
標籤是用來描述這個頁面的主題的,是一個網頁權重的最高點。但title
標籤並不出如今文章的正文中。而h1
標籤通常出如今文章的正文中,是展現給訪問者的文章的標題。因此說這兩個標籤不只不衝突的,而是合做的關係。一篇文章既要有title
又要有h1
標籤,既突出了文章的主題,又突出了標題和關鍵字,達到雙重優化網站的效果。
通常會把title
和h1
標籤的內容寫成同樣,並且通常狀況下一篇文章最好只用一個h1
標籤,過多的h1
標籤反而會讓搜索引擎迷糊,認不清文章的主題。也就是說,從網站角度看,title
更重於網站信息。title
能夠直接告訴搜索引擎和用戶這個網站是關於什麼主題和內容的。
從文章角度看,h1
則是用於歸納文章主題。用戶進入內容頁,想看到的固然就是文章的內容,h1
文章標題就是最重要的。文章標題最好只有一個,多個h1
會致使搜索引擎不知道這個頁面哪一個標題內容最重要,致使淡化這個頁面的標題和關鍵詞,起不到突出主題的效果。
區別:
h1
突出文章主題,面對用戶,更突出其視覺效果。而title
突出網站標題或關鍵字用。seo
看,title
權重比h1
高,適用性比h1
廣。一個好的網站是h1
和title
並存,既突出h1
文章主題,又突出網站主題和關鍵字。達到雙重優化網站的效果。
它們的區別就再於一個是物理元素,一個是邏輯元素。
物理元素所強調的是一種物理行爲,好比說我把一段文字用b
標記加粗了,個人意思是告訴瀏覽器應該給我加粗了顯示這段文字,從單詞的語義也能夠分析得出,b
是Bold
(加粗)的簡寫,因此這個B
標記所傳達的意思只是加粗,沒有任何其它的做用。
而Strong
咱們從字面理解就能夠知道他是強調的意思,因此咱們用這個標記向瀏覽器傳達了一個強調某段文字的消息,而這個Strong
就是咱們所說的邏輯元素,他是強調文檔邏輯的,並不是是通知瀏覽器應該如何顯示。
也就是說,這兩對標籤最大區別就是一個給搜索引擎看的,一個是給用戶看的。就用b
和strong
標籤作例子吧。b
標籤和strong
標籤給咱們的主觀感覺都是加粗,但對搜索引擎來講b
標籤和普通的文字並無什麼區別,而strong
標籤倒是起強調做用的。也就是說若是你想讓搜索引擎認爲你的某句話很重要時那就用strong
標籤。若是隻是想讓用戶看到加粗的效果,那就用b
標籤。
同理如em
標籤也是針對搜索引擎來起做用的,i
標籤只是讓用戶看到展現的是斜體。
a
、b
、span
、img
、input
、strong
、select
等div
、ul
、li
、ol
、dl
、dd
、dt
、h1-h6
等br
hr
img
input
link
meta
等label
標籤用來定義表單控件的關係:當用戶選擇label
標籤時,瀏覽器會自動將焦點轉到和label
標籤相關的表單控件上。
<!-- 方法一 --> <labek for="moible">Mobile: </for> <input type="number" id="mobile" placeholder="請輸入電話號碼" /> <!-- 方法二 --> <label> name: <input tpye="text" placeholder="請輸入你的名字" /> </label>