html5
HTML5 是定义 HTML 标准的最新版本, 该术语表示两个不同的概念
- 它是一个新的 HTML 语言, 具有新的元素、属性和行为
- 它有更强大的技术集, 允许更多样化和强大的网站和应用程序, 这个技术集就是 HTML5
- 约等于 HTML + CSS + JS
HTML5 的优势
- 跨平台
- 通吃 PC、Mac、iPhone、 Android 等平台
- 快速迭代
- 导流入口多
- 分发效率高
- 跨平台
IE8 不支持 html5 标签
- 解决 —— 引入
html5shiv.min.js
1
2
3
4<!--[if lte IE 8]>
<script src="html5shiv.min.js"></script>
<![endif]-->
</head>
- 解决 —— 引入
html5 和 html4 的区别
- DOCTYPE
- 文档类型声明
- 决定浏览器解析需要采用的渲染模式
- document.compatMode 可以返回渲染模式
- 文档类型声明
- 根元素
- html4 根元素含有很多说明
- html5 根元素很干净
- content
- html4 在 meta 标签中显式定义
- html5 不需要显式定义, content-type 在请求头中
语义化标签
- 常用语义化标签
- hgroup
- 可以在里边包含多个 h1-h6 标签
- header
- nav
- 主导航
- section
- 页面上的一块区域, 相当于 div
- footer
- aside
- 侧边栏
- ⚠️ 这些语义化标签没有默认样式, 可以直接使用
- hgroup
- 语义化好处
- 代替无意义的 div 标签
- 提升了网页的质量和语义
- 对搜索引擎更友好
h5 新增其他标签
状态标签 (进度条)
- meter —— 用来表示已知范围的标量值或者分数值
- value : 当前数值
- min : 最小值 (默认为0)
- max : 最大值 (默认为1)
- low : 低值区间的上限值
- high : 高值区间的下限值
- optimum : 最优取值
- progress —— 用来表示一项任务的完成进度
- max : 一共需要完成多少工作
- value : 指定进度条已完成的工作量 (没有表示不确定)
- meter —— 用来表示已知范围的标量值或者分数值
列表标签
- datalist —— 包含一组 option 元素, 这些元素表示其表单控件的可选值
- 它的 id 必须要和 input 中的 list 一致
- datails —— 一个 ui 小部件, 用户可以从其中检索附加信息
- open 属性来控制附加信息的显示与隐藏
- summary —— 用做一个 元素的一个内容摘要 (标题)
- datalist —— 包含一组 option 元素, 这些元素表示其表单控件的可选值
注释标签
- ruby —— 展示文字注音或注释
- rt 包裹拼音或注释内容
- ruby —— 展示文字注音或注释
标记标签
- mark —— 着重
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<meter value="55" min="20" max="100" low="40" high="80" optimum="50"></meter>
<progress value="10" max="100"></progress>
<input type="text" placeholder="你最喜欢的是" list="fav">
<datalist id="fav">
<option value="1">栗子</option>
<option value="2">香蕉</option>
<option value="3">苹果</option>
<option value="4">西瓜</option>
</datalist>
<details open>
<summary>李白</summary>
<p>诗仙, 生于...,老婆...</p>
</details>
<span><ruby>邓<rt>deng</rt></ruby></span>
<span>我是<mark>湖北</mark>人</span>
- mark —— 着重
h5 新增表单相关
新增表单格式
- type=”email”
- 校验是否含有 @
- type=”tel”
- 移动端点击 type 为
tel
的表单会弹出数字键盘
- 移动端点击 type 为
- type=”url”
- type=”search”
- 右边带 ❌ , 可以清空表单
- type=”range”
- 滑块条
- 可指定 min、max、step
- type=”number”
- 右边带
上/下
- 右边带
- type=”color”
- 颜色选择器
- type=”datetime”
- 完整日期 (PC 端无作用)
- type=”datetime-local”
- 不含时区
- type=”time”
- 显示时间
- type=”date”
- 显示日期
- type=”week”
- 显示周
- type=”month”
- 显示月
h5 新增表单属性
placeholder
- 提示信息
- 怎么选中 placeholder? —— input :: -webkit-input-placeholder
autofocus
- 自动获得焦点
required
- 必填项
pattern
- 正则校验
1
<input type="text" pattern="\d{1, 5}"/>
- 正则校验
formaction
- 在 submit 里定义提交地址
1
2
3<form>
<input type="submit" value="提交" formaction="http://www.baidu.com"/>
</form>
- 在 submit 里定义提交地址
list
- 为输入框构造一个选择列表
- 表单的 list 值为 datalist 标签的 id
表单验证
validity 对象
- 通过下面的 valid 可以查看验证是否通过, 如果八种验证都通过, 则返回
true
否则返回false
- valueMissing
- typeMismatch
- patternMismatch
- toolong
- rangeUnderflow
- rangeOverflow
- stepMismatch
- customError
- 不符合自定义规则
- setCustomValidity
1
2
3
4
5
6
7
8
9
10var input = document.querySelector('input[type=text]')
var submit = document.querySelector('input[type=submit]')
submit.onclick = function () {
var val = input.value
if (val === 'deng') {
input.setCustomValidity('请不要输入敏感词') // 自定义规则,验证失败
} else {
input.setCustomValidity('') // 验证通过
}
}
- 通过下面的 valid 可以查看验证是否通过, 如果八种验证都通过, 则返回
node.addEventListener(‘invalid’, fn1, false)
- 验证不通过时触发 ‘invalid’
1
2
3
4
5var input = document.querySelector('input[type=text]')
input.addEventListener('invalid', function () { // 点击 submit 按钮时, 如果验证不通过, 就触发
console.log('验证失败')
console.log(this.validity) // { valueMissing: true, typeMismatch: false, ... }
})
- 验证不通过时触发 ‘invalid’
关闭验证
- formnovalidate 属性
attribute 和 property
- html 标签的预定义和自定义属性我们统称为 attribute
- js 原生对象的直接属性, 我们统称为 property
- 布尔值属性 —— property 数值为布尔类型的
- 一句话, 操作布尔值属性用 prop() 方法
新增实用小功能
classList 操作类
- classList
- div.classList.add(‘hello’)
- 添加类(在原有基础上)
- div.classList.remove(‘hello’)
- 删除类(在原有基础上)
- div.classList.toggle(‘hello’)
- 切换类 (有就移除, 没有就加上)
dataset 操作自定义属性
- dataset
- div.dataset.index
- 获取 / 设置自定义的属性 data-index 的值
- ⚠️ 如果自定义属性带 - , 获取时应使用
驼峰命名
元素内容可编辑属性
- contenteditable
- contenteditable[=”true”]
1
2
3
4<!-- 可以在 div 中输入内容 -->
<div contenteditable>
</div>
- contenteditable[=”true”]
修改 input 标签的 placeholder 的属性
1 | input::-webkit-input-placeholder { |
音视频标签
容器
- 不管是音频文件或视频文件, 实际上都只是一个容器文件, 这点类似于压缩了一组文件的 zip 文件
- 视频文件 (视频容器) 包含了音频轨道、视频轨道和其他一些元数据
- 视频播放的时候, 音频轨道和视频轨道是绑在一起的
- 元数据包含了视频的封面、标题、子标题、字幕等相关信息
主流的音视频文件格式
- 主流视频文件格式 (容器格式)
- MPEG-4 —— 以 .mp4 为扩展名
- Flash —— 以 .flv 为扩展名
- Ogg —— 以 .ogv 为扩展名
- WebM —— 以 .webm 为扩展名
- 音视频交错 —— 以 .avi 为扩展名
- 主流音频文件格式 (容器格式)
- MPEG-3 —— 以 .mp3 为扩展名
- Aac —— 以 .aac 为扩展名
- Ogg —— 以 .ogg 为扩展名
音视频编解码器
- 视频编解码器
- H.264
- VP8
- Ogg Theora
- 音频编解码器
- AAC
- MPEG-3
- Ogg-Vorbis
浏览器支持情况
Browser | MP4 | WebM | Ogg |
---|---|---|---|
IE 9 | YES | NO | NO |
FireFox 4 | NO | YES | YES |
Chrome | YES | YES | YES |
Safari 5 | YES | NO | NO |
Opera 10 | NO | YES | YES |
格式转换 ffmpeg
window10 下环境变量的入口
控制面板–>选择大图标–>系统–>高级系统设置–>高级–>环境变量
制作MP4 视频
1
ffmpeg -i test.mp4 -c:v libx264 -s 1280x720 -b:v 1500k -profile:v high -level 3.1 -c:a aac -ac 2 -b:a 160k -movflags faststart OUTPUT.mp4
制作 WebM 视频
1
ffmpeg -i test.mp4 -c:v libvpx -s 1280x720 -b:v 1500k -c:a libvorbis -ac 2 -b:a 160k OUTPUT.webm
制作 Ogg 视频
1
ffmpeg -i test.mp4 -c:v libtheora -s 1280x720 -b:v 1500k -c:a libvorbis -ac 2 -b:a 160k OUTPUT.ogv
制作Mp3音频
1
ffmpeg -i test.mp3 -c:a libmp3lame -ac 2 -b:a 160k OUTPUT.mp3
制作Ogg音频
1
ffmpeg -i test.mp3 -c:a libvorbis -ac 2 -b:a 160k OUTPUT.ogg
制作ACC音频
1
ffmpeg -i test.mp3 -c:a aac -ac 2 -b:a 160k OUTPUT.aac
兼容模式
1 | <video width="800" height="600"> |
1 | <audio controls> |
音视频标签的 attribute 属性
- video 标签的属性
- width
- height
- poster
- 一个海报帧的 URL, 用于在用户播放或跳帧之前展示的图片
- src
- 要嵌到页面的视频的 URL
- controls
- 显示或隐藏用户控制界面
- autoplay
- 媒体是否自动播放
- loop
- 媒体事件循环播放
- muted
- 是否静音
- preload
- 告诉浏览器是否预先加载视频
- none
- 提示浏览器视频不需要缓存
- metadata (默认值)
- 作者认为不需要查看该视频, 但是元数据 (视频基本属性) 会抓取
- auto
- 用户需要这个视频优先加载
- 空串
- 代指 auto
- audio 标签的属性
- src
- controls
- autoplay
- loop
- muted
- perload
音视频 js 相关属性
currentTime —— 开始播放到现在所用时间 (可读写)
duration —— 媒体总时间 (只读,单位: s)
1
2console.log(video.duration)
console.log(audio.duration)muted —— 是否静音 (可读写,
比 volume 优先级要高
)- muted 和 volume 之间不会同步
- 设置静音时, 需要手动设置 volome = 0
1
2video.muted = true
video.volume = 0
volume —— 0.0 - 1.0 的音量相对值 (可读写)
paused —— 是否暂停 (只读)
ended —— 是否播放完毕 (只读)
error —— 发生错误的时候, 返回错误代码 (只读)
currentSrc —— 以字符串的形式返回媒体地址 (只读)
视频对象多的部分
- poster —— 视频播放前的预览图片 (读写)
- width、height —— 设置视频的尺寸 (读写)
- videoWidth、videoHeight —— 视频的实际尺寸 (只读)
音视频相关js事件
视频常用事件
事件名 说明 abort 在播放被终止时触发,例如, 当播放中的视频重新开始播放时会触发这个事件 canplay 在媒体数据已经有足够的数据(至少播放数帧)可供播放时触发 ended 播放结束时触发 loadeddata 媒体的第一帧已经加载完毕 loadedmetadata 媒体的元数据已经加载完毕,现在所有的属性包含了它们应有的有效信息 pause 播放暂停时触发 play 在媒体回放被暂停后再次开始时触发。即,在一次暂停事件后恢复媒体回放 playing 在媒体开始播放时触发(不论是初次播放、在暂停后恢复、或是在结束后重新开始) timeupdate 元素的 currentTime 属性表示的时间已经改变 volumechange 在音频音量改变时触发(既可以是volume属性改变,也可以是muted属性改变)
音视频 js 相关函数
play () —— 媒体播放
pause() —— 媒体暂停
load() —— 重新加载媒体
- 通过 source 重置 src 属性, 必须 load() 重新加载后才能播放
1
2
3
4
5var video = document.querySelector('video')
var source = document.querySelectorAll('source')
source[0].src = '123.mp4'
video.load()
- 通过 source 重置 src 属性, 必须 load() 重新加载后才能播放
解决 Uncaught (in promise) DOMException 问题
1
2
3
4
5
6
7var playPromise = video.play()
if (playPromise !== undefined) {
playPromise.then(() => {
video.play()
}).catch(() => {
})
}
canvas 和 video 结合
1 | <video src="https://blz-videos.nosdn.127.net/1/OverWatch/AnimatedShots/Overwatch_AnimatedShot_Soldier76_Hero.mp4" |
新增 API
网络状态
以前我们可以通过 window.navigator.onLine
来检测用户当前的网络状况,返回一个布尔值,现在已不用
HTML5 给我们提供了 2 个事件
- online
- 用户连接网络时调用
- offline
- 用户网络断开时调用
⚠️ 他们监听的都是 window 对象
1 | window.addEventListener('online', function () { |
全屏
HTML5 允许用户自定义网页上任一元素全屏显示
DOM 元素的 API
- Node.webkitRequestFullScreen()
- 开启全屏显示
- ⚠️ 不同浏览器需要添加前缀
- webkitRequestFullScreen() mozRequestFullScreen()
document 的属性和API
- document.webkitCancelFullScreen()
- 关闭全屏显示
- 取消全屏要通过 document 调用,不是通过 node 调用
- 要加浏览器前缀
- document.webkitIsFullScreen
- 检测当前是否处于全屏状态
全屏伪类选择器
- :full-screen .box {} :-webkit-full-screen .box {} :-moz:-full-screen .box {}
示例
1 | $('.btn').onclick = function () { |
全屏实现
全屏实现不需要我们写, 直接调用 API 就行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38var isFullScreen = false
full.onclick=function() {
if(isFullScreen) {
isFullScreen = false
if (document.exitFullscreen) {
document.exitFullscreen();
}
else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
}
else if (document.webkitCancelFullScreen) {
document.webkitCancelFullScreen();
}
else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
} else {
isFullScreen = true
var docElm = document.documentElement;
//W3C
if (docElm.requestFullscreen) {
docElm.requestFullscreen();
}
//FireFox
else if (docElm.mozRequestFullScreen) {
docElm.mozRequestFullScreen();
}
//Chrome等
else if (docElm.webkitRequestFullScreen) {
docElm.webkitRequestFullScreen();
}
//IE11
else if (docElm.msRequestFullscreen) {
docElm.msRequestFullscreen();
}
}
}
全屏带来的问题
我们将一个元素全屏后,该元素的会覆盖页面上的所有元素,设置层级也不管效果
如何解决?
用一个父元素包裹需要进行全屏的元素和不想被覆盖的其他元素
把全屏操作加给 父元素
根据需求来设置全屏和取消全屏下的元素宽高
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40<style>
.box1 {
width: 300px;
height: 300px;
background-color: pink;
position: relative;
}
.box2 {
height: 100%;
background: #000;
}
button {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 20px;
background-color: yellow;
}
</style>
<div class="box1">
<div class="box2"></div>
<button>全屏/取消全屏</button>
</div>
<script>
var box1 = document.querySelector('.box1')
var btn = document.querySelector('button')
btn.onclick = function () {
if (document.webkitIsFullScreen) {
document.webkitCancelFullScreen()
......
} else {
box1.webkitRequestFullScreen()
......
}
}
</script>
文件读取
通过 FileReader 对象我们可以读取本地存储的文件,使用 File 对象来指定所要读取的文件或数据。其中File对象可以是来自用户在一个元素上选择文件后返回的FileList 对象,也可以来自由拖放操作生成的 DataTransfer
files 对象
我们可以通过为表单元素添加 multiple 属性,通过上传文件后得到的是一个 Files 对象(伪数组形式)
FileReader 对象
HTML5新增内建对象,可以读取本地文件内容
var reader = new FileReader()
可以实例化一个对象实例方法
- readAsText() 读取文件内容(多用于读取文本文件)
- readAsDataURL() 以 DataURL 形式读取文件 (读取图片文件)
事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14var file = document.querySelector('[type=file]')
file.onchange = function () {
console.log(this.files) // 上传文件的集合
var reader = new FileReader()
// reader.readAsText(this.files[0]) // 选取上传的第一个文件
reader.readAsDataURL(this.files[0])
reader.onload = function () { // 当读取完成时
console.log(this.result) // 获取文件内容, 这里得到的并不是路径字符串,而是图片编码后的内容
$('img').attr('src', this.result) // 实现图片预览
}
}
地理定位
在HTML规范中,增加了获取用户地理信息的API,这样使得我们可以基于用户位置开发互联网应用,即基于位置服务 (Location Base Service)
navigator.geolocation.getCurrentPosition(successCallback, errorCallback)
- 获取当前地理信息
navigator. geolocation.watchPosition(successCallback, errorCallback)
- 重复获取当前地理信息
当成功获取地理信息后,会调用 succssCallback,并向其传递一个包含位置信息的对象 position
position.coords.latitude 纬度
position.coords.longitude 经度
position.coords.accuracy 精度
position.coords.altitude 海拔高度
当获取地理信息失败后,会调用errorCallback,并向其传递错误信息对象 error
第三方 API 来获取位置
HTML5 默认采用谷歌地图来获取位置,可能获取不到;
在现实开发中,通过调用第三方API(如百度地图)来实现地理定位信息,这些API都是基于用户当前位置的,并将用位置(经/纬度)当做参数传递,就可以实现相应的功能
使用步骤
- 拷贝对应的 demo 代码到本地
- 申请密钥
- 密钥填入
<script type="text/javascript" src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=您的密钥"></script>
- 坐标拾取器 获取要展示的中心点坐标
- 将获取到的坐标替换掉代码中的默认坐标
百度地图名片
- 地图名片
- 要先登录
拖拽
在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放
- Drag —— 拖拽
- Drop —— 释放
- 拖拽指的是鼠标点击源对象后一直移动对象不松手,一但松手即释放了
- ⚠️ 首先,要设置元素为可拖拽
- 就是标签元素要设置
draggable=true
,否则不会有效果- 一定是 draggable=”true”, 只添加 draggable 是没有效果的
- 链接和图片默认是可拖动的,不需要 draggable 属性
- 就是标签元素要设置
拖拽事件
被拖动的源对象可以触发的事件:
(1) ondragstart:源对象开始被拖动
(2) ondrag:源对象被拖动过程中(鼠标可能在移动也可能未移动)
(3) ondragend:源对象被拖动结束
目标对象可以触发的事件:
⚠️ 参考的是鼠标点的位置
(1) ondragenter:源对象进入目标对象时
(2) ondragover:源对象悬停在目标对象上方时
(3) ondragleave:源对象离开目标对象时
(4) ondrop:源对象在目标对象上松手时 (默认是被浏览器阻止的,要执行 ondrop 需要在 ondragover 中阻止默认行为)
拖拽API总共就是7个函数!!
DataTransfer
在进行拖放操作时,DataTransfer
对象用来保存被拖动的数据。它可以保存一项或多项数据、一种或者多种数据类型
- 常用 API
- setData(type, data)
- type —— 要存储的数据类型,可取值为 text/plain 和 text/uri-list
- data —— 要存储的数据
- getData(type)
- 获取存储的数据
- setData(type, data)
实现如下拖拽效果
1 |
|
Web存储
在本地存储大量的数据,HTML5规范提出了相关解决方案
特性
- 设置、读取方便、页面刷新不丢失数据
- 容量较大,sessionStorage 约 5M、localStorage 约 20M
- 只能存储字符串,可以将对象 JSON.stringify() 编码后存储
- 可以通过 检查 ==> 控制台 == > Application 查看
window.sessionStorage对象
- 生命周期为关闭浏览器窗口
- 在同一个窗口(页面)下数据可以共享
window.localStorage对象
- 永久生效,除非手动删除 关闭页面也会存在
- 可以多窗口(页面)共享(同一浏览器可以共享)
方法详解
⚠️ sessionStorage 和 localStorage 用法完全一样
setItem(key, value)
- 设置存储内容
getItem(key)
- 读取存储内容
removeItem(key)
- 删除键值为key的存储内容
clear()
- 清空所有存储内容
其他
WebSQL、IndexDB
应用缓存
HTML5 中我们可以轻松的构建一个离线(无网络状态)应用,只需要创建一个 cache manifest 文件
优势
- 可配置需要缓存的资源
- 网络无连接应用仍可用
- 本地读取缓存资源,提升访问速度,增强用户体验
- 减少请求,缓解服务器负担
缓存清单
一个普通文本文件,其中列出了 浏览器应缓存以供离线访问的资源,推荐使用.appcache为后缀名
- 例如我们创建了一个名为 demo.appcache 的文件,然后在需要应用缓存的页面的根元素(html)添加属性manifest=”demo.appcache”,路径要保证正确
manifest文件格式
顶行写 CACHE MANIFEST
CACHE: 换行 指定我们需要缓存的静态资源,如 css、image、js 等
NETWORK: 换行 指定需要在线访问的资源,可使用通配符
FALLBACK: 换行 当被缓存的文件找不到时的备用资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28CACHE MANIFEST
上面必须是第一行
CACHE:
此部分写需要缓存的资源 (#是注释的意思)
./images/img1.jpg
./images/img2.jpg
./images/img3.jpg
./images/img4.jpg
NETWORK:
此部分要写需要有网络才可访问的资源,无网络刚不访问
./images/img1.jpg
./images/img2.jpg
* 表示所有
FALLBACK:
当访问不到某个资源的情况下,自动由另一个资源替换
./images/img4.jpg ./images/img5.jpg
其它
- CACHE: 可以省略,这种情况下将需要缓存的资源写在CACHE MANIFEST
- 可以指定多个 CACHE: NETWORK: FALLBACK:,无顺序限制
#
表示注释,只有当 demo.appcache 文件内容发生改变时或者手动清除缓存后,才会重新缓存- chrome 可以通过 chrome://appcache-internals/ 工具和离线(offline)模式来调试管理应用缓存
多媒体
方法:load()、play()、pause()
属性:currentSrc、currentTime、duration
事件:oncanplay, ontimeupdate,onended 等
⚠️ 以上属性和 API 只能通过原生 JS 来操作
http://www.w3school.com.cn/tags/html_ref_audio_video_dom.asp