前端學習(3)~html5詳解(一)
- 2020 年 2 月 23 日
- 筆記
什麼是 HTML5
HTML5並不僅僅只是做為HTML標記語言的一個最新版本,更重要的是它制定了Web應用開發的一系列標準,成為第一個將Web做為應用開發平台的HTML語言。
總結:HTML5
是新一代開發 Web 富客戶端應用程序整體解決方案。包括:HTML5,CSS3,Javascript API在內的一套技術組合。
富客戶端:具有很強的交互性和體驗的客戶端程序。比如說,瀏覽博客,是比較簡單的客戶端;一個在線聽歌的網站、即時聊天網站就是富客戶端。
HTML5 的應用場景
列舉幾個HTML5 的應用場景:
(1)極具表現力的網頁:內容簡約而不簡單。
(2)網頁應用程序:
- 代替PC端的軟件:iCloud、百度腦圖、Office 365等。
- APP端的網頁:淘寶、京東、美團等。
- 微信端:公眾號、小程序等。
(3)混合式本地應用。
(4)簡單的遊戲。
HTML5 新增的內容
語義化的標籤
語義化的作用
- 能夠便於開發者閱讀和寫出更優雅的代碼。
- 同時讓瀏覽器或是網絡爬蟲可以很好地解析,從而更好分析其中的內容。
- 更好地搜索引擎優化。
總結:HTML的職責是描述一塊內容是什麼(或其意義),而不是它長什麼樣子;它的外觀應該由CSS來決定。
H5在語義上的改進
在此基礎上,HTML5 增加了大量有意義的語義標籤,更有利於搜索引擎或輔助設備理解 HTML 頁面內容。HTML5會讓HTML代碼的內容更結構化、標籤更語義化。
傳統網頁布局:
<!-- 頭部 --> <div class="header"> <ul class="nav"></ul> </div> <!-- 主體部分 --> <div class="main"> <!-- 文章 --> <div class="article"></div> <!-- 側邊欄 --> <div class="aside"></div> </div> <!-- 底部 --> <div class="footer"> </div>
H5 的經典網頁布局:
<!-- 頭部 --> <header> <ul class="nav"></ul> </header> <!-- 主體部分 --> <div class="main"> <!-- 文章 --> <article></article> <!-- 側邊欄 --> <aside></aside> </div> <!-- 底部 --> <footer> </footer>
H5中新增的語義標籤
-
<section>
表示區塊 -
<article>
表示文章。如文章、評論、帖子、博客 -
<header>
表示頁眉 -
<footer>
表示頁腳 -
<nav>
表示導航 -
<aside>
表示側邊欄。如文章的側欄 -
<figure>
表示媒介內容分組。 -
<mark>
表示標記 (用得少) -
<progress>
表示進度 (用得少) -
<time>
表示日期
本質上新語義標籤與<div>
、<span>
沒有區別,只是其具有表意性,使用時除了在HTML結構上需要注意外,其它和普通標籤的使用無任何差別,可以理解成<div class="nav">
相當於<nav>
。
新語義標籤的兼容性處理
IE8 及以下版本的瀏覽器不支持 H5 和 CSS3。解決辦法:引入html5shiv.js
文件。
引入時,需要做if判斷,具體代碼如下:
<!-- 條件注釋 只有ie能夠識別--> <!--[if lte ie 8]> <script src="html5shiv.min.js"></script> <![endif]-->
上方代碼是條件注釋:雖然是注釋,但是IE瀏覽器可以識別出來。解釋一下:
- l:less 更小
- t:than 比
- e:equal等於
- g:great 更大
PS:我們在測試 IE 瀏覽器的兼容的時候,可以使用軟件 ietest,模擬IE6-IE11。
在不支持HTML5新標籤的瀏覽器,會將這些新的標籤解析成行內元素(inline)對待,所以我們只需要將其轉換成塊元素(block)即可使用。
當然,在實際開發中我們更多採用的辦法是:檢測IE瀏覽器的版本,來加載第三方的JS庫來解決兼容問題(如上方代碼所示)。
H5中的表單
H5中新增的表單類型
-
email
只能輸入email格式。自動帶有驗證功能。 -
tel
手機號碼。 -
url
只能輸入url格式。 -
number
只能輸入數字。 -
search
搜索框 -
range
滑動條 -
color
拾色器 -
time
時間 -
date
日期 -
datetime
時間日期 -
month
月份 -
week
星期
上面的部分類型是針對移動設備生效的,且具有一定的兼容性,在實際應用當中可選擇性的使用。
代碼舉例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> <title>表單類型</title> <style> body { margin: 0; padding: 0; background-color: #F7F7F7; } form { max-width: 500px; width: 100%; margin: 32px auto 0; font-size: 16px; } label { display: block; margin: 10px 0; } input { width: 100%; height: 25px; margin-top: 2px; display: block; } </style> </head> <body> <form action=""> <fieldset> <legend>表單類型</legend> <label for=""> email: <input type="email" name="email" required> </label> <label for=""> color: <input type="color" name="color"> </label> <label for=""> url: <input type="url" name='url'> </label> <label for=""> number: <input type="number" step="3" name="number"> </label> <label for=""> range: <input type="range" name="range" value="100"> </label> <label for=""> search: <input type="search" name="search"> </label> <label for=""> tel: <input type="tel" name="tel"> </label> <label for=""> time: <input type="time" name="time"> </label> <label for=""> date: <input type="date" name="date"> </label> <label for=""> datetime: <input type="datetime"> </label> <label for=""> week: <input type="week" name="month"> </label> <label for=""> month: <input type="month" name="month"> </label> <label for=""> datetime-local: <input type="datetime-local" name="datetime-local"> </label> <input type="submit"> </fieldset> </form> </body> </html>
代碼解釋:
<fieldset>
標籤將表單里的內容進行打包,代表一組;而<legend>
標籤的則是 fieldset 里的元素定義標題。
表單元素(標籤)
這裡講兩個表單元素。
1、<datalist>
數據列表:
<input type="text" list="myData"> <datalist id="myData"> <option>本科</option> <option>研究生</option> <option>不明</option> </datalist>
上方代碼中,input里的list屬性和 datalist 進行了綁定。這是個下拉列表
2、<meter>
元素:度量器
- low:低於該值後警告
- high:高於該值後警告
- value:當前值
- max:最大值
- min:最小值。
<meter value="81" min="0" max="100" low="60" high="80"/>
表單屬性
-
placeholder
佔位符(提示文字) -
autofocus
自動獲取焦點 -
multiple
文件上傳多選或多個郵箱地址 -
autocomplete
自動完成(填充的)。on 開啟(默認),off 取消。用於表單元素,也可用於表單自身(on/off) -
form
指定表單項屬於哪個form,處理複雜表單時會需要 -
novalidate
關閉默認的驗證功能(只能加給form) -
required
表示必填項 -
pattern
自定義正則,驗證表單。例如
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> form { width: 100%; /* 最大寬度*/ max-width: 640px; /* 最小寬度*/ min-width: 320px; margin: 0 auto; font-family: "Microsoft Yahei"; font-size: 20px; } input { display: block; width: 100%; height: 30px; margin: 10px 0; } </style> </head> <body> <form action=""> <fieldset> <legend>表單屬性</legend> <label for=""> 用戶名:<input type="text" placeholder="例如:smyhvae" autofocus name="userName" autocomplete="on" required/> </label> <label for=""> 電話:<input type="tel" pattern="1d{10}"/> </label> <label for=""> multiple的表單: <input type="file" multiple> </label> <!-- 上傳文件--> <input type="file" name="file" multiple/> <input type="submit"/> </fieldset> </form> </body> </html>
表單事件
-
oninput()
:用戶輸入內容時觸發,可用於輸入字數統計。 -
oninvalid()
:驗證不通過時觸發。比如,如果驗證不通過時,想彈出一段提示文字,就可以用到它。
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> form { width: 100%; /* 最大寬度*/ max-width: 400px; /* 最小寬度*/ min-width: 200px; margin: 0 auto; font-family: "Microsoft Yahei"; font-size: 20px; } input { display: block; width: 100%; height: 30px; margin: 10px 0; } </style> </head> <body> <form action=""> <fieldset> <legend>表單事件</legend> <label for=""> 郵箱:<input type="email" name="" id="txt1"/> </label> <label for=""> 輸入的次數統計:<input type="text" name="" id="txt2"/> </label> <input type="submit"/> </fieldset> </form> <script> var txt1 = document.getElementById('txt1'); var txt2 = document.getElementById('txt2'); var num = 0; txt1.oninput = function () { //用戶輸入時觸發 num++; //用戶每輸入一次,num自動加 1 //將統計數顯示在txt2中 txt2.value = num; } txt1.oninvalid = function () { //驗證不通過時觸發 this.setCustomValidity('親,請輸入正確哦'); //設置驗證不通過時的提示文字 } </script> </body> </html>
多媒體
在HTML5之前,在網頁上播放音頻/視頻的通用方法是利用Flash來播放。但是大多情況下,並非所有用戶的瀏覽器都安裝了Flash插件,由此使得音頻、視頻播放的處理變得非常複雜;並且移動設備的瀏覽器並不支持Flash插件。
H5裏面提供了視頻和音頻的標籤。
音頻
HTML5通過<audio>
標籤來解決音頻播放的問題。
<audio src="music/yinyue.mp3" autoplay controls> </audio>
我們可以通過附加屬性,來更友好地控制音頻的播放,如:
-
autoplay
自動播放。寫成autoplay
或者autoplay = ""
,都可以。 -
controls
控制條。(建議把這個選項寫上,不然都看不到控件在哪裡) -
loop
循環播放。 -
preload
預加載 同時設置 autoplay 時,此屬性將失效。
為了做到多瀏覽器支持,可以採取以下兼容性寫法:
<!--推薦的兼容寫法:--> <audio controls loop> <source src="music/yinyue.mp3"/> <source src="music/yinyue.ogg"/> <source src="music/yinyue.wav"/> 抱歉,你的瀏覽器暫不支持此音頻格式 </audio>
視頻
HTML5通過<video>
標籤來解決視頻播放的問題。
<video src="video/movie.mp4" controls autoplay></video>
我們可以通過附加屬性,來更友好地控制視頻的播放,如:
-
autoplay
自動播放。寫成autoplay
或者autoplay = ""
,都可以。 -
controls
控制條。(建議把這個選項寫上,不然都看不到控件在哪裡) -
loop
循環播放。 -
preload
預加載 同時設置 autoplay 時,此屬性將失效。 -
width
:設置播放窗口寬度。 -
height
:設置播放窗口的高度。
兼容性寫法:
<!--<video src="video/movie.mp4" controls autoplay ></video>--> <!-- 行內塊 display:inline-block --> <video controls autoplay> <source src="video/movie.mp4"/> <source src="video/movie.ogg"/> <source src="video/movie.webm"/> 抱歉,不支持此視頻 </video>
DOM 操作
獲取元素
- document.querySelector("selector") 通過CSS選擇器獲取符合條件的第一個元素。
- document.querySelectorAll("selector") 通過CSS選擇器獲取符合條件的所有元素,以類數組形式存在。
類名操作
- Node.classList.add("class") 添加class
- Node.classList.remove("class") 移除class
- Node.classList.toggle("class") 切換class,有則移除,無則添加
- Node.classList.contains("class") 檢測是否存在class
自定義屬性
js 里可以通過 box1.index=100;
box1.title
來自定義屬性和獲取屬性。
H5可以直接在標籤里添加自定義屬性,但必須以 data-
開頭。
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <!-- 給標籤添加自定義屬性 必須以data-開頭 --> <div class="box" title="盒子" data-my-name="smyhvae" data-content="我是一個div">div</div> <script> var box = document.querySelector('.box'); //自定義的屬性 需要通過 dateset[]方式來獲取 console.log(box.dataset["content"]); //打印結果:我是一個div console.log(box.dataset["myName"]); //打印結果:smyhvae //設置自定義屬性的值 var num = 100; num.index = 10; box.index = 100; box.dataset["content"] = "aaaa"; </script> </body> </html>