摘要:該區(qū)域代表可以被所控制的畫(huà)布。那么現(xiàn)在第二個(gè)問(wèn)題,識(shí)別該文檔,這或許不是大部分用戶(hù)的需求,但小部分用戶(hù)并不意味著人數(shù)少。因此一個(gè)基于的請(qǐng)求于標(biāo)準(zhǔn)內(nèi)提出。
前言
作為程序員,技術(shù)的落實(shí)與鞏固是必要的,因此想到寫(xiě)個(gè)系列,名為 why what or how 每篇文章試圖解釋清楚一個(gè)問(wèn)題。
這次的 why what or how 主題:現(xiàn)在幾乎所有人都知道了 HTML5 ,那么 H5 到底相比于 HTML4 有什么區(qū)別呢?
升級(jí)版?標(biāo)準(zhǔn)版!HTML5 做為 HTML 標(biāo)準(zhǔn)的第 5 版,于 2014 年發(fā)布,相信關(guān)注過(guò) HTML5 的發(fā)展史的朋友都知道該版本是 WHATWG 和 W3C 握手言和后誕生的,是 W3C 組織與瀏覽器廠商相互妥協(xié)的結(jié)果,其中的絕大部分規(guī)范都由 WHATWG 組織所制定,之后由 W3C 采納并入標(biāo)準(zhǔn)中。
但 HTML5 是 HTML4 的升級(jí)版嗎?
是也不是,如果以版本的更迭來(lái)看,確實(shí),HTML5 確實(shí)在 HTML4 之后誕生,但是 HTML5 本質(zhì)上卻已經(jīng)不同于 HTML4 了。
相信大家目前都還留有對(duì) HTML4 的些許印象,在寫(xiě) HTML4 時(shí)需要加一段特殊的說(shuō)明來(lái)聲明文檔類(lèi)型的:
該段聲明說(shuō)明了該文檔基于 http://www.w3.org/TR/html4/strict.dtd 規(guī)范,從一個(gè)側(cè)面來(lái)看,該文檔僅僅是符合這種規(guī)范的文本而已,而這種規(guī)范被稱(chēng)為 SGML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言)。
接著在來(lái)看看 HTML5 的文檔聲明:
簡(jiǎn)簡(jiǎn)單單,清晰明了,說(shuō)明該文檔是 HTML 文檔,并沒(méi)有基于規(guī)范。
從瀏覽器的角度來(lái)對(duì)比,HTML5 之前的版本,瀏覽器必須要從 W3C 官網(wǎng)上獲取規(guī)范文件,才能解析文檔,而 HTML5 文檔可以被瀏覽器直接識(shí)別。
這些角度都表明了,HTML5 之前的 HTML 是 SGML 規(guī)范的一種實(shí)現(xiàn),而 HTML5 卻是原原本本的 HTML,有自己的規(guī)范,因此 HTML5 可以認(rèn)為是一種新的標(biāo)準(zhǔn),該規(guī)標(biāo)準(zhǔn)誕生于 HTML4,卻不是 HTML4 的升級(jí)。
但不管是基于 SGML 的 HTML 版本,還是 HTML5 版本,其語(yǔ)法內(nèi)容都差不多。因此也不需要過(guò)多的糾結(jié)在這個(gè)問(wèn)題上,實(shí)用主義者,能用好用就行~
語(yǔ)義化在看過(guò)什么是 CSS?之后(沒(méi)有的可以看看),應(yīng)該知道樣式的發(fā)展過(guò)程中經(jīng)歷了一個(gè)用標(biāo)簽表達(dá)樣式的階段,該階段產(chǎn)生了一些樣式標(biāo)簽,比如
結(jié)構(gòu)化,樣式脫離的 HTML 文檔,極大提高了文檔的表達(dá)力,不管是機(jī)器還是人類(lèi)都能更快的理解文檔的結(jié)構(gòu),這種文檔就被稱(chēng)為語(yǔ)義化文檔。
語(yǔ)義化主要體現(xiàn)在以下幾個(gè)方面:
結(jié)構(gòu)標(biāo)簽寫(xiě)過(guò) HTML5 的都知道大概有哪些標(biāo)簽新加了進(jìn)來(lái),這里大致羅列一下
標(biāo)簽 | 釋義 |
---|---|
section | 代表文檔組成的一部分,應(yīng)該與 h[1-6] 結(jié)合使用,表示文檔結(jié)構(gòu)。 |
article | 代表文檔的獨(dú)立內(nèi)容區(qū)域,該區(qū)域內(nèi)容為博文、報(bào)紙文章等內(nèi)容。 |
main | 代表文檔的主要內(nèi)容區(qū)域。 |
aside | 代表與內(nèi)容主題略有相關(guān)的區(qū)域。 |
header | 代表該文檔的介紹性區(qū)域。 |
footer | 代表該文檔的頁(yè)腳,通常用于存放版權(quán),作者等信息。 |
nav | 代表文章導(dǎo)航區(qū)域。 |
figure | 代表該區(qū)域內(nèi)有多媒體內(nèi)容,通常多媒體標(biāo)簽作為該標(biāo)簽的子元素。 |
template | 模板區(qū)域,可以被 JavaScript 所使用。 |
video | 通過(guò)該標(biāo)簽可以引用視頻,該標(biāo)簽代表視頻可以顯示的區(qū)域。 |
audio | 通過(guò)該標(biāo)簽可以引用音頻,該標(biāo)簽代表音頻可以顯示的區(qū)域。 |
track | 該標(biāo)簽為 video 提供了字幕。 |
mark | 代表需要特殊注意的內(nèi)容區(qū)域。 |
progress | 該區(qū)域代表某項(xiàng)任務(wù)的進(jìn)度。 |
meter | 該區(qū)域代表某項(xiàng)內(nèi)容的使用量,比如 CPU 使用量等。 |
time | 該區(qū)域代表時(shí)間。 |
canvas | 該區(qū)域代表可以被 JavaScript 所控制的畫(huà)布。 |
可能有些朋友會(huì)納悶,這些東西其實(shí)吧,也不是那么的重要,用 div + css 也都能實(shí)現(xiàn),而且各個(gè)瀏覽器上表現(xiàn)的還都一致,還不用考慮兼容問(wèn)題。那么為什么這里還提呢?
試想一個(gè)問(wèn)題?
如果你是瀏覽器,或者說(shuō)是解析 HTML5 文本內(nèi)容的程序,你會(huì)怎么看待 HTML4 與 HTML5 ?
首先第一個(gè)需要解決的問(wèn)題:顯示頁(yè)面,兩者都能解析,生成樹(shù)狀結(jié)構(gòu),并成功的顯示頁(yè)面,這也是大部分用戶(hù)所需要的。在這方面兩者平局,HTML5 沒(méi)有任何的優(yōu)勢(shì)。
那么現(xiàn)在第二個(gè)問(wèn)題,識(shí)別該文檔,這或許不是大部分用戶(hù)的需求,但小部分用戶(hù)并不意味著人數(shù)少。
相信大部分朋友都有使用搜索引擎的習(xí)慣,那么搜索引擎是如何幫你找到這個(gè)網(wǎng)頁(yè)的呢?
搜索引擎通過(guò)適當(dāng)?shù)牟呗越馕鐾ㄟ^(guò)爬蟲(chóng)抓取到的網(wǎng)頁(yè)內(nèi)容,將該文章進(jìn)行分類(lèi),通過(guò)用戶(hù)給的搜索詞進(jìn)行匹配,最終將結(jié)果呈現(xiàn)給用戶(hù),爬蟲(chóng)的解析策略,面對(duì) HTML4 時(shí),需要識(shí)別出特定的 div 而這個(gè)特定的 div 該如何去找呢?經(jīng)驗(yàn)?特定字符串?面對(duì) HTML4 ,只能得到一個(gè)個(gè)的 div 而哪個(gè) div ,emmm... 不好找。面對(duì) HTML5 呢?程序從結(jié)構(gòu)就能大致理解文檔的結(jié)構(gòu),進(jìn)而識(shí)別出該篇文章的大體內(nèi)容。
問(wèn)題二可以簡(jiǎn)單認(rèn)為:我們需要生成文章大綱,一篇文章可以有幾部分的內(nèi)容組成,而規(guī)范這些內(nèi)容的就是大綱,相信有寫(xiě)過(guò)文章的都知道大綱的作用,可以清醒的表達(dá)出內(nèi)容,那么 HTML4 呢,一堆 div 分不清哪個(gè)是主體,哪個(gè)是次要內(nèi)容,但 HTML5 呢,結(jié)構(gòu)清晰,解析程序也能很快的生成文檔的大綱。
大綱只能用在搜索引擎嗎?并不是,閱讀設(shè)備就很需要大綱生成目錄,無(wú)障礙設(shè)備可以識(shí)別到文檔的主體內(nèi)容等等。
看到這里,相信大家對(duì)于語(yǔ)義化標(biāo)簽的重要性也有了了解,使用成本幾乎為 0,但文檔的清晰程度卻上了一個(gè)層級(jí),干嘛不用呢?
新增的表單類(lèi)型表單類(lèi)型(type)代表了改表單內(nèi)容的類(lèi)型,新增了以下幾個(gè)
tel
search
url
date
time
number
range
color
新的標(biāo)簽屬性屬性 | 示例 | 含義 |
---|---|---|
target | base 標(biāo)簽新增 target屬性,雖然之前已經(jīng)被廣泛的使用了。 | |
charset | meta 標(biāo)簽新增 charset 屬性,規(guī)范文檔所使用的字符集。 | |
placeholder | 可輸入的表單元素新增 placeholder 屬性,代表默認(rèn)內(nèi)容。 | |
form | 表單元素新增 form 屬性,代表關(guān)聯(lián)的 form 表單,而不需要在 form 標(biāo)簽內(nèi)。 | |
contenteditable | 代表該元素可編輯。 | |
data-* | 與該元素相關(guān)聯(lián)的數(shù)據(jù),可在 JavaScript 中獲取。 |
以上為 HTML5 語(yǔ)義化的具體呈現(xiàn),希望大家擁抱并使用 HTML5 的新標(biāo)簽。
多媒體HTML5 的上一代標(biāo)準(zhǔn) HTML4 于 1999 年發(fā)布,當(dāng)時(shí)互聯(lián)網(wǎng)還處于圖文混排的時(shí)代,通訊也不是很發(fā)達(dá),數(shù)據(jù)的交互受限于網(wǎng)速,但是近 20 年來(lái)數(shù)據(jù)通訊的高速發(fā)展圖文混排已經(jīng)不能滿足用戶(hù)的需求了,由于瀏覽器并不支持視頻促成了 Flash/ActionScript 的發(fā)展,但是由于 Flash 的繁瑣(需要裝插件)以及安全問(wèn)題,Apple 拒絕使用 Flash,之后各大瀏覽器廠商也開(kāi)始重視 Flash 的安全問(wèn)題,提出了多媒體標(biāo)簽,直到 HTML5 規(guī)范化了多媒體應(yīng)用。
相關(guān)多媒體標(biāo)簽
Audio
Video
建議查看英文的相關(guān)文檔,中文的翻譯文檔好像還沒(méi)有及時(shí)跟進(jìn)。
除了多媒體標(biāo)簽的更新,這里同時(shí)還列舉下一些與顯示相關(guān)的內(nèi)容:
Canvas
畫(huà)布,可以使用 JavaScript 在改元素規(guī)定的區(qū)域內(nèi)進(jìn)行繪畫(huà),文檔說(shuō)明。
WebGL
光柵化的圖片繪畫(huà)引擎,主要用于 3D 制作,文檔說(shuō)明,以及WebGL 理論基礎(chǔ)
Camera API
通過(guò)Camera API,你可以使用手機(jī)的攝像頭拍照,然后把拍到的照片發(fā)送給當(dāng)前網(wǎng)頁(yè)。
SVG
現(xiàn)在可以直接在 HTML5 文檔中寫(xiě) SVG(可縮放矢量圖形),一種用于描述基于二維的矢量圖形的,基于 XML 的標(biāo)記語(yǔ)言。文檔說(shuō)明。
MathML
MathML(Mathematical Markup Language),是一種基于 XML 的標(biāo)記語(yǔ)言,用以描述數(shù)學(xué)公式,但目前瀏覽器的支持力度有點(diǎn)低。具體可以查看文檔說(shuō)明
通信HTML5 之前,JavaScript 只能通過(guò) XMLHttpRequest 與后端程序進(jìn)行交互,隨著 HTML5 標(biāo)準(zhǔn)的提出,前端可以使用各種各樣的姿勢(shì)與后端進(jìn)行溝通,數(shù)據(jù)的交互變的簡(jiǎn)單,靈活。
fetchXMLHttpRequest,雖然在實(shí)際開(kāi)發(fā)中幾乎很難使用到它,但是對(duì)于它的封裝庫(kù)我們卻經(jīng)常使用,比如 axios $.ajax 。雖然說(shuō)封裝的庫(kù)降低使用成本,但源頭是復(fù)雜的,而且 XMLHttpRequest 是基于回調(diào)的異步模式,雖然 axios 進(jìn)行了 Promise 化,但畢竟不是原生支持。因此一個(gè)基于 Promise 的請(qǐng)求 API 于 HTML5 標(biāo)準(zhǔn)內(nèi)提出:fetch。
一個(gè)簡(jiǎn)單的 fetch 例子
fetch("http://example.com/movies.json") .then(function(response) { return response.json(); }) .then(function(myJson) { console.log(myJson); });
fetch 支持兩個(gè)參數(shù),
資源地址
請(qǐng)求參數(shù),用于設(shè)置請(qǐng)求方式,請(qǐng)求頭,請(qǐng)求體等內(nèi)容,一個(gè) JavaScript 對(duì)象。
學(xué)習(xí)資源:
MDN 使用 Fetch
WHATWG Fetch
WebSocket在 HTML5 出現(xiàn)之前,做一個(gè)實(shí)時(shí)聊天的 web 項(xiàng)目是極其困難的,由于之前的版本僅支持瀏覽器主動(dòng)向服務(wù)器進(jìn)行發(fā)送內(nèi)容,必須先有請(qǐng)求才能有服務(wù)器響應(yīng)的數(shù)據(jù),簡(jiǎn)單的來(lái)說(shuō)服務(wù)器并不能主動(dòng)將數(shù)據(jù)提交給客戶(hù)端。
面對(duì)這些需求,大家的做法通常是輪詢(xún),通過(guò)前端設(shè)置一個(gè)定時(shí)器,每隔固定的時(shí)間去請(qǐng)求服務(wù)器資源,即使服務(wù)器并沒(méi)有發(fā)生數(shù)據(jù)更新。這浪費(fèi)了極大的服務(wù)器資源,那么有沒(méi)有一種方式支持服務(wù)器推送呢?
有!WebSocket 是 HTML5 新增的一種協(xié)議,目的是在瀏覽器和服務(wù)器之間建立一個(gè)雙向數(shù)據(jù)通道,瀏覽器可以推送數(shù)據(jù)到服務(wù)端,服務(wù)端也可以推送數(shù)據(jù)到客戶(hù)端。WebSocket 對(duì)于前端來(lái)說(shuō)僅是一個(gè)簡(jiǎn)單的 API,最重要的是服務(wù)端的支持。
WebSocket 的客戶(hù)端代碼示例
// 創(chuàng)建鏈接 const socket = new WebSocket("ws://localhost:8080"); // 鏈接開(kāi)啟事件 socket.addEventListener("open", function (event) { // 向服務(wù)端推送數(shù)據(jù) socket.send("Hello Server!"); }); // 服務(wù)端推送事件,event.data 即為服務(wù)端推送的數(shù)據(jù) socket.addEventListener("message", function (event) { console.log("Message from server ", event.data); });
至于服務(wù)端如何實(shí)現(xiàn),不同的語(yǔ)言有不同的實(shí)現(xiàn),比較出名的是 Node 下的 Socket.IO,如果擔(dān)心服務(wù)端語(yǔ)言實(shí)現(xiàn)困難,不妨用 Node 搭建中間層,使用 Node 進(jìn)行與客戶(hù)端的溝通,并將數(shù)據(jù)交由服務(wù)端程序處理。當(dāng)然也可以查看 MDN 的文章:編寫(xiě) WebSocket 服務(wù)器
一些資源
WHATWG Web sockets
websocket.org HTML5 WebSocket
MDN WebSockets
EventSourcefetch 實(shí)現(xiàn)了請(qǐng)求的 Promise 化,WebSocket 實(shí)現(xiàn)了雙工通信,那么 EventSource 又是什么?
簡(jiǎn)單的來(lái)說(shuō),EventSource 實(shí)現(xiàn)了服務(wù)端對(duì)客戶(hù)端的單向通信,可以理解為客戶(hù)端是訂閱者,服務(wù)端是內(nèi)容發(fā)布者,也就是發(fā)布訂閱模式的實(shí)現(xiàn)。
一個(gè)簡(jiǎn)單的例子
// 開(kāi)始訂閱 var evtSource = new EventSource("sse.php"); var eventList = document.querySelector("ul"); // 服務(wù)端發(fā)布數(shù)據(jù)回調(diào) evtSource.onmessage = function(event) { // event.data 即為服務(wù)端發(fā)布的數(shù)據(jù) console.log("Message from server ", event.data); }
同樣的前端代碼很簡(jiǎn)單,服務(wù)端需要實(shí)現(xiàn)該通信方式需要有一定的成本。具體可以查看一下文檔
WHATWG EventSource
MDN EventSource
see.php 編寫(xiě)
WebRTCWebRTC(網(wǎng)頁(yè)即時(shí)通信),是一個(gè)支持網(wǎng)頁(yè)瀏覽器進(jìn)行實(shí)時(shí)語(yǔ)音對(duì)話或視頻對(duì)話的 API。由于該 API 目前并未納入標(biāo)準(zhǔn)中,這里就不過(guò)多的深入了,可以通過(guò)以下文檔進(jìn)行了解:
MDN WebRTC API
W3C WebRTC 1.0
存儲(chǔ)在 HTML5 出現(xiàn)之前,前端開(kāi)發(fā)者僅能通過(guò) cookie 來(lái)存儲(chǔ)用戶(hù)在不同頁(yè)面之間跳轉(zhuǎn)的數(shù)據(jù),但使用 cookie 來(lái)存儲(chǔ)數(shù)據(jù)其意義上是不對(duì)的,不能說(shuō) cookie 可以在同域名下通用,就讓它來(lái)攜帶各種各樣的數(shù)據(jù),cookie 應(yīng)該是用來(lái)標(biāo)志用戶(hù)身份的。HTML5 出現(xiàn)之后,規(guī)范了數(shù)據(jù)的存儲(chǔ),cookie 也回到了原始的用途。
storage相信大家對(duì)于該 API 已經(jīng)熟悉的不能在熟悉了,storage 分為兩部分,sessionStorage 與 localStorage,擁有同樣的方法:
setItem
getItem
removeItem
clear
localStorage 會(huì)將數(shù)據(jù)永久的存儲(chǔ)下來(lái)(當(dāng)然用戶(hù)可以主動(dòng)清楚),sessionStorage 中設(shè)置的數(shù)據(jù)當(dāng)用戶(hù)關(guān)閉頁(yè)面后會(huì)清除。
WHATWG Web storage
MDN Storage
IndexedDB小型的數(shù)據(jù)有 storage 已經(jīng)夠用,那么瀏覽器端如何進(jìn)行大量數(shù)據(jù)的存儲(chǔ)呢?IndexedDB 就是 HTML5 給出的答案。IndexedDB 是瀏覽器內(nèi)置的一個(gè)數(shù)據(jù)庫(kù),用于存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)。但這個(gè)數(shù)據(jù)庫(kù)是異步存取數(shù)據(jù)的,說(shuō)實(shí)話有點(diǎn)難使用,如果使用他,那基本上所有的代碼都在 then 方法里了。考慮使用吧。
可以通過(guò)使用 IndexedDB進(jìn)行學(xué)習(xí)和使用。
DOM 的更新 queryquerySelector 使用 CSS 選擇器進(jìn)行選擇元素,僅選取匹配元素中的第一個(gè)。
querySelectorAll 使用 CSS 選擇器進(jìn)行選擇元素,返回所有匹配的元素。
data-*可以通過(guò)在標(biāo)簽上使用 data-* 設(shè)置與元素綁定的數(shù)據(jù),JavaScript 可以通過(guò) dataset 獲取或設(shè)置。
const p = document.querySelector("#title"); p.dataset.text // hello元素添加
prepend 在規(guī)定標(biāo)簽的最前面添加元素
append 在規(guī)定標(biāo)簽最后面添加元素
element 相關(guān)firstElementChild 獲取規(guī)定標(biāo)簽中的第一個(gè)子元素
lastElementChild 獲取規(guī)定標(biāo)簽中的最后一個(gè)子元素
previousElementSibling 獲取前一個(gè)兄弟元素
nextElementSibling 獲取后一個(gè)兄弟元素
類(lèi)名操作Node.classList.add 添加類(lèi)名
Node.classList.remove 移除類(lèi)名
Node.classList.toggle 切換類(lèi)名
Node.classList.contains 檢測(cè)是否有類(lèi)名
拖拽在 HTML4 中想實(shí)現(xiàn)元素拖拽,我們需要這樣一個(gè)過(guò)程,獲取元素,設(shè)置元素定位,與需要被拖入的元素進(jìn)行碰撞檢測(cè),檢測(cè)完成后進(jìn)行拖入操作。在 HTML5 中規(guī)范了這一過(guò)程。
相關(guān)事件
dragstart 設(shè)置在拖動(dòng)元素上,標(biāo)志拖動(dòng)開(kāi)始
dragenter 設(shè)置在拖入元素上,標(biāo)志有元素開(kāi)始拖入到該元素內(nèi)
dragover 設(shè)置在拖入元素上,標(biāo)志元素完全拖入該元素
dragleave 設(shè)置在拖入元素上,標(biāo)志元素即將離開(kāi)該元素
drop 設(shè)置在拖入元素上,標(biāo)志拖動(dòng)元素放下
拖動(dòng)元素與拖入元素可以通過(guò) e.dataTransfer.getData(xxx) e.dataTransfer.setData(xxx, xxx) 進(jìn)行數(shù)據(jù)交互。
MutationObserverMutationObserver 字面意思為變動(dòng)觀察器,用來(lái)觀察文檔節(jié)點(diǎn)的變動(dòng)。相關(guān)文章
了解 HTML5 中的 MutationObserver
MutationObserver
最后DOM 中,接觸最多的也就這些內(nèi)容了,更為詳細(xì)的內(nèi)容可以通過(guò)DOM STANDARD查看。
BOM 的新增在什么是 JAVASCRIPT中,我們提到過(guò) BOM 并沒(méi)有相關(guān)的標(biāo)準(zhǔn)去規(guī)范它,HTML5 中一些沒(méi)有歸到 DOM 中 API 更新就歸到這。
Web Workers我們都知道 JavaScript 是以單線程的形式運(yùn)行在客戶(hù)端,這就避免不了當(dāng)進(jìn)行大規(guī)模的數(shù)據(jù)運(yùn)算時(shí)所帶來(lái)的堵塞問(wèn)題,為解決這一問(wèn)題 HTML5 提出了 Web Workers 的概念,并最終納入規(guī)范。使用 Web Workers 可以將于頁(yè)面渲染無(wú)關(guān)的數(shù)據(jù)運(yùn)算代碼放入另一個(gè)線程,線程間通過(guò) postMessage 發(fā)送數(shù)據(jù),通過(guò) onmessage 回調(diào)獲取數(shù)據(jù)。
一個(gè)簡(jiǎn)單的例子
// workers.js let i = 0; function timedCount() { i = i + 1; postMessage(i); setTimeout(timedCount, 500); } timedCount();
const w = new Worker("workers.js"); w.onmessage=function(event){ console.log("Message from worker ", event.data); };
相關(guān)資源:
WHATWG Worker
MDN Worker
目前大火的 PWA 應(yīng)用,其核心 Service Worker 其實(shí)也是 Web Workers 的一個(gè)實(shí)現(xiàn)。 Service Worker 使用編程的方式來(lái)進(jìn)行資源的緩存,與后臺(tái)進(jìn)行數(shù)據(jù)同步等內(nèi)容。雖然該內(nèi)容已在不少的瀏覽器上實(shí)現(xiàn),但標(biāo)準(zhǔn)仍在草案階段,等出標(biāo)準(zhǔn)規(guī)范在詳細(xì)介紹。
相關(guān)資源
W3C Service Workers
History在 HTML5 之前,前端開(kāi)發(fā)者只能通過(guò) history 對(duì)象進(jìn)行前進(jìn)后退的動(dòng)作,但卻不能在不刷新當(dāng)前頁(yè)面的情況下進(jìn)行 url 修改,在 HTML5 之前,單頁(yè)應(yīng)用僅能通過(guò) hash 模式進(jìn)行路由管理,但通過(guò) HTML5 新提出的 history API ,單頁(yè)應(yīng)用就能像正常應(yīng)用那樣管理頁(yè)面的 url 了。通過(guò)以下 3 個(gè)方法即可:
pushState 不刷新頁(yè)面導(dǎo)航到指定 URL 并產(chǎn)生歷史記錄。
replaceState 不刷新頁(yè)面并將頁(yè)面當(dāng)前 URL 替換為指定 URL,不產(chǎn)生歷史記錄。
popstate 事件 在當(dāng)前頁(yè)面點(diǎn)擊返回時(shí),window 對(duì)象會(huì)觸發(fā)該事件,可以使用 addEventListener 進(jìn)行監(jiān)聽(tīng)。
相關(guān)資源
MDN Drag and Drop API
WHATWG Drag and drop
Drag Drop---API---拖拽事件
requestAnimationFrame通知瀏覽器,在下一次重繪之前調(diào)用指定 callback。由于重繪與屏幕刷新率掛鉤,因此該 API 的調(diào)用也與屏幕刷新率掛鉤,可以使用該 API 進(jìn)行一些復(fù)雜運(yùn)算的分解,將任務(wù)放在每次刷新的間隔中,這樣就不會(huì)產(chǎn)生屏幕要刷新了但瀏覽器卻能及時(shí)繪制出頁(yè)面的尷尬情況出現(xiàn),使得頁(yè)面顯示平滑,不掉幀。因此該 API 的出現(xiàn)促進(jìn)了 Canvas 的發(fā)展,而 Canvas 的發(fā)展又促進(jìn)了頁(yè)游的發(fā)展。
requestAnimationFrame(callback)
如果想實(shí)現(xiàn)類(lèi)似定時(shí)器的效果,只需要在 callback 中再次調(diào)用 requestAnimationFrame 即可。
相關(guān)資源
MDN requestAnimationFrame
全屏 APIElement.requestFullscreen() 將當(dāng)前元素全屏展示
Document.exitFullscreen() 取消全屏顯示
相關(guān)資源
MDN 全屏 API
獲取地理位置信息navigator.geolocation.watchPosition() 監(jiān)聽(tīng)地理位置信息,當(dāng)發(fā)生改變時(shí),觸發(fā)回調(diào)
navigator.geolocation.getCurrentPosition() 獲取地理位置信息
以上兩方法都需要傳入,成功回調(diào)和失敗回調(diào),分別為參一和參二。
相關(guān)資源
MDN 使用地理位置定位
CSS3在什么是 CSS?中,我們提到過(guò),CSS 標(biāo)準(zhǔn)被 W3C 采納,并最終成為 HTML 標(biāo)準(zhǔn)的一部分,因此 CSS 內(nèi)容的更新也算是 HTML5 更新的一部分。
這部分多帶帶說(shuō)吧。
總結(jié)慣例,問(wèn)幾個(gè)問(wèn)題
HTML5 涵蓋了那幾方便面的更新?
通信方式有什么新姿勢(shì)?
語(yǔ)義化的體現(xiàn),以及語(yǔ)義化的作用?
js 如何更好的處理數(shù)據(jù)而不影響頁(yè)面渲染?
單頁(yè)應(yīng)用的 history 是基于那些 api 實(shí)現(xiàn)的?
談?wù)劯惺?/p>
隨著 HTML5 的更新,前端在也不是切圖仔,瀏覽器也開(kāi)始做為了一個(gè) GUI 工具存在,而不僅是為了展示頁(yè)面。相信隨著技術(shù)的發(fā)展,當(dāng)通訊延遲降低到一定程度后,喬幫主的設(shè)想 all in browser 將會(huì)成為現(xiàn)實(shí)。
參考HTML5
HTML5 Differences from HTML4
HTML 5.1 2nd Edition
HTML 5.2
WHATWG
最后的最后該系列所有問(wèn)題由 minimo 提出,愛(ài)你喲~~~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/54301.html
摘要:為標(biāo)記語(yǔ)言提供了一種樣式描述,定義了其中元素的顯示方式。選擇器指明了中的樣式的作用對(duì)象,也就是樣式作用于網(wǎng)頁(yè)中的哪些元素基本語(yǔ)法第一種選擇器叫選擇器在里面寫(xiě)一個(gè),通過(guò)這個(gè)就能找到這個(gè)。一、CSS是什么? 它是一種用來(lái)表現(xiàn)HTML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的一個(gè)應(yīng)用)或XML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的一個(gè)子集)等文件樣式的計(jì)算機(jī)語(yǔ)言。CSS為HTML標(biāo)記語(yǔ)言提供了一種樣式描述,定義了其中元素的顯示方式。...
摘要:發(fā)生在很久以前的及更老的瀏覽器向過(guò)渡時(shí)期。數(shù)據(jù)始終在同源的請(qǐng)求中攜帶即使不需要,會(huì)在瀏覽器和服務(wù)器間來(lái)回傳遞。存儲(chǔ)大小數(shù)據(jù)大小不能超過(guò)。與上面問(wèn)題相連,比也是明智的選擇。表現(xiàn)與結(jié)構(gòu)相分離。兩種設(shè)計(jì)思想是有不同的考慮。 前言: 吾生也有涯,而知也無(wú)涯,以有涯隨無(wú)涯,殆己————莊子 閱讀本文前請(qǐng)做好以下心理準(zhǔn)備:本系列文章將不定期更新。本系列文章不是很?chē)?yán)謹(jǐn)。 前端面試之HTML篇 Pa...
摘要:行內(nèi)元素特征設(shè)置寬高屬性無(wú)效設(shè)置僅左右水平方向有效,上下垂直無(wú)效設(shè)置上下左右都有效內(nèi)容不會(huì)自動(dòng)進(jìn)行換行行內(nèi)塊元素行內(nèi)塊元素綜合了兩者的特征,各有取舍,可以對(duì)任意元素進(jìn)行屬性設(shè)置。 文章大綱來(lái)源:【Day 1】HTML & HTML 5 標(biāo)記語(yǔ)言 XHTML/HTML/HTML 5異同 了解doctype HTML HTML 5 標(biāo)記語(yǔ)言 標(biāo)記語(yǔ)言(ML)即 Markup Langu...
閱讀 2273·2023-04-25 14:50
閱讀 1273·2021-10-13 09:50
閱讀 1874·2019-08-30 15:56
閱讀 1853·2019-08-29 15:29
閱讀 2892·2019-08-29 15:27
閱讀 3569·2019-08-29 15:14
閱讀 1205·2019-08-29 13:01
閱讀 3306·2019-08-26 14:06