HTML/HTML5 基礎知識 | 面試題專用

2021-05-04 03:00:15

HTML/HTML5 基礎知識 | 面試題專用

DTD 介紹

  • DTD(Document Type Definition 檔案型別定義)是一組機器可讀的規則,它們定義 XML 或 HTML 的特定版本中所有允許元素及它們的屬性和層次關係的定義。在解析網頁時,瀏 覽器將使用這些規則檢查頁面的有效性並且採取相應的措施。
  • DTD 是對 HTML 檔案的宣告,還會影響瀏覽器的渲染模式(工作模式)

SGML 、 HTML 、XML 和 XHTML 的區別?

  • SGML 是標準通用標示語言,是一種定義電子檔案結構和描述其內容的國際標準語言, 是所有電子檔案標示語言的起源
  • HTML(HyperText Markup Language)是超檔案標示語言,它定義了網頁內容的含義和結構。
  • XML 是可延伸標示語言是未來網頁語言的發展方向,XML 和 HTML 的最大區別就在於 XML 的標籤是可以自己建立的,數量無限多,而 HTML 的標籤都是固定的而且數量有限。
  • XHTML 是一個基於 XML 的標示語言,他與 HTML 沒什麼本質的區別,但他比 HTML 更加嚴格。
  • 為了規範 HTML,W3C 結合 XML 制定了 XHTML1.0 標準,這個標準沒有增加任何新的標籤,只是按照 XML 的要求來規範 HTML。兩者最主要的區別是:

    • 檔案頂部 doctype 宣告不同,XHTML 的 doctype 頂部宣告中明確規定了xhtml DTD的寫法
    • 元素必須始終正確巢狀
    • 標籤必須始終關閉
    • 標籤名必須小寫
    • 特殊字元必須跳脫
    • 檔案必須有根元素
    • 屬性值必須用雙引號 "" 括起來
    • 禁止屬性最小化(例如,必須使用 checked="checked" 而不是 checked

DOCTYPE 有什麼用?

  • <!DOCTYPE> 宣告位於 HTML 檔案中的第一行,處於 <html> 標籤之前。告知瀏覽器的解析器使用標準模式渲染檔案。DOCTYPE 不存在或格式不正確會導致檔案以相容模式呈現。
// 返回當前檔案關聯的檔案型別定義(DTD),如果當前檔案沒有 DTD,則該屬性返回 null。
document.doctype

標準模式與相容模式各有什麼區別?它們有何意義?

  • 標準模式:又稱嚴格模式,是指瀏覽器按照 W3C 標準解析程式碼。

    • 標準模式的渲染方式和 JS 引擎的解析方式都是以該瀏覽器支援的最高標準執行。
  • 相容模式:又稱怪異模式或混雜模式,是指瀏覽器用自己的方式解析程式碼。

    • 在相容模式中,頁面以寬鬆的向後相容的方式顯示,模擬老式瀏覽器的行為以防止站點無法運作。
  • 如何區分

    • 在 HTML4.01 標準中,瀏覽器解析時到底使用標準模式還是相容模式,與網頁中的 DTD 直接相關,因為 HTML 4.01 基於 SGML,DTD 規定了標示語言的規則,這樣瀏覽器才能正確地呈現。 且有三種
    • HTML5 不基於 SGML,因此不需要對 DTD 進行參照。只需要在頂部宣告 <!DOCTYPE html>
  • 目的:防止呈現檔案時瀏覽器切換到 「相容模式」。
  • 怪異模式和標準模式
  • 怪異模式(Quirks Mode)對 HTML 頁面的影響

頁面匯入樣式時,使用 link 和 @import 有什麼區別?

  • link 屬於 XHTML 標籤,除了載入 CSS 外,還能用於定義 RSS,定義 rel 連線屬性等作用;而 @import 是 CSS 提供的,只能用於載入 CSS;
  • 頁面被載入的時,link 會同時被載入,而 @import 參照的 CSS 會等到頁面被載入完再載入;
  • @import 是CSS2.1 提出的,只在 IE5 以上才能被識別,而 link 是 XHTML 標籤,無相容問題;
  • link 方式的樣式的權重高於 @import 的權重。

HTML 中 form 裡 action 方法的 Get 和 Post 有什麼區別?

  • Get:Form 的預設方法。
  • Get 是用來從伺服器上獲得資料。Post 是用來向伺服器上傳遞資料
  • Get 將表單中資料的按照 name=value 的形式,新增到 action 所指向的 URL 後面,並且兩者使用 "?" 連線,而各個變數之間使用 "&" 連線。Post 是將表單中的資料放在 form 的資料體中,按照變數和值相對應的方式,傳遞到 action 所指向 URL
  • Get 是不安全的,因為在傳輸過程,資料被放在請求的 URL 中。Post 的所有操作對使用者來說都是不可見的,其放置 request body 中
  • Get 傳輸的資料量小,這主要是因為受 URL 長度限制。Post 可以傳輸大量的資料,所以在上傳檔案只能使用 Post
  • Get 限制 Form 表單的資料集的值必須為 ASCII 字元。Post 支援整個 ISO10646 字元集
  • Get 請求瀏覽器會主動 cache。Post 支援不會
  • Get 請求引數會被完整保留在瀏覽歷史記錄中。Post 中的引數不會被保留。
  • GET 和 POST 本質上就是 TCP 連結,並無差別。但是由於 HTTP 的規定和瀏覽器/伺服器的限制,導致他們在應用過程中體現出一些不同。
  • GET 產生一個 TCP 封包;POST 產生兩個 TCP 封包。

Meta viewport 原理是什麼?

  • meta viewport 標籤的作用是讓當前 viewport 的寬度等於裝置的寬度,同時當設定 user-scalbale="no" 時不允許使用者進行手動縮放
  • viewport 的原理:行動端瀏覽器通常都會在一個比行動端螢幕更寬的虛擬視窗中渲染頁面,這個虛擬視窗就是 viewport;目的是正常展示沒有做行動端適配的網頁,讓他們完整的展示給使用者;
  • viewport 屬性值
屬性描述
width裝置的虛擬視口的寬度。
height裝置的虛擬視口的高度。
device-width裝置螢幕的物理寬度。
device-height裝置螢幕的物理高度。
initial-scale存取頁面時的初始縮放。1.0無法縮放。
user-scalable允許裝置放大和縮小,值為 yes 或 no。
minimum-scale允許使用者的最小縮放值,1.0 表無法縮放。
maximum-scale允許使用者的最大縮放值,1.0 表無法縮放。
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

Meta 的目的是什麼?

  • meta 元素可用於包含描述 HTML 檔案屬性的名稱/值對,如作者,字元編號,關鍵字列表,檔案作者等資訊
<!DOCTYPE html>
<html>
  <head>
    <!-- 推薦 Meta Tags -->
    <meta charset="utf-8" />
    <meta name="language" content="english" />
    <meta http-equiv="content-type" content="text/html" />
    <meta name="author" content="Author Name" />
    <meta name="designer" content="Designer Name" />
    <meta name="publisher" content="Publisher Name" />
    <meta name="no-email-collection" content="[email protected]" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />

    <!-- 搜尋引擎優化 Meta Tags -->
    <meta name="description" content="Project Description" />
    <meta
      name="keywords"
      content="Software Engineer,Product Manager,Project Manager,Data Scientist"
    />
    <meta name="robots" content="index,follow" />
    <meta name="revisit-after" content="7 days" />
    <meta name="distribution" content="web" />
    <meta name="robots" content="noodp" />

    <!-- 可選 Meta Tags-->
    <meta name="distribution" content="web" />
    <meta name="web_author" content="" />
    <meta name="rating" content="" />
    <meta name="subject" content="Personal" />
    <meta name="title" content=" - Official Website." />
    <meta name="copyright" content="Copyright 2020" />
    <meta name="reply-to" content="" />
    <meta name="abstract" content="" />
    <meta name="city" content="Bangalore" />
    <meta name="country" content="INDIA" />
    <meta name="distribution" content="" />
    <meta name="classification" content="" />

    <!-- 移動裝置上 HTML 頁面的 Meta Tgas -->
    <meta name="format-detection" content="telephone=yes" />
    <meta name="HandheldFriendly" content="true" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="apple-mobile-web-app-capable" content="yes" />

    <!-- http-equiv Tags -->
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />

    <title>HTML5 Meta Tags</title>
  </head>
  <body>
    ...
  </body>
</html>
  • Meta Refresh
<!-- 在5秒鐘內重定向到提供的 URL。設定為0可立即重定向 -->
<meta http-equiv="refresh" content="3;url=https://juejin.cn/user/96412754251390" />

什麼是替換元素與非替換元素

  • 替換元素:就是瀏覽器根據其標籤的元素屬性來判斷顯示具體的內容的元素,且元素一般擁有固定的尺寸(寬高或寬高比)。

    • 在 html 中像這樣的元素有 imginputtextareaselectobject,這些都是替換元素,這些元素都沒有實際的內容。
  • 非替換元素:html 中大多數都是非替換元素,他們直接將內容告訴瀏覽器,直接顯示出來。

    • 如:p標籤,瀏覽器會直接顯示 p標籤裡的內容。
  • tips:替換元素和非替換元素不僅是在行內元素中有,塊級元素也有替換和非替換之分,比如嵌入的檔案 iframeaudiocanvas 在某些情況下也為替換元素。

塊級元素和行內元素的區別?

  • HTML4.01 中,元素被分成兩大類:inlink(行內元素)與 block(塊級元素)。區別如下:
塊級元素行內元素
獨佔一行不獨佔一行
可以設定寬高(盒模型)不可以設定寬高,寬高由元素內部的內容決定,padding 和 margin 的 top/bottom 不會對元素生效
可以包含行內元素和其他塊級元素行內元素只能包含文字和其他行內元素。

塊級元素和行內元素分別有哪些? 空(void)元素有哪些?

  • CSS 規範規定,每個元素都有 display 屬性,每個元素都有預設的 display 值。例如:

    • div 預設display 屬性值為 block,為塊級元素;
    • span 預設 display 屬性值為 inline,為行內元素。
  • 塊級元素:

    • <h1>-<h6><p><div><ul><ol><form><table><address><blockquote><center><dir><dl><fieldset><hr><menu><noscript><pre><noframes><isindex>
    • 當元素的 display 屬性為 blocklist-itemtable 時,該元素將成為 「塊級元素」。
  • 行內元素:

    • <a><img><input><span><textarea><label><select><abbr><acronym><b><bdo><big><br><cite><code><dfn><em><font><i><kbd><q><s><samp><small><strike><strong><sub><sup><tt><u>
    • 當元素的 display 屬性為 inlineinline-blockinline-table 時,該元素將成為 「行內元素」
  • 常見的空元素:標籤內沒有內容的 HTML 標籤被稱為空元素。

    • <br><hr><img><input><link><meta>
  • 不常見的空元素:<area><base><col><command><embed><keygen><param><source> <track><wbr>

什麼是可選標籤?為什麼要使用它?

  • 在 HTML 中,某些元素具有可選標記。實際上,即使元素本身是必需的,也可以從 HTML 檔案中完全刪除某些元素的開始和結束標籤。
  • plitdtrthhtmlheadbody 等。如:
<p>Paragraph one.
<p>Paragraph two.
<p>Paragraph three.
  • 您不必提供 </p> 結束標籤。瀏覽器會檢測到它需要它們,並且無論如何都會正確顯示在 DOM 中。但這可能帶給你編寫上的困難!
  • 您可以節省一些位元組並減少需要在 html 檔案中下載的位元組。
為了便於閱讀,當您的標籤內有內容/文字時,帶上結束標籤。

簡述一下 src 與 href 的區別?

  • src 用於參照資源,替換當前元素;href 用於在當前檔案和參照資源之間確立聯絡。
  • href(hyperReference)即超文字參照:瀏覽器遇到並行下載資源,不阻塞頁面解析,與 link 引入 css 一樣,瀏覽器並行下載 css 不阻塞頁面解析

    • href 是指向網路資源所在位置,建立和當前元素(錨點)或當前檔案(連結)之間的連結,用於超連結。
  • src (resource)即資源:當瀏覽器遇到 src 時,會暫停頁面解析,直到該資源下載或執行完畢,這也是script 標籤之所以放底部的原因

    • src 是指向外部資源的位置,指向的內容將會嵌入到檔案中當前標籤所在位置;
    • 在請求 src 資源時會將其指向的資源下載並應用到檔案內,例如 js 指令碼,img 圖片和 frame 等元素。
    • 當瀏覽器解析到該元素時,會暫停其他資源的下載和處理,直到將該資源載入、編譯、執行完畢,圖片和框架等元素也如此,類似於將所指向資源嵌入當前標籤內。這也是為什麼將 js 指令碼放在底部而不是頭部。

img 上 title 與 alt

  • title 是滑鼠放在圖片上面時顯示的文字,title 是對圖片的描述和進一步的說明。
  • alt 定義了影象的備用文字描述。
  • tips:瀏覽器並非總是會顯示影象。當有下列情況時,alt 屬性可以為影象提供替代的資訊:

    • 非視覺化瀏覽器(Non-visual browsers)(比如有視力障礙的人使用的音訊瀏覽器)
    • 使用者選擇不顯示影象(比如為了節省頻寬,或出於隱私等考慮不載入包括圖片在內的第三方資原始檔)
    • 影象檔案無效,或是使用了不支援的格式
    • 瀏覽器禁用影象等
    • tips:建議儘可能地通過 alt 屬性提供一些有用的資訊。
<!-- × -->
<img src="wenhao.jpg" alt="圖片" />

<!-- √ -->
<img src="wenhao.jpg" alt="滿臉問號的男人" />
  • 影象上 alt 屬性的用途是什麼?

    • 如果使用者無法檢視影象,alt 屬性將為影象提供可選資訊。alt 屬性應該用來描述任何影象,除了那些僅用於裝飾目的的影象,在這種情況下,應該將其留空。
    • 裝飾性影象應具有空 alt 屬性。
    • 網路爬蟲使用 alt 標籤來理解影象內容,因此它們被認為對搜尋引擎優化(SEO)很重要。
    • 在 alt 標籤的末尾增加可存取性。
  • img

為什麼在 img 標籤中使用 srcset 屬性?請描述瀏覽器遇到該屬性後的處理過程。

  • 為了設計響應式圖片。我們可以使用兩個新的屬性 srcsetsizes 來提供更多額外的資源影象和提示,幫助瀏覽器選擇正確的一個資源。
  • srcset:定義了我們允許瀏覽器選擇的影象集,以及每個影象的大小。
  • sizes:定義了一組媒體條件(例如螢幕寬度)並且指明當某些媒體條件為真時,什麼樣的圖片尺寸是最佳選擇。
  • 處理過程:

    • 檢視裝置寬度
    • 檢查 sizes 列表中哪個媒體條件是第一個為真
    • 檢視給予該媒體查詢的槽大小
    • 載入 srcset 列表中參照的最接近所選的槽大小的影象
<img srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 2000w" src="..." alt="">

noscript 標籤的作用

  • <noscript> 元素用來定義在指令碼未被執行時的替代內容(文字)。
  • <noscript> 標籤中的內容只有在下列情況下才會顯示出來:

    • 瀏覽器不支援指令碼
    • 瀏覽器支援指令碼,但指令碼被禁用
<!-- 給予使用者友好的提示! -->
<noscript>您的瀏覽器不支援 JavaScript!</noscript>

label 的作用是什麼?是怎麼用的?

  • label 標籤定義表單控制間的關係,當使用者選擇該標籤時,瀏覽器會自動將焦點轉到和標籤相關的表單控制元件上。
  • 兩種用法:一種是 id 繫結,一種是巢狀
<label for="select">愛我</label>
<input type="radio" id="select" name="love" value="love" />
<label>恨我<input type="radio" name="hate" value="hate" /></label>

title 與 h1 的區別、b 與 strong 的區別、i 與 em 的區別?

  • <title><h1> 的區別

    • <title> 用於網站資訊標題,一個網站可以有多個 title,seo 權重高於 h1
    • <h1> 概括的是文章主題,一個頁面最好只用一個 h1,seo 權重低於 title
  • <b><strong> 的區別

    • <b> 為了加粗而加粗
    • <strong> 為了標明重點內容而加粗,有語氣加強的含義
  • <i><em> 的區別

    • <i> 為了斜體而斜體,<em> 為了標明重點而斜體,且對於搜尋引擎來說 <strong><em><b><i> 要重視的多

rel="noopener" 應在什麼場景下使用,為什麼?

  • rel="noopener"<a> 標籤的一個屬性。他可以禁止開啟的新頁面中使用 window.opener 屬性,這樣一來開啟的新頁面就不能通過 window.opener 去操作你的頁面。
  • 新頁面可以通過 window.opener.location = newURL 將你的頁面導航至任何網址。
<!-- home.html -->
<a href="./home.html" target="_blank">home</a>
<!-- <a href="./home.html" target="_blank" rel="noopener">home</a> -->

<!-- details.html -->
<h1>點關注 不迷路!</h1>
<script>
  window.opener.location = 'https://juejin.cn/user/96412754251390'
</script>
  • 如果您正在使用帶有 target ="_ blank" 的外部連結,則您的連結應具有 rel="noopener" 屬性,以防止標籤被挪用。如果您需要支援舊版本的 Firefox,請使用 rel="noopener noreferrer"
  • 總結:rel="noopener" 應用於超連結,防止開啟的連結操縱源頁面

為什麼最好把 link 標籤放在 head 之間?

  • <link> 標籤放在 <head></head> 之間是規範要求的內容。此外,這種做法可以讓頁面逐步呈現,提高了使用者體驗。
  • 將樣式表放在檔案底部附近,會使許多瀏覽器(包括 Internet Explorer)不能逐步呈現頁面。
  • 一些瀏覽器會阻止渲染,以避免在頁面樣式發生變化時,重新繪製頁面中的元素。
  • 這種做法可以防止呈現給使用者空白的頁面或沒有樣式的內容。

為什麼最好把 JS 的 script 標籤放在 body 之前,有例外情況嗎?

  • 指令碼在下載和執行期間會阻止 HTML 解析。把 <script> 標籤放在底部,保證 HTML 首先完成解析,將頁面儘早呈現給使用者。
  • 例外情況:當你的指令碼裡包含 document.write() 時。

    • 但是現在,document.write() 不推薦使用。
    • 同時,將 <script> 標籤放在底部,意味著瀏覽器不能開始下載指令碼,直到整個檔案(document)被解析。對此比較好的做法是,<script> 使用 defer 屬性,放在 <head> 中。

HTML 全域性屬性(global attribute)有哪些

  • accesskey:設定快捷鍵,提供快速存取元素
  • class:為元素設定類標識,多個類名用空格分開,CSS 和 JavaScript 可通過 class 屬性獲取元素
  • contenteditable:指定元素內容是否可編輯
  • contextmenu:自定義滑鼠右鍵彈出選單內容
  • data-*:為元素增加自定義屬性
  • dir:設定元素文字方向
  • draggable:設定元素是否可拖拽
  • dropzone:設定元素拖放型別: copy,move,link
  • hidden:表示一個元素是否與檔案。樣式上會導致元素不顯示,但是不能用這個屬性實現樣式效果
  • id:元素 id,檔案內唯一
  • lang:元素內容的的語言
  • spellcheck:是否啟動拼寫和語法檢查
  • style:行內 CSS 樣式
  • tabindex:設定元素可以獲得焦點,通過 tab 可以導航
  • title:元素相關的建議資訊
  • translate:元素和子孫節點內容是否需要在地化

請描述下 SEO 中的 TDK?

  • 在 SEO 中,所謂的 TDK 其實就是 titledescriptionkeywords 這三個標籤

    • title 標題標籤
    • description 描述標籤
    • keywords 關鍵詞標籤

你有使用過什麼模板引擎?為什麼使用它?

  • 常用模板引擎:Pug(以前叫 Jade)、 HamlHandlebarsart-template
  • 這些模版語言大多是相似的,都提供了用於展示資料的內容替換和過濾器的功能
  • 大部分模版引擎都支援自定義過濾器,以展示自定義格式的內容。
!!! 5 
html 
  head 
    title = HelloWorld 
  body 
    h1使用Jade建立HelloWorld網頁

編譯為

<!DOCTYPE html>
<html>
  <head>
    <title>HelloWorld</title>
  </head>
  <body>
    <h1>使用Jade建立HelloWorld網頁</h1>
  </body>
</html>
  • 它幫助我們用更少的程式碼更快地編寫 HTML 程式碼。

iframe 是什麼?有什麼優缺點?

  • HTML內聯框架元素(<iframe>)表示嵌入的瀏覽上下文。它能夠將另一個 HTML 頁面嵌入到當前頁面中。
  • iframe 是用來在網頁中插入第三方頁面,早期的頁面使用 iframe 主要是用於導航欄這種很多頁面都相同的部分,這樣在切換頁面的時候避免重複下載。
  • tips:可以將提示文字放在 <iframe></iframe> 之間,來提示某些不支援 iframe 的瀏覽器
  • 優點

    • 便於修改,模擬分離,像一些資訊管理系統會用到。
    • iframe 能夠原封不動的把嵌入的網頁展現出來。
    • 如果有多個網頁參照 iframe,那麼你只需要修改 iframe 的內容,就可以實現呼叫的每一個頁面內容的更改,方便快捷。
    • 網頁如果為了統一風格,頭部和版本都是一樣的,就可以寫成一個頁面,用 iframe 來巢狀,可以增加程式碼的可重用。
    • 並行載入指令碼
    • security sandbox(安全沙盒)
    • 解決載入緩慢的第三方內容。如:圖示和廣告等的載入問題。
  • 缺點

    • 沒有語意。搜尋引擎無法解讀這種頁面,不利於SEO
    • 會產生很多頁面,不容易管理。
    • 即使內容為空,載入也需要時間。
    • iframe 的建立比一般的 DOM 元素慢了 1-2 個數量級
    • 很多的移動裝置(PDA手機)無法完全顯示框架,裝置相容性差。
    • iframe 框架頁面會增加伺服器的 http 請求,對於大型網站是不可取的。
    • iframe 會阻塞主頁面的 onload 事件。
    • iframe 和主頁面共用連線池,而瀏覽器對相同域的連線有限制,所以會影響頁面的並行載入。
    • 如果需要使用 iframe,最好通過 javascript 動態給 iframe 新增 src 屬性值,這樣可以繞開以上兩個問題
    • iframe 框架結構有時會讓人感到迷惑,如果框架個數多的話,可能會出現上下、左右卷軸,會分散存取者的注意力,使用者體驗度差。
  • tips:除非特殊需要,一般不推薦使用。目前 iframe 的優點完全可以使用 Ajax 實現,因此已經沒有必要使用 iframe 了。
  • iframe

div+css 的佈局較 table 佈局有什麼優點?

  • 分離方便、改版快、清晰簡潔、seo

    • 表現與結構相分離。
    • 改版的時候更方便,只要改 css 檔案。
    • 頁面載入速度更快、結構化清晰、頁面顯示簡潔。
    • 易於優化(seo)搜尋引擎更友好,排名更容易靠前。

很多網站不常用 table,iframe 這兩個元素,知道原因嗎?

因為瀏覽器頁面渲染的時候是從上至下的,而 tableiframe 這兩種元素會改變這樣渲染規則,他們需要等待自己元素內的內容載入完才整體渲染。使用者體驗會很不友好。

HTML 中的 lang 屬性有什麼作用?

  • 通過在 css:lang() 偽類拼寫和語法檢查器中使用頁面樣式來幫助搜尋引擎進行語言檢測
:lang(zh) {
  font-size: 1.5em;
}

什麼 enctype='multipart/form-data' 意思?

  • enctype 屬性指定將表單資料提交到伺服器時應如何編碼。

HTML5

HTML5 是 HTML(超檔案標示語言)最新的修訂版本,由全球資訊網聯盟(W3C)於 2014 年 10 月完成標準制定。目標是取代 1999 年所制定的 HTML 4.01 和 XHTML 1.0 標準。它是一種為全球資訊網構建和顯示內容的語言,全球資訊網是網際網路的核心技術。

HTML5 向後相容舊瀏覽器嗎?

  • HTML5 被設計成儘可能向後相容現有的 web 瀏覽器

HTML5 為什麼只需要寫 <!DOCTYPE html>

  • HTML5 不基於 SGML,因此不需要對 DTD 進行參照,但是需要 DOCTYPE 來規範瀏覽 器的行為(讓瀏覽器按照它們應該的方式來執行)
  • HTML4.01 基於 SGML,所以需要對 DTD 進行參照,才能告知瀏覽器檔案所使用的檔案型別。
  • 其中,SGML 是標準通用標示語言,簡單的說,就是比 HTML,XML 更老的標準,這兩者都是由 SGML 發展而來的。但是,HTML5 不是。

HTML5 檔案型別和字元集是?

  • HTML5 檔案型別:<!DOCTYPE html>
  • HTML5 字元集編碼:<meta charset="UTF-8" />

HTML5 有哪些新特性

  • 在 HTML5 中,DOM 拓展了三種選擇器 document.querySelectordocument.querySelectorAllmatchesSelector()
  • 拖拽釋放(Drag and drop)API
  • 繪畫 canvas,支援內聯 SVG。支援 MathML
  • 媒體播放的 videoaudio 元素
  • 本地離線儲存 localStorage 長期儲存資料,瀏覽器關閉後資料不丟失;sessionStorage 的資料在瀏覽器關閉後自動刪除
  • 更好的實踐 web 語意化,比如 articlefooterheadernavsection 等語意標籤
  • 表單控制元件:calendardatetimeemailurl
  • 新增表單元素:datalistkeygenoutput
  • 新的技術:多執行緒程式設計的 webWorker, 全雙工通訊協定 webSocket 和地理定位 Geolocation

什麼是 data-* 屬性?

  • 自定義資料屬性以 data 開始,並將根據您的需求進行命名
  • 您可以使用 JavaScript 獲得這些屬性的值
  • 在 JavaScript 框架變得流行之前,前端開發者經常使用 data-* 屬性,把額外資料儲存在 DOM 自身中,而當時沒有其他 Hack 手段(比如使用非標準屬性或 DOM 上額外屬性)。它用於儲存頁面或應用程式專用的自定義資料,對於這些資料,沒有更合適的屬性或元素。
  • 而現在,不鼓勵使用 data-* 屬性。原因:

    • 使用者可以通過在瀏覽器中利用檢查元素,輕鬆地修改屬性值,藉此修改資料
    • 資料模型最好儲存在 JavaScript 本身中,並利用框架提供的資料繫結,使之與 DOM 保持更新

HTML5 中不推薦使用哪些 HTML 標籤?

  • <acronym>:建議用 <abbr>
  • <applet>:建議用 <object>
  • <basefont>:建議用 <font>
  • <bgsound>:建議用 <audio>
  • <b>:不推薦使用,建議用 font-weight 代替
  • <big>:不推薦使用,建議用 font-size 代替
  • <blink>:建議採用 animation 代替
  • <center>:不推薦使用,建議用 text-align: center 代替
  • <dir>:建議根據語意採用 <ul><ol> 或者 <dl>
  • <font>:不推薦使用,建議用 CSS 代替,以便更好控制。
  • <frame>:不推薦使用,建議用 <iframe> 代替。但 <iframe> 現在又可以用 ajax 來代替
  • <frameset>:不推薦使用
  • <hgroup>:不推薦使用
  • <isindex>:建議用 <input>
  • <listing>:建議用 <pre> 或使用語意更好的 <code>
  • <marquee>:不推薦使用
  • <multicol>:建議用 <input>
  • <nobr>:不推薦使用,建議用 white-space 代替
  • <noframes>:不推薦使用,建議用 幀 CSS 代替
  • <plaintext>:建議用 <pre> 或使用語意更好的 <code>
  • <u>:不推薦使用,建議用 幀 font-style 代替
  • <spacer>:不推薦使用
  • <strike>:建議用語意更好的 <del><s>
  • <tt>:建議用 <code><span>
  • <xmp>:建議用帶有 CSS 的 <pre> 或使用語意更好的 <code>
  • HTML5與HTML4的區別
  • HTML 元素參考

你如何理解 Web 的語意化?

  • web 語意化是指通過 HTML 標記表示頁面包含的資訊,包含了 HTML 標籤的語意化和 CSS 命名的語意化。
  • HTML 標籤的語意化是指:通過使用包含語意的標籤(如h1-h6)恰當地表示檔案結構
  • CSS 命名的語意化是指:為 HTML 標籤新增有意義的 class,id 補充未表達的語意,如Microformat通過新增符合規則的 class 描述資訊

HTML 為什麼需要結構語意化

  • 便於團隊開發和維護。
  • 在沒有 CSS 樣式的情況下,能讓頁面呈現清晰的結構。
  • 螢幕閱讀器(如果訪客有視障)會完全根據你的標記來 "讀" 你的網頁。
  • 搜尋引擎的爬蟲依賴於標記來確定上下文和各個關鍵字的權重,利於 SEO。
它用於改進檔案的自動化處理。自動處理髮生的頻率比你意識到的要高——搜尋引擎中的每個網站排名都是從所有網站的自動處理中派生出來的。
<!-- 機器:這種結構看起來可能是導航元素? -->
<div class="some-meaningless-class"><ul><li><a href="internal_link">...</div>

<!-- 機器: 這是導航元素! -->
<nav class="some-meaningless-class"><ul><li><a>...</nav>

什麼是語意和非語意元素?

  • 語意元素:對瀏覽器和開發人員都清楚地描述了其含義。例如:<form><table><article><aside><details><figcaption><figure><footer><header><main><mark><nav><section><summary><time> 明確規定其含義。
  • 非語意元素<div><span> 不包含任何含義。

簡述 HTML5 一些語意的用法

  • <header> 用於包含有關頁面某個部分的介紹性和導航資訊。這可以包括章節標題、作者姓名、出版時間和日期、目錄或其他導航資訊。
  • <article> 是用來存放一個自成體系的作文,在邏輯上可以在頁面之外獨立地重新建立,而不會失去它的意義。個人部落格文章或新聞故事就是很好的例子。
  • <section> 是一個靈活的容器,用於儲存共用公共資訊主題或目的的內容。
  • <footer> 用於儲存應該出現在內容節末尾的資訊,幷包含有關該節的附加資訊。作者姓名、版權資訊和相關連結是此類內容的典型範例。
  • <main> 元素表示 body 檔案的主要內容。主要內容區域由與檔案的中心主題或應用程式的中心功能直接相關或擴充套件的內容組成。
  • HTML5 中的語意

Canvas 和 SVG

  • CanvasSVG 都允許您在瀏覽器中建立圖形,但是它們在根本上是不同的。

SVG

SVG 意為可縮放向量圖形(Scalable Vector Graphics)是一種基於 XML 的影象格式,用於為 web 定義基於向量的二維圖形。與光柵影象(例如 .jpg、.gif、.png 等)不同,向量影象可以在不損失影象品質的情況下進行任何程度的放大或縮小。
<!-- SVG 是向量和宣告性的 -->
<svg viewBox="0 0 200 200">
    <circle cx="10" cy="10" r="10" />
</svg>

Canvas

Canvas 是一個 HTML5 元素,用於在網頁上繪製圖形。它是一個帶有 "立即模式" 圖形應用程式程式設計介面(API)的點陣圖,用於在其上繪圖。<canvas> 元素只是圖形的容器。為了繪製圖形,你應該使用 js 畫布在繪製路徑、方框、圓、文字和新增影象時有幾種策略。
  • HTML <canvas> 元素提供了一個空白繪圖區域,可通過 JavaScript API(Canvas API 或 WebGL API)繪製圖形及圖形動畫

    • 通過 Javascript 來繪製 2D 圖形
    • 是逐畫素進行渲染的
    • 其位置發生改變,會重新進行繪製
<canvas id="myCanvas" width="578" height="200"></canvas>
<script>
  var canvas = document.getElementById('myCanvas');
  var context = canvas.getContext('2d');
  var centerX = canvas.width / 2;
  var centerY = canvas.height / 2;
  var radius = 70;

  context.beginPath();
  context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);
  context.fillStyle = 'green';
  context.fill();
</script>
  • Canvas 的一些預期用途包括構建圖形、動畫、遊戲和影象合成。
  • Canvas 元素用於在網頁上繪製圖形,該元素標籤強大之處在於可以直接在 HTML 上進行圖形操作

Canvas 和 SVG 的區別

CanvasSVG
基於柵格(由畫素組成)基於向量(由形狀組成),非常適合 UI/UX 動畫
依賴解析度不依賴解析度
不支援事件處理器支援事件處理器
文字渲染能力差良好的文字渲染功能
使用更多的物件或更小的曲面或兩者都提供更好的效能複雜度高會減慢渲染速度(任何過度使用 DOM 的應用都不快)
最適合影象密集型的遊戲,其中的許多物件會被頻繁重繪不適合遊戲應用
僅通過指令碼修改通過指令碼和 CSS 修改
能夠以 .png 或 .jpg 格式儲存結果影象多個圖形元素,成為頁面 DOM 樹的一部分
可伸縮性差。不適合以較高解析度列印。可能發生畫素化更好的可延伸性。可以任何解析度高品質列印。不會發生畫素化

100 * 100的 canvas 佔多少記憶體?

您如何為您的網站選擇 svg 或 canvas?

  • 如果你知道你需要向量藝術,則選擇 SVG。與 JPG 之類的柵格圖形相比,向量藝術在視覺上是清晰的,並且檔案大小通常較小。
  • 像一個小的平面顏色圖示,這顯然是 SVG 的領域。
  • 像互動遊戲,那顯然是 Canvas。

參考

新標籤

新語意和結構元素

  • canvas 標籤定義圖形,比如圖表和其他影象。該標籤基於 JavaScript 的繪圖 API
<canvas width="300" height="300">
  抱歉,您的瀏覽器不支援canvas元素
</canvas>
  • figure 代表一段獨立的內容,經常與說明(caption)配合使用,並且作為一個獨立的參照單元
  • figcaption 是與其相關聯的圖片的說明/標題,用於描述其父節點 figure 元素裡的其他資料。
<style>
  figure {
    border: thin #c0c0c0 solid;
    display: flex;
    flex-flow: column;
    padding: 5px;
    max-width: 220px;
    margin: auto;
  }
  img {
    max-width: 220px;
    max-height: 150px;
  }
  figcaption {
    background-color: #222;
    color: #fff;
    font: italic smaller sans-serif;
    padding: 3px;
    text-align: center;
  }
</style>

<figure>
  <img src="1.jpg" alt="索隆">
  <figcaption>An elephant at sunset</figcaption>
</figure>
  • summary 利用了一個 details 元素的一個內容的摘要,標題或圖例。
  • details 可建立一個掛件,僅在被切換成展開狀態時,它才會顯示內含的資訊。

<style>
  details {
    border: 1px solid #aaa;
    border-radius: 4px;
    padding: 0.5em 0.5em 0;
  }
  summary {
    font-weight: bold;
    margin: -0.5em -0.5em 0;
    padding: 0.5em;
  }
  details[open] {
    padding: 0.5em;
  }
  details[open] summary {
    border-bottom: 1px solid #aaa;
    margin-bottom: 0.5em;
  }
</style>

<details>
    <summary>Details</summary>
    Something small enough to escape casual notice.
</details>
  • headernavmainfootersectionarticle
<section>
  <header></header>
  <main>
      <nav></nav>
  </main>
  <footer></footer>
</section>
<article></article>
  • map 定義一個使用者端影象對映。影象對映(image-map)指帶有可點選區域的一幅影象

    • area 元素永遠巢狀在 map 元素內部。area 元素可定義影象對映中的區域。
<div>
  <img
    src="../img/cs.jpg"
    width="500"
    height="500"
    alt="pic"
    usemap="#circusmap"
  />
  <map name="circusmap">
    <area shape="rect" coords="90,18,202,186" href="https://www.baidu.com/"/>
    <area shape="rect" coords="222,141,318, 256" href="https://www.baidu.com/" />
    <area shape="circle" coords="343,111,455, 267" href="https://www.baidu.com/" />
    <area shape="rect" coords="35,328,143,500" href="https://www.baidu.com/" />
  </map>
</div>
  • mark 突出顯示 html 中的文字。在這個標籤出現之前,常使用使用 emstrong 賦予突出顯示的內容一些語意。現在不推薦了。如果需要突出顯示,請使用此標籤
<p><mark>Lio</mark></p>

預設背景顏色 <mark> 是黃色

/* default style */
mark {
  background: yellow;
  color: black;
}

可以使用 CSS 自定義樣式

mark {
  background: red;
  color: white;
}
  • meter 標籤定義已知範圍或分數值內的標量測量。也被稱為 gauge(尺度)。

    • <meter> 標籤不應用於指示進度(在進度條中)。如果標記進度條,請使用 <progress> 標籤。
<div>
  <meter value="4" min="0" max="10">4/10</meter><br />
  <meter value="0.6">60%</meter>
</div>
  • progress 標籤標示任務的進度(程序)。
<label for="file">Downloading progress:</label>
<progress id="file" value="32" max="100"> 32% </progress>
  • time 定義日期或時間。
<p>The concert starts at <time datetime="2020-06-01T20:00:00">20:00</time>.</p>
  • bdi 允許您設定一段文字,使其脫離其父元素的文字方向設定。
<p dir="ltr">Lorem ipsum <bdi>dolor</bdi> sit amet.</p>
  • dialog 標籤定義一個對話方塊、確認框或視窗。
<dialog open>
  <p>Greetings, one and all!</p>
</dialog>

新多媒體元素

  • source 定義視訊源 <video><audio>
  • track 定義文字軌道
  • video 定義視訊元素

    • HTML5支援 mp4、webm 和 ogg 格式的視訊。其中 Ogg 格式在 IE 中不受任何方式的支援
    • src 指定視訊的來源。
    • 當不給 video 設定高度和寬度時,瀏覽器不知道視訊的大小,當視訊載入時,頁面將發生變化或閃爍
<!-- 1. 用 src 屬性定義 -->
<video
  src="video.mp4"
  controls
></video>

<!-- 2. 定義 source 標籤 -->
<video controls>
    <source src="video.mp4" type="video/mp4">
      你的瀏覽器不支援 HTML5 viedo 標籤。
</video>
  • embed 將外部內容嵌入檔案中的指定位置。
<embed
  src="https://juejin.cn/user/96412754251390"
  height="700"
  width="100%"
/>

<embed
  type="video/webm"
  src="/media/cc0-videos/flower.mp4"
  height="700"
  width="100%"
/>
  • audio 定義音訊內容

    • HTML5 支援 MP3、Wav 和 Ogg 格式的音訊。
<audio controls>
  <source src="sound.ogg" type="audio/ogg" />
  <source src="sound.mp3" type="audio/mpeg" />
  您的瀏覽器不支援 HTML5 audio 標籤。
</audio>

新表單元素

  • datalist

    • <datalist> 標籤定義選項列表。與 input 元素配合使用該元素,來定義 input 可能的值。
    • datalist 及其選項不會被顯示出來,它僅僅是合法的輸入值列表。
    • 使用 input 元素的 list 屬性來繫結 datalist
<label for="course">選擇學習課程:</label>
<input list="target" name="course" id="course" />
<datalist id="target">
  <option value="HTML"></option>
  <option value="CSS"></option>
  <option value="JavaScript"></option>
  <option value="Node"></option>
  <option value="Vue"></option>
  <option value="React"></option>
  <option value="Webpack"></option>
</datalist>
  • keygen 該元素有助於生成金鑰和通過表單提交。

    • keygen 必須在表單內使用。
    • keygen 已經從 Web 標準中刪除,請使用 JavaScript 生成金鑰
    • MDN
  • output 標籤定義不同型別的輸出,比如指令碼的輸出。
<form oninput="x.value=parseInt(a.value) * parseInt(b.value)">
  0 <input type="range" id="a" value="50"> 100
  * <input type="number" id="b" value="1" /> =
  <output name="x" for="a b"></output>
</form>

HTML5 之前的一些元素

  • pre 標籤可定義預格式化的文字。被包圍在 <pre> 標籤中的文字通常會保留空格和換行符。而文字也會呈現為等寬字型。
  • strong 用於指示比周圍文字更重要的文字,例如警告或錯誤。從語意上講,它的重要性。它顯示為粗體
  • bstrong 非常相似,因為它也顯示為粗體。然而,與它不同的是,它並沒有真正傳達出任何重要性,它更像是一種文體而非語意。
  • em 用於強調某個詞。它顯示為斜體
<strong>lorem</strong>
<b>lorem</b>
<em>lorem</em>
  • qblockquote

    • q 引號
    • blockquote 塊引號
<q>lorem</q>
<blockquote>lorem</blockquote>
  • bdo 可以更改 HTML 文字的方向

    • rtl:從右到左。ltr:從左到右。
<p><bdo dir="rtl">This text will go right to left.</bdo></p>
  • 使用 abbr 標籤縮寫您的程式碼,當你傳遞一個標題時,它將建立一個工具提示

    • <abbr> 不同瀏覽器的預設樣式有些不同。在 Chrome 和 Firefox 中,它將帶有下劃線,並且在懸停時將帶有 title 傳遞的值的工具提示。如果您在 Safari 上開啟此頁面,則不會出現下劃線。此外,僅當您具有 title 屬性時才顯示下劃線。
    • 由於跨瀏覽器的差異,建議為 <abbr> 程式碼加上自定義樣式。這樣,您將在瀏覽器之間擁有一致的外觀

定義術語時,可以與 dfn 混合使用

<dfn>
  <abbr title="Today I learned">TIL</abbr> something awesome!    
</dfn>

指示的非縮寫詞並將其輸出到頁面上的括號中

abbr[title]::after {
  content: ' (' attr(title) ')';
}

利用 hover 狀態僅在點選時顯示非縮寫詞

abbr[title]:hover::after {
  content: ' (' attr(title) ')';
}

使用 abbr 標籤來指示在順序鍵盤導航中是可聚焦的 tabindex="0",然後在聚焦時觸發我們的非縮寫內容。

<abbr title="Today I learned" tabindex="0">TIL</abbr>
abbr[title]:focus::after {
  content: ' (' attr(title) ')';
}

也可以使用一些提示工具,如 Bootstrap 的工具提示元件。

  • kbdcode

    • kbd:表示使用者從鍵盤、語音輸入或任何其他文字輸入裝置輸入的文字。
    • code:表示計算機程式碼的簡短片段的文字。
    • 兩者使用同樣的 monospace 字型。但是在語意上它們是不同的。最好使用 kbd 代替 code
<kbd>Ctrl</kbd> + <kbd>C</kbd>
<code>Ctrl</code> + <code>C</code>
/* Default Style */
kbd {
  font-family: monospace;
}

kbd, code {
  border: 1px solid gray;
  border-radius: 5px;
  padding: 5px;
}
  • sdel 刪除線

    • s 當您嘗試表示不再相關或不再準確的事物時,使用它。
    • del 當您要指示某些內容已從檔案中刪除時,使用它。
    • 它們都是刪除線。但是,它們傳達了關於內容的不同含義。
<s>Lorem ipsum dolor sit amet.</s>

<!-- 常使用於商品價格折扣 -->
<span><s>$1999</s></span>
<span style="color: red;">$99</span>

<del>Lorem ipsum dolor sit amet.</del>

<!-- 常使用於待辦事項清單 -->
<ul>
  <li><del>打卡</del></li>
  <li>喝杯咖啡</li>
</ul>
  • ins
<p>
  Lorem ipsum
  <ins>dolor sit amet consectetur adipisicing elit.</ins> Perferendis, rem.
</p>

新屬性

  • contenteditable

    • contenteditable 屬性應用於任何HTML元素,它可以像 input<textare> 那樣工作編輯它們
    • 您可以為其新增事件監聽器,監聽其內容變化
    • contenteditable 屬性值有3個不同的值:true、false、inherit
<div contenteditable="true">
  <h1>元素可編輯</h1>
</div>
<div contenteditable="false">
  <h1>元素不可編輯</h1>
</div>
<div contenteditable="inherit">
  <h1>元素繼承其父元素的可編輯狀態</h1>
</div>
  • input

    • required
    • autofocus 屬效能夠讓 buttoninputtextarea 元素在頁面載入完成時自動成為頁面焦點
    • pattern 用正規表示式驗證
<!-- required -->
<input type="text" id="username1" name="username" required>

<!-- autofocus -->
<input type="text" id="username2" name="username" >

<!-- pattern -->
<input
  type="password"
  name="password"
  placeholder="請輸入密碼"
  pattern="^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,20}$"
  required
/>
  • HTML5 新的表單輸入型別?

    • 新輸入型別(type 13種):datemonthweektimenumberrangeemailurlcolordatatime-localdatetimesearchtel
    • search:用於搜尋域,比如站點搜尋或 Google 搜尋,域顯示為常規的文字域。
    • url :用於應該包含 URL 地址的輸入域在提交表單時,會自動驗證 url 域的值。
    • email:用於應該包含 e-mail 地址的輸入域,在提交表單時,會自動驗證 email 域的值。
    • datetime:選取時間、日、月、年(UTC 時間)
    • date:選取日、月、年
    • month:選取月、年
    • week:選取周和年
    • time:選取時間(小時和分鐘)
    • datetime-local:選取時間、日、月、年(本地時間)
    • number:用於應該包含數值的輸入域,您還能夠設定對所接受的數位的限定。
    • range:用於應該包含一定範圍內數位值的輸入域,型別顯示為滑動條。
    • color:定義拾色器。
    • tel:定義用於輸入電話號碼的欄位。
    • 其中 datetime 不在被推薦使用,轉而使用 datatime-local
<!-- url -->
<input type="url" />

<!-- tel -->
<input type="tel" name="tel" />

<!-- search -->
<input type="search" />

<!-- email -->
<form action="/">
    <input type="email" />
    <input type="submit" value="提交">
</form>

<!-- date -->
<input type="date" value="2020-06-01" min="2020-01-01" max="2022-01-01" />

<!-- time -->
<input type="time" value="12:00" />

<!-- datetime -->
<input type="datetime" value="2020-09-12T23:00Z" />

<!-- week -->
<input type="week" />

<!-- month -->
<input type="month" value="2020-06-01" />

<!-- datetime-local -->
<input type="datetime-local" value="2020-09-06T23:00" />

<!-- number -->
<input type="number" name="number" min="2" max="10" value="3"  />

<!-- color -->
<input type="color" onchange="showColor(event)">

<!-- range -->
<input type="range" name="range" min="0" max="100" step="1" value="" />
  • hiden 屬性規定對元素進行隱藏。

    • 可以對 hidden 屬性進行設定,使使用者在滿足某些條件時才能看到某個元素(比如選中核取方塊,等等)。然後,可使用 JavaScript 來刪除 hidden 屬性,使該元素變得可見。
<div hidden>lorem</div>
  • Download

    • 錨點標記的預設設定是導航連結,它將轉到您在 href 屬性中指定的連結
    • 新增 download 屬性時,它將變成一個下載連結。提示您要下載的檔案。下載的檔案將具有與原始檔名相同的名稱。但是,您也可以通過將值傳遞給 download 屬性來設定自定義檔名
    • download 屬性僅適用於同源 URL。如果的 href 來源與網站的來源不同,那麼它將無法正常工作。換句話說,您只能下載屬於該網站的檔案。此屬性遵循同源策略中的相同規則概述。
<a href="../img/cs.jpg" download>
    使用原始檔名下載本地檔案
</a>

<a href="../img/cs.jpg" download='logo'>
  使用自定義檔名下載 logo.png
</a>

HTML5 的 form 如何關閉自動完成功能?

<!-- 不使用 autocomplete -->
<input type="email" name="email" />

<!-- 使用 autocomplete -->
<form action="/post">
    <input type="email" name="email" autocomplete="off" />
    <input type="submit" value="提交" />
</form>

<script> 標記上的 deferasync 屬性是什麼?

  • <script>:當遇到指令碼時,HTML 停止解析,指令碼被獲取並立即執行。執行結束後,HTML 解析繼續。
  • deferasync 的作用:都是讓指令碼的下載和執行不阻塞頁面的渲染

區別:

  • defer 是推遲執行,它是等到頁面渲染完畢,所有指令碼下載完成,在 DOMContentLoaded 事件前按照指令碼的在檔案中的順序執行;
  • async 是立即下載並執行,載入和渲染後續檔案元素的過程將和 js 指令碼的載入與執行並行進行(非同步)
  1. 關於 defer,我們還要記住的是它是按照載入順序執行指令碼的
  2. 標記為 async 的指令碼並不保證按照指定它們的先後順序執行。對它來說指令碼的載入和執行是緊緊挨著的,所以不管你宣告的順序如何,只要它載入完了就會立刻執行。
  3. async 對於應用指令碼的用處不大,因為它完全不考慮依賴(哪怕是最低階的順序執行),不過它對於那些可以不依賴任何指令碼或不被任何指令碼依賴的指令碼來說卻是非常合適的。
<script src="longTime.js"></script>
<script src="longTime.js" defer></script>
<script src="longTime.js" async></script>
  • tips:沒有 src 屬性的指令碼(即不是內聯指令碼),asyncdefer 屬性會被忽略。

如何處理 HTML5 新標籤的瀏覽器相容問題?如何區分 HTML 和 HTML5?

  • IE6-8 支援通過 document.createElement 方法產生的標籤,利用這一特性讓這些瀏覽器支援 HTML5 新標籤
  • 使用 html5shiv 框架
  • HTML5:

    • DOCTYPE 宣告
    • 新增的語意元素(<header><section> 等)
    • 新增功能元素

HTML5 的構成要素是什麼?

  • 語意:提供更準確地描述內容。
  • 連線:提供新的方式與伺服器通訊。
  • 離線和儲存:允許網頁在本地儲存資料並有效地離線執行。
  • 多媒體:在 Open Web 中,視訊和音訊被視為一等公民(first-class citizens)。
  • 2D/3D 圖形和特效:提供更多種演示選項。
  • 效能和整合:提供更快的存取速度和效能更好的計算機硬體。
  • 裝置存取:允許使用各種輸入、輸出裝置。
  • 外觀:可以開發豐富的主題。
  • HTML5

Modernizr

  • Modernizr 是一個用來檢測瀏覽器功能支援情況的 JavaScript 庫。
  • 通過這個庫我們可以檢測不同的瀏覽器對於 HTML5 特性的支援情況。
<article>
  <h1>通過 Modernizr 檢測 HTML5 特性</h1>
</article>
<script
  crossorigin="anonymous"
  integrity="sha384-l7lIexAaQrMGAnOGdPikxQDjq8aY1MS3oqkKPS8FXlJ47UejXvEzmezjhEwHVkzm"
  src="https://lib.baomitu.com/modernizr/2010.07.06dev/modernizr.js"
></script>
<script>
  window.onload = function () {
    //通過Modernizr.對瀏覽器canvas功能進行檢測
    if (Modernizr.canvas) {
      console.log('本瀏覽器支援Canvas API')
    } else {
      console.log('本瀏覽器不支援Canvas API')
    }
  }
</script>

HTML5 儲存

localStorage

localStorage 持久化的本地儲存,除非是通過 js 刪除,或者清除瀏覽器快取,否則資料永遠不會過期,關閉瀏覽器也不會丟失。

  • HTML5 修訂 localStorage 取代 globalStorage
  • 在同源的所有分頁和視窗之間共用資料
  • 資料僅儲存在使用者端,不與伺服器進行通訊,對資料的操作是同步的
  • 大小限制為 5M;但實際 JavaScript 中的字串為 UTF-16,因此每個字元需要兩個位元組的記憶體。這意味著儘管許多瀏覽器的限制為 5MB,但您只能儲存 2.5M 個字元。
  • 瀏覽器的支援情況:IE7 及以下版本不支援 web storage。但在 IE5-7 中有個 userData,其實也是用於本地儲存。

sessionStorage

sessionStorage 儲存物件儲存一個對談的資料,資料會在瀏覽器關閉後自動刪除。

cookie、sessionStorage 和 localStorage 的區別

  • 都是在使用者端以鍵值對儲存的儲存機制,並且只能將值儲存為字串。
cookielocalStoragesessionStorage
由誰初始化使用者端或伺服器,伺服器可以使用Set-Cookie請求頭。使用者端使用者端
過期時間手動設定永不過期當前頁面關閉時
在當前瀏覽器對談(browser sessions)中是否保持不變取決於是否設定了過期時間
是否隨著每個 HTTP 請求傳送給伺服器是,Cookies 會通過Cookie請求頭,自動傳送給伺服器
容量(每個域名)4kb5MB5MB
存取許可權任意視窗任意視窗當前頁面視窗

什麼是 WebSQL?

  • WebSQL 是使用 SQL 的使用者端(瀏覽器)的資料庫 API。
  • Web SQL 資料庫 API 並不是 HTML5 規範的一部分,但是它是一個獨立的規範,引入了一組使用 SQL 操作使用者端資料庫的 APIs。
  • 並非所有瀏覽器都支援WebSQL
  • 現在不推薦使用 WebSQL ,而是使用 IndexedDB 代替它。

什麼是 IndexedDB?

IndexedDB 是一種底層非同步 API,瀏覽器內建的資料庫,用於在使用者端儲存大量的結構化資料(也包括檔案/二進位制大型物件(blobs))。
  • 它將將資料儲存為鍵值對。
  • 大多數瀏覽器都支援 IndexedDB
IndexedDB API 功能強大,但對於簡單的情況可能看起來太複雜如果你更喜歡一個簡單的API,請嘗試 localForagedexie.jsPouchDBIDBIDB-KEYVALJsStore 或者 lovefield 之類的庫,這些庫使 IndexedDB 對開發者來說更加友好。

為什麼在 HTML5 中使用 IndexedDB 代替 WebSQL?

IndexedDB 像一個 NoSQL 資料庫,而 WebSQL 像關係型資料庫,使用 SQL 查詢資料。W3C WebSQL 已經不再支援這種技術。

HTML5 應用程式快取(Application Cache)

根據最新的標準,該特性已經從 Web 標準中刪除,建議使用 Service Workers 代替。這裡找了一些資料,感興趣瞭解一下。

什麼是 Web Workers?

  • Web Workers 幫助我們在後臺執行 JavaScript 程式碼,而不會阻止應用程式。
  • Web Workers 在一個隔離的(新的)執行緒中執行,用於執行 JavaScript 程式碼,並且通過 postMessage 將結果回傳到主執行緒。這樣就不會阻塞主執行緒的執行。
  • Web Workers 通常用於大型任務。
  • Web Workers 需要一個單獨的檔案來儲存我們的 JavaScript 程式碼。
  • Web Workers 檔案是非同步下載的 。
  • 所有最新的瀏覽器均支援 Web Worker

使用者端 js:

var myWebWorker = new Worker("task.js") // 建立 worker

// 監聽 task.js worker 訊息
worker.addEventListener("message", function(event) {
  console.log("Worker said: ", event.data)
}, false)

// 啟動工作程式
worker.postMessage("From web worker file")

task.js(工作檔案)檔案:

// 監聽使用者端 JS 檔案發布訊息
self.addEventListener("message", function(event) {
  // 處理後的資料傳送到使用者端監聽 JS 檔案
  self.postMessage(event.data)
}, false)

WebSocket

  • WebSocket 是 HTML5 開始提供的一種在單個 TCP 連線上進行全雙工通訊的協定。
  • WebSocket 是一種在使用者端與伺服器之間保持TCP長連線的網路協定,可以隨時進行資訊交換。
  • Websocket 使用 ws 或 wss 的統一資源標誌符,類似於 HTTPS,其中 wss 表示在 TLS 之上的 Websocket。
  • 預設情況下,Websocket 協定使用 80 埠;執行在 TLS 之上時,預設使用 443 埠。

webSocket 如何相容低瀏覽器?

  • Adobe Flash Socket
  • ActiveX HTMLFile(IE)
  • 基於 multipart 編碼傳送 XHR
  • 基於長輪詢的 XHR

websocket 與 socket 的區別

Socket 是傳輸控制層協定,WebSocket 是應用層協定。更多請看參考

參考

地理定位 API 如何在 HTML5 中工作?

  • HTML5 地理定位 API 允許使用者在需要時向 web 應用程式提供使用者的位置。出於隱私原因,使用者需要獲得報告位置資訊的許可權。
  • JavaScript 可以捕獲你的緯度和經度,並可以傳送到後端 Web 伺服器,做一些奇特的位置感知的事情,比如找到本地企業或在地圖上顯示你的位置
  • 如今,大多數瀏覽器和移動裝置都支援地理定位 API
  • 地理定位 API 通過 navigator 獲取物件。
if ("geolocation" in navigator) {
  /* geolocation is available */
} else {
  /* geolocation IS NOT available */
}

頁面可見性(Page Visibility)API 可以有哪些用途?

  • 頁面可見性 API 提供了您可以觀察的事件,剎車瞭解檔案何時可見或隱藏,以及檢視頁面當前可見性狀態的功能。
  • 使用索引標籤式瀏覽,任何給定網頁都有可能在後臺,因此對使用者不可見。頁面可見性 API提供了您可以觀察的事件,以便了解檔案何時可見或隱藏,以及檢視頁面當前可見性狀態的功能。
  • document.hidden 返回一個布林值。

    • true 表示頁面可見,false 則表示頁面隱藏。
    • 不同頁面之間來回切換,將觸發 visibilitychange 事件。
  • document.visibilityState:表示頁面所處的狀態,當前頁面的可見性,有四個取值

    • visible:頁面徹底不可見。
    • hidden:頁面至少一部分可見。
    • prerender:頁面即將或正在渲染,處於不可見狀態。
    • unloaded:已被廢棄,不在使用。
  • 只要 document.visibilityState 屬性發生變化,就會觸發 visibilitychange 事件
// 開啟新的頁面,來回切換分頁,觀察頁面標題的變化
document.addEventListener("visibilitychange", function() {
  if (document.visibilityState === 'hidden') {
    document.title = "愛我"
  } else {
    document.title = "恨我"
  }
})
  • 用途:

    • 動畫,視訊,音訊都可以在頁面顯示時開啟,在頁面隱藏時關閉
    • 完成登陸後,無重新整理自動同步其他頁面的登入狀態
// 視訊暫停或播放
document.addEventListener('visibilitychange', function () {
  if (document.visibilityState === 'hidden') {
    video.pause()
  } else if (document.visibilityState === 'visible') {
    video.play()
  }
})

說一下 HTML5 Drag And Drop API

HTML 拖放(Drag and Drop)介面使應用程式能夠在瀏覽器中使用拖放功能。例如,使用者可使用滑鼠選擇可拖拽(draggable)元素,將元素拖拽到可放置(droppable)元素,並釋放滑鼠按鈕以放置這些元素。
EventDescription
Drag每次拖動物件時移動滑鼠時,它都會激發。事件主體是被拖放元素,在正在拖放被拖放元素時觸發。
Dragstart當使用者開始拖動物件時觸發。事件主體是被拖放元素,在開始拖放被拖放元素時觸發。
Dragenter當使用者將滑鼠遊標移到目標元素上時,它將激發。事件主體是目標元素,在被拖放元素進入某元素時觸發。
Dragover當滑鼠移到某個元素上時觸發此事件。事件主體是目標元素,在被拖放在某元素內移動時觸發。
Dragleave當滑鼠離開元素時觸發此事件。事件主體是目標元素,在被拖放元素移出目標元素是觸發。
Drop拖放操作結束時觸發。事件主體是目標元素,在目標元素完全接受被拖放元素時觸發。
Dragend當使用者釋放滑鼠按鈕以完成拖動操作時觸發。事件主體是被拖放元素,在整個拖放操作結束時觸發

draggable 是可列舉的屬性指示該元素是否可以拖動,用於標識元素是否允許使用 HTML拖放API

<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
  <img id="drag1" src="img_logo.gif" draggable="true" ondragstart="drag(event)" width="336" height="69">
<script>
  function allowDrop(e) {
    e.preventDefault()
  }

  function drag(e) {
    e.dataTransfer.setData("text", e.target.id)
  }

  function drop(ev) {
    e.preventDefault()
    var data = e.dataTransfer.getData("text")
    e.target.appendChild(document.getElementById(data))
  }
</script>

其他 HTML5 API

document.querySelector() 和 document.querySelectorAll()

  • querySelector():根據 css 選擇器返回第一個匹配的元素,如果沒有匹配返回 null
  • querySelectorAll():方法返回檔案中匹配指定 CSS 選擇器的所有元素,返回 NodeList 物件。如果 querySelectorAll 沒有匹配的內容返回的是一個空陣列。

classList

  • 控制 CSS 的 增、刪、切換、是否存在某個類
ele.classList.add("addClass")
ele.classList.remove("removeClass")
ele.classList.toggle("toggleClass")
ele.classList.contains("containsClass")

contextMenu

  • 它並不會替換原有的右鍵選單,而是將你的自定義右鍵選單新增到瀏覽器的右鍵選單裡
<div id="menu">Lorem ipsum dolor sit amet.</div>
<script>
  menu.addEventListener('contextmenu', function() {
    alert('點我!')
  })
</script>

你也可以阻止它,顯示自己自定義的選單

menu.addEventListener('contextmenu', function(e) {
  e.preventDefault()
  // ...
})

dataset

  • 通過 dataset 可以方便的獲取或設定 data-* 自定義資料屬性集
<div class="avatar" data-user="lisi" data-avatar-type="circle" data-animateSpeed>
  lorem
</div>
<script>
  const avatar = document.querySelector('.avatar')
  avatar.dataset.user === 'lisi' // true
  avatar.dataset.avatarType === 'circle' // true
  avatar.dataset.animateSpeed = 4000
    
  // 新增不存在的屬性
  avatar.dataset.id = 'user'
  // console.log(avatar.dataset)
</script>

tabindex

  • tabindex 屬性規定當使用 "tab" 鍵進行導航時元素的順序。
  • 在 HTML4.01 中,tabindex 屬性可用於:<a><area><button><input><object><select><textarea>

    • 在 HTML5 中,tabindex 屬性可用於任何的 HTML 元素(它會驗證任何 HTML 元素。但不一定是有用)
<ul>
  <li tabindex="2">HTML</li>
  <li tabindex="1">CSS</li>
  <li tabindex="3">JAVASCRIPT</li>
</ul>

accessKey

  • accessKey 屬性規定啟用(使元素獲得焦點)元素的快捷鍵。
  • 不同瀏覽器使用的快捷鍵方法不同:

    • IE,Chrome,Safari,Opera 15+:[ALT] + accesskey
    • Opera prior version 15:[SHIFT] [ESC] + accesskey
    • Firefox:[ALT] [SHIFT] + accesskey
<input accesskey="b" />
<a href="https://www.baidu.com/" accesskey="c">百度一下,你就知道</a>

FullScreen(全螢幕)

  • FullScreen API 是一個新的 JavaScript API
  • 全螢幕顯示可以是任意元素
  • HTML5 API 存在相容性問題(IE9+),即使高版本瀏覽器也有相容性問題
  • 不同瀏覽器需要新增不同的字首 webkit、moz、o、ms
const fullscreen = (mode = true, el = 'body') =>
  mode
    ? document.querySelector(el).requestFullscreen()
    : document.exitFullscreen();

fullscreen(); // 預設全螢幕模式開啟 "body"
fullscreen(false); // 退出全螢幕模式

:fullscreen CSS 偽元素代表一個元素,當瀏覽器是在全螢幕模式下的顯示。

.elem:fullscreen {
  background-color: #e4708a;
  width: 100vw;
  height: 100vh;
}

預載入

  • 預取 CSS 檔案,預渲染整個頁面或提前解析域
  • 瀏覽器有一個簡單的內建方式來完成所有這些事情。有六個 <link rel> 標記指示瀏覽器預載入內容:
<link rel="prefetch" href="/index.css" as="style" />
<link rel="preload" href="/index.css" as="style" />
<link rel="preconnect" href="https://example.com" />
<link rel="dns-prefetch" href="https://example.com" />
<link rel="prerender" href="https://example.com/about.html" />
<link rel="modulepreload" href="/index.js" />

preload

  • 使用 preload 作為 rel 屬性的屬性值。還需要通過 hrefas 屬性指定需要被預載入資源的資源路徑及其型別。
<link rel="preload" href="index.css" as="style">
  • 使用 as 來指定將要預載入的內容的型別,將使得瀏覽器能夠:

    • 更精確地優化資源載入優先順序。
    • 匹配未來的載入需求,在適當的情況下,重複利用同一資源。
    • 為資源應用正確的內容安全策略
    • 為資源設定正確的 Accept 請求頭。
    • MDN 完整列表

prefetch

  • <link rel="prefetch"> 要求瀏覽器在後臺下載並快取資源(例如 JS 或 CSS)。下載的優先順序較低,因此不會干擾更重要的資源。當您知道在下一個頁面上需要該資源,並且想要提前對其進行快取時,這將很有幫助。
  • 下載資源後,瀏覽器不執行任何操作。不執行 JS,不應用 CSS。它只是被快取了,因此當其他需求時,它立即可用。
  • 通過 link 標籤的 rel 屬性指定為 "prefetch",在 href 屬性裡指定要載入資源的地址
<!-- 預載入整個頁面 -->
<link rel="prefetch" href="https://juejin.cn/user/96412754251390" />

<!-- 預載入一個圖片 -->
<link rel="prefetch" href="https://s3.ap-northeast-1.wasabisys.com/img.tw511.com/202105/pexels-photo-918281iaotwodsk1d.jpg?auto=compress&cs=tinysrgb&dpr=1&w=500" />

preconnent

  • <link rel="preconnect"> 要求瀏覽器提前執行到域的連線。
<link rel="dns-prefetch" href="https://juejin.cn/user/96412754251390"> 

dns-prefetch

  • DNS-prefetch(DNS 預獲取)是嘗試在請求資源之前解析域名。這可能是後面要載入的檔案,也可能是使用者嘗試開啟的連結目標。
<link rel="dns-prefetch" href="https://juejin.cn/user/96412754251390"> 

連結預載入的一些注意事項

  • 預載入可以跨域進行,當然,請求時 cookie 等資訊也會被傳送。
  • 預載入可能破壞網站統計資料,而使用者並沒有實際存取。
  • 瀏覽器相容性不是很好

prerender

  • <link rel="prerender"> 要求瀏覽器載入 URL 並將其呈現在不可見的標籤中。當使用者單擊指向該 URL 的連結時,應立即呈現該頁面。當您確實確定使用者接下來將存取特定頁面並且想要更快地呈現它時,這將很有幫助。
<link rel="prerender" href="https://juejin.cn/user/96412754251390" />
  • 當您確定大多數使用者將導航到特定頁面時,您希望加快速度,那麼你可以使用它

modulepreload

  • <link rel="modulepreload"> 告訴瀏覽器儘快下載,快取和編譯 JS 模組指令碼。
  • 使用它可以更快地載入您的 ES 模組應用程式。此標記僅適用於預載入 ES 模組——即您通過 import ... 或匯入的模組 <script type="module">
<link rel="modulepreload" href="/static/Header.js" />

其他

對於 WEB 標準以及 W3C 的理解與認識問題

  • web 標準簡單來說可以分為結構、表現和行為

    • 結構主要是有 HTML 標籤組成。或許通俗點說,在頁面 body 裡面我們寫入的標籤都是為了頁面的結構。
    • 表現即指 css 樣式表,通過 css 可以是頁面的結構標籤更具美感。
    • 行為是指頁面和使用者具有一定的互動,同時頁面結構或者表現發生變化,主要是由 js 組成。
  • web 標準一般是將該三部分獨立分開,使其更具有模組化。但一般產生行為時,就會有結構或者表現的變化,也使這三者的界限並不那麼清晰。
  • 全球資訊網聯盟(W3C)是一個國際組織,它開發開放標準以確保 Web 的長期發展。
  • W3C 對 web 標準提出了規範化的要求,也就是在實際程式設計中的一些程式碼規範:

    • web 標準規範要求,書寫標籤必須閉合、標籤小寫、不亂巢狀,標籤規範可以提高搜尋引擎對頁面的抓取效率,對 SEO 很有幫助
    • 建議使用外連 CSS和 JS 指令碼,從而達到結構、表現與行為的分離,提高頁面的渲染速度,提高使用者的體驗
    • 樣式與標籤的分離,更合理的語意化標籤,使內容能被更多的使用者所存取、內容能被更廣泛的裝置所存取、更少的程式碼和元件, 從而降低維護成本、改版方便
    • 不需要變動頁面內容,便可提供列印版本而不需要複製內容,提高網站易用性;
    • 遵循 w3c 制定的 web 標準,能夠使使用者瀏覽者更方便的閱讀,使網頁開發者之間更好的交流。

前端頁面有哪三層構成,分別是什麼?作用是什麼?

  • 分成:結構層、表示層、行為層。
  • 結構層(structural layer):由 HTML 或 XHTML 之類的標示語言負責建立。標籤,也就是那些出現在尖括號裡的單詞,對網頁內容的語意含義做出了描述,但這些標籤不包含任何關於如何顯示有關內容的資訊。例如,P 標籤表達了這樣一種語意:「這是一個文欄位。」
  • 表示層(presentation layer):由 CSS 負責建立。 CSS 對「如何顯示有關內容」的問題做出了回答。
  • 行為層(behaviorlayer):負責回答「內容應該如何對事件做出反應」這一問題。這是 JavaScript 語言和 DOM 主宰的領域。

什麼是漸進式渲染?

  • 漸進式渲染(Progressive rendering):是用於提高網頁效能(尤其是提高使用者感知的載入速度),以儘快呈現頁面的技術。
  • 此類技術的範例:

    • 圖片懶載入:頁面上的圖片不會一次性全部載入。當使用者捲動頁面到圖片部分時,JavaScript 將載入並顯示影象。
    • 確定顯示內容的優先順序(Hierarchical rendering):為了儘快將頁面呈現給使用者,頁面只包含基本的最少量的 CSS、指令碼和內容,然後可以使用延遲載入指令碼或監聽 DOMContentLoaded/load 事件載入其他資源和內容。
    • 非同步載入 HTML 片段:當頁面通過後臺渲染時,把 HTML 拆分,通過非同步請求,分塊傳送給瀏覽器。
  • 非同步片段:使用Marko重新發現漸進式HTML渲染
  • 什麼是漸進式渲染?

你能描述一下漸進增強和優雅降級之間的不同嗎?

漸進增強(Progressive enhancement)

優雅降級(Graceful degradation)

什麼是微格式?在前端構建中應該考慮微格式嗎?

  • 微格式(Microformats)是一種讓機器可讀的語意化 XHTML 詞彙的集合,是結構化資料的開放標準。是為特殊應用而制定的特殊格式。
  • 優點:將智慧資料新增到網頁上,讓網站內容在搜尋引擎結果介面可以顯示額外的提示。(如:豆瓣,有興趣自行 google)
  • Microformats

什麼是字元編碼?

  • 字元編碼是一種將位元組轉換為字元的方法。為了正確地驗證或顯示 HTML 檔案,程式必須選擇適當的字元編碼。這是在標記中指定的:
<meta charset="UTF-8" />
  • UTF-8:Unicode 轉換格式,以8位元為單位,即以位元組為單位。UTF8 中的字元長度可以從1到4個位元組,從而使 UTF8 的寬度可變。

什麼是 WHATWG?

WHATWG(Web 超文字應用技術工作組)是一個對通過標準和測試來發展Web感興趣的人們組成的社群。

什麼是 WebP?

  • WebP 是一種像 JPG、PNG 這樣的影象格式,它的大小比其他格式小大約 10-20%。
  • 由 Google 在2010年開發和推出。
  • 並非所有瀏覽器都支援 WebP。
  • 可以使用外掛將其他格式轉換為 WebP。
  • Web的新影象格式

什麼是 Web 元件?

Web Components 是一套不同的技術,允許您建立可重用的客製化元素(它們的功能封裝在您的程式碼之外)並且在您的web應用中使用它們。不需要需要任何外部庫來工作。

特徵:

Web 應用程式中的可存取性?

維基百科:可存取性是最常用於描述設施或設施,幫助殘疾人,如「輪椅」。這可以擴充套件到盲文標識、輪椅坡道,音訊訊號在人行橫道,輪廓人行道,網站設計,等等。

什麼是 ARIA?

Accessible Rich Internet Applications (ARIA) 是能夠讓殘障人士更加便利的存取 Web 內容和使用 Web 應用(特別是那些由JavaScript 開發的)的一套機制。
  • ARIA 通過 HTML 屬性為螢幕閱讀器提供了額外的資訊。其不影響元素如何被呈現在瀏覽器中。
  • 您可以通過遵循 ARIA 標準(例如:HTML 語意,alt 屬性並以預期的方式使用 [role = button])來使您的網站更易於存取
<style>
  [role='note'] {
    padding: 10px;
    border: 1px solid;
    border-left: 5px solid rebeccapurple;
    color: rebeccapurple;
    border-radius: 5px;
  }
</style>
<section>
  <div role="note">
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo illum cum
    totam.
  </div>
</section>
  • ARIA role 沒有為大多數元素的預設語意新增任何內容
  • 在某些情況下,HTML 元素的語意可以通過 ARIA role,狀態或屬性來表達。常被稱為元素的「預設隱式ARIA語意
  • ARIA 允許開發人員以有意義的方式重新發明和擴充套件本機 HTML 特性。但它的特性與內建技術相比是脆弱的。

一些冗餘 ARIA 的範例:

<button role="button">按我</button>
<a href="https://www.baidu.com" role="link"></a>
<input type="checkbox" role="checkbox" />
<input type="radio" role="radio" />
  • HTML5 使用預設的隱式語意定義了一組新的結構和分段元素,這些語意與 ARIA role 匹配(在某些情況下):

    • 使用 role = button 時,考慮使用 <button> 元素,或者其他各種原生 HTML 按鈕型別。
    • 使用 role=link 時,考慮改用 <a href> 元素。
    • 使用 role=headingaria-level="1-6",考慮改用 <h1><h6> 元素。
    • 使用 role=listrole=listitem 時,考慮改用 <ol><ul><li> 元素。
    • 使用 role=listboxrole=option,考慮改用 <select><option> 元素。
    • 使用 role=checkboxrole=radio 時,考慮改用 <input type="checkbox"><input type="radio"> 元素。
    • 使用 role=textbox,可以考慮使用 <input type="text"> 或搜尋、電子郵件、url 或電話。
    • articleasidefooterheadermainnavsection 等等…
    • 這意味著在實現後,瀏覽器將公開該元素的預設隱式語意,因此您不必這樣做。
  • MDN:ARIA
  • 在 HTML 和 ARIA 大括號上(預設的隱式 ARIA 語意,他們不想讓你知道)
  • HTML5 – W3C建議書2014年10月28日
  • 在HTML中使用ARIA的注意事項

什麼是螢幕閱讀器?

螢幕閱讀器是提供輔助技術的軟體程式,該技術可以使殘障人士(例如,沒有視力,聲音或滑鼠能力的人)使用 Web 應用程式。

HTML 開發準則

  • 符合W3C:所有頁面都需要使用 W3C 驗證程式進行測試,以識別 HTML 程式碼中可能存在的問題。
  • 清理註釋:在將頁面傳送到生產環境之前,需要刪除不必要的程式碼。
  • 錯誤頁面:每個網站都應該存在錯誤 404 頁面和 5xx。
  • HTML5語意元素:適當使用了 HTML5 語意元素(<header><section><footer><main>...)
  • HTMLHint:我使用工具來幫助我分析我的HTML程式碼可能遇到的任何問題。

    • Dirty markup
    • webhint 是一個可自定義的整理工具,可通過檢查程式碼中的最佳做法和常見錯誤來幫助您提高網站的可存取性,速度,跨瀏覽器相容性以及其他功能。
  • 連結檢查器:檢查頁面連結是否可用,請確認您沒有任何 404 錯誤。
  • Noopener:如果您正在使用帶有 target ="_ blank" 的外部連結,則您的連結應具有 rel="noopener" 屬性,以防止標籤被挪用。如果您需要支援舊版本的 Firefox,請使用 rel="noopener noreferrer"
  • HTML 程式碼規範:開發一致、靈活和可持續的 HTML 和 CSS 的標準。
  • 使用出色的開源工具 W3C tools 將程式碼發揮最大潛能。

HTML 效能優化

  • 為頁面測速制定樣式和指令碼
  • 壓縮 HTML:將註釋、空格和空行從生產檔案中刪除。

  • 刪除不必要的屬性:像 type="text/javascript" or type="text/css" 這樣的屬性應該被移除。

    • 型別屬性不是必需的,因為 HTML5 把 text/csstext/javascript 作為預設值。沒用的程式碼應在網站或應用程式中刪除,因為它們會使網頁體積增大。
    • 確保所有和 <script> 標記都沒有任何 type 屬性。
    • The Script Tag | CSS-Tricks
  • 避免指令碼阻塞載入。確保在使用 JavaScript 程式碼之前載入 CSS。

  • 儘可能使用 async 和 defer

    • 確保 JavaScript 指令碼相容 async 和 defer,任何時候都要儘可能使用 async ,特別是當你有較多的 script 標籤時。
    • 這樣在載入 JavaScript 的過程中頁面就不會重新繪製,否則,瀏覽器在不具有這些特性的 script 標籤後就不會重繪任何東西。
    • 消除渲染阻塞資源
  • DNS 預取:一次 DNS 查詢時間大概在 60-120ms 之間或者更長,提前解析網頁中可能的網路連線域名
<link rel="dns-prefetch" href="http://example.com/">
  • 減少內聯指令碼的數量

    • 內聯指令碼在頁面載入過程中消耗很多資源,因為解析器認為內聯指令碼會改變頁面結構。
    • 通常,儘量少的使用內聯指令碼和減少用 document.write() 來輸出內容,在一定情況下可以加速整體頁面的載入。現在瀏覽器中一般使用現代的 W3C DOM 方法操作頁面內容,優於使用 document.write() 的傳統方法。
  • 縮小和壓縮影象

    • 較大的影象會導致頁面需要更多的時間來載入。在將影象新增到頁面之前,請考慮使用 Photoshop等影象處理工具內建的壓縮功能,或使用 Compress JpegTiny PNG 等專用工具對影象進行壓縮
  • 最小化檔案數量

    • 減少一個頁面參照的檔案數量可以降低在下載一個頁面的過程中需要的 HTTP 請求數量,從而減少這些請求的收發時間。
    • 根據其快取設定,瀏覽器可能會為每個所參照的檔案傳送一個帶 If-Modified-Since 的請求給網路伺服器,以查詢這些檔案自上次載入後是否有被修改。查詢參照檔案上次修改時間會花費太多時間,導致網頁首屏延遲,這是因為在渲染頁面之前瀏覽器必須確認每個檔案的修改時間。
  • 最小化 iframe 的數量:僅在沒有任何其他技術可行性時才使用 iframe。
  • 避免節點深層級巢狀:深層級巢狀的節點在初始化構建時往往需要更多的記憶體佔用,並且在遍歷節點時也會更慢些,這與瀏覽器構建 DOM 檔案的機制有關。瀏覽器會把整個 HTML 檔案的結構儲存為 DOM "樹" 結構。當檔案節點的巢狀層次越深,構建的 DOM 樹層次也會越深。
  • 頁面快取:在不設定頁面快取的情況下,每次重新整理頁面會重新讀取伺服器檔案。設定頁面快取,每次重新整理可從本地讀取,提高頁面載入效率

    • 通過設定頁面頭的 expires 來定義頁面過期時間,將過期時間定久一點就達到了 "永久" 快取。
<meta http-equiv="expires" content="Sunday 26 October 2099 01:00 GMT" />

參考