HTML学习笔记(3):HTML5
HTML5的发展
什么是 HTML5
HTML5并不仅仅只是做为HTML标记语言的一个最新版本,更重要的是它制定了Web应用开发的一系列标准,成为第一个将Web做为应用开发平台的HTML语言。
HTML5定义了一系列新元素,如新语义标签、智能表单、多媒体标签等,可以帮助开发者创建富互联网应用,还提供了一些Javascript API,如地理定位、重力感应、硬件访问等,可以在浏览器内实现类原生应用。我们甚至可以结合Canvas开发网页版游戏。
HTML5的广义概念:HTML5代表浏览器端技术的一个发展阶段。在这个阶段,浏览器的呈现技术得到了飞跃发展和广泛支持,它包括:HTML5、CSS3、Javascript API在内的一套技术组合。因此HTML5不等于 HTML next version。
HTML5是新一代开发Web富客户端应用程序整体解决方案。富客户端即具有很强的交互性和体验的客户端程序。比如说,浏览博客,是比较简单的客户端;一个在线听歌的网站、即时聊天网站就是富客户端。
单纯地从技术的角度讲,兼容性问题只会让开发者徒增烦恼。如果网页端的程序能做到PC客户端的体验,就会对后者构成威胁。
应用场景
HTML5 的几个应用场景:
- 极具表现力的网页。
- 网页应用程序:
- 代替PC端的软件:iCloud、百度脑图、Office 365等。
- APP端的网页:淘宝、京东、美团等。
- 微信端:公众号、小程序等。
- 混合式本地应用。
- 简单的游戏。
新增内容
HTML5新增的主要内容有:
- 标签
- 更语义化的标签
- 应用程序标签
- 属性
- 链接关系描述
- 结构数据标记
- ARIA
- 自定义属性
- 智能表单
- 新的表单类型
- 虚拟键盘适配
- 网页多媒体
- 音频
- 视频
- 字幕
- Canvas
- 2D
- 3D (WebGL)
- SVG
HTML5新内容
新增语义标签
HTML5中增加的新标签有:
- <section>:表示区块。
- <article>:表示文章。如文章、评论、帖子、博客。
- <header>:表示页眉。
- <footer>:表示页脚。
- <nav>:表示导航。
- <aside>:表示侧边栏。如文章的侧栏。
- <figure>:表示媒介内容分组。
- <mark>:表示标记(不常用)。
- <progress>:表示进度(不常用)。
- <time>:表示日期。
本质上新语义标签与<div>、<span>没有区别,只是其具有表意性,使用时除了在HTML结构上需要注意外,其它和普通标签的使用无任何差别,可以理解成<div class=”nav”> 相当于<nav>。
并且注意HTML5中单标签不需要写关闭符号了。
兼容性问题
新标签在不支持HTML5的浏览器中可能出现兼容性问题,解决方式是通过条件语句判断IE版本,然后引入html5shiv.js文件:
1 |
|
在测试IE浏览器的兼容的时候,使用软件ietest,可以模拟IE6-IE11。
表单
input的新类型
传统的Web表单已经越来越不能满足开发的需求,HTML5 在 Web 表单方向做了很大的改进,如拾色器、日期/时间组件等,使表单处理更加高效:
- email:只能输入email格式。自动带有验证功能。
- tel:手机号码。
- url:只能输入url格式。
- number:只能输入数字。
- search:搜索框。
- range:滑动条。
- color:拾色器。
- time:时间。
- date:日期。
- datetime:时间日期。
- month:月份。
- week:星期。
上面的部分类型是针对移动设备生效的,且具有一定的兼容性,在实际应用当中可选择性的使用。
数据列表
即新的表单元素<datalist>数据列表:
1 |
|
代码效果:
将输入框input的list属性与数据列表的id绑定,可以给输入框加入下拉菜单提供一些提示值。
keygen元素
keygen 元素的作用是提供一种验证用户的可靠方法。
keygen 元素是密钥对生成器(key-pair generator)。当提交表单时,会生成两个键:一个公钥,一个私钥。
私钥(private key)存储于客户端,公钥(public key)则被发送到服务器。公钥可用于之后验证用户的客户端证书(client certificate)。
度量器
即新的表单元素<meter>元素,其实就是一个进度条一样的东西,比如可以用它来表示表单的填写进度:
1 |
|
代码效果:
value是当前值,min是最小值也就是左端点,max是最大值也就是右端点,low表示低于这个值将会警告,high则是高于这个值将会警告。
度量器标签可以作为单标签,可以作为成对的标签中间加入文本,但这个文本似乎不显示。
新的表单元素属性
HTML5增加了一些表单属性:
- placeholder:占位符(提示文字,比如提示这个框该怎么填写)。
- autofocus:自动获取焦点。不需要值的属性。
- multiple:文件上传多选或多个邮箱地址。不需要值的属性。
- autocomplete:自动完成。on 开启(默认),off 取消。用于表单元素,也可用于表单自身。自动完成允许浏览器预测对字段的输入。当用户在字段开始键入时,浏览器基于之前键入过的值,应该显示出在字段中填写的选项。
- form:指定表单项属于哪个form,处理复杂表单时会需要。
- novalidate:关闭默认的验证功能(只能加给form)。
- required:表示必填项。
- pattern:自定义正则,验证表单。
- oninput:事件,用户输入内容时触发,可用于输入字数统计。
- oninvalid:事件,验证不通过时触发。比如,如果验证不通过时,想弹出一段提示文字,就可以用到它。
多媒体
在HTML5之前,在网页上播放音频/视频的通用方法是利用Flash来播放。但是大多情况下,并非所有用户的浏览器都安装了Flash插件,由此使得音频、视频播放的处理变得非常复杂;并且移动设备的浏览器并不支持Flash插件。
H5里面提供了视频和音频的标签。
音频
HTML5通过<audio>标签来解决音频播放的问题:
1 |
|
这是一首我喜欢的歌:
其属性主要有:
- autoplay:自动播放。写成autoplay 或者 autoplay = “”,都可以。
- controls:控制条。(建议把这个选项写上,不然都看不到控件在哪里)
- loop:循环播放。
- preload:预加载。同时设置 autoplay 时,此属性将失效。
当然要注意浏览器的兼容性问题,不同浏览器因为版权问题,兼容的音频文件格式不一样,此时可以采用如下写法:
1 |
|
视频
HTML5通过<video>标签来解决视频播放的问题:
1 |
|
其主要属性有:
- autoplay:自动播放。写成autoplay或者autoplay = “”,都可以。
- controls:控制条。
- loop:循环播放。
- preload:预加载 同时设置 autoplay 时,此属性将失效。
- width:设置播放窗口宽度。
- height:设置播放窗口的高度。
同样由于播放格式的兼容性问题,推荐兼容性写法:
1 |
|
新增功能
拖拽
在HTML5的规范中,我们可以通过为元素增加 draggable=”true” 来设置此元素是否可以进行拖拽操作,其中图片、链接默认是开启拖拽的。
在给元素增加了draggable=”true” 属性之后,发现其是可以拖拽的,但是拖拽之后要做什么事情呢?这就涉及到事件监听:
- ondragstart:当拖拽开始时调用。
- ondragleave:当鼠标离开拖拽元素时调用。
- ondragend:当拖拽结束时调用。
- ondrag:整个拖拽过程都会调用。
为元素设置以上的事件监听即可实现拖拽元素时要做的事。
如果你想把元素A拖拽到元素B里,那么元素B就是目标元素,我们可以对目标元素设置这样的事件监听:
- ondragenter:当拖拽元素进入时调用。
- ondragover:当拖拽元素停留在目标元素上时,就会连续一直触发,不管拖拽元素此时是移动还是不动的状态。
- ondrop:当在目标元素上松开鼠标时调用。
- ondragleave:当鼠标离开目标元素时调用。
要格外注意在编写ondragover事件监听时,一定要阻止拖拽事件的默认行为,否则,后面的方法ondrop事件将无法触发:
1 |
|
历史记录
界面上的所有JS操作不会被浏览器记住,就无法回到之前的状态。在HTML5中可以通过 window.history 操作访问历史状态,让一个页面可以有多个历史状态。window.history对象可以让我们管理历史记录,可用于单页面应用,以实现无刷新改变网页内容:
1 |
|
获取地理位置
JS获取地理位置的方式:
- navigator.getCurrentPosition(successCallback, errorCallback, options):获取当前地理信息。
- navigator.watchPosition(successCallback, errorCallback, options):重复获取当前地理信息。
当成功获取地理信息后,会调用succssCallback,并返回一个包含位置信息的对象position:
- position.coords.latitude:纬度。
- position.coords.longitude:经度。
coords即坐标。可选参数 options 对象可以调整位置信息数据收集方式。
当获取地理信息失败后,会调用errorCallback,并返回错误信息error。
全屏
HTML5规范允许用户自定义网页上任一元素全屏显示。
开启/关闭全屏显示:
1 |
|
为考虑兼容性问题,不同的浏览器可能需要在此基础之上,添加私有前缀,如webkitRequestFullScreen、 webkitCancleFullScreen、mozRequestFullScreen、mozCancleFullScreen等。(注意有无前缀时screen中的s的大小写不一样)
检测当前是否处于全屏状态:document.fullScreen。同样可能需要私有前缀。
全屏的伪类:
- :full-screen {}
- :-webkit-full-screen {}
- :moz-full-screen {}
用于CSS中,当元素处于全屏状态时,改变它的样式。
Web存储
传统方式我们以document.cookie来进行存储的,但是由于其存储大小只有4k左右,并且解析也相当的复杂,给开发带来诸多不便,HTML5规范则提出了两种解决方案:
window.sessionStorage会话存储:
- 保存在内存中。
- 生命周期为关闭浏览器窗口。也就是说,当窗口关闭时数据销毁。
- 在同一个窗口下数据可以共享。
window.localStorage本地存储:
- 有可能保存在浏览器内存里,有可能在硬盘里。
- 永久生效,除非手动删除(比如清理垃圾的时候)。
- 可以多窗口共享。
Web 存储的特性:
- 设置、读取方便。
- 容量较大,sessionStorage 约5M、localStorage 约20M。
- 只能存储字符串,可以将对象 JSON.stringify() 编码后存储。
使用方法:
1 |
|
使用时需要指明调用的是哪一种存储的方法,如:
1 |
|
网络状态
我们可以检测用户当前的网络状况,通过事件监听来实现,事件返回一个布尔值:
- window.online:用户网络连接时被调用。
- window.offline:用户网络断开时被调用(拔掉网线或者禁用以太网)。
使用方法:
1 |
|
应用缓存
HTML5中我们可以轻松的构建一个离线(无网络状态)应用,只需要创建一个cache manifest缓存清单文件。
缓存清单文件的格式
缓存清单文件中列出了浏览器应缓存,以供离线访问的资源。推荐使用.appcache作为后缀名,另外还要添加MIME类型。
缓存清单文件里的内容格式:
- 顶行写CACHE MANIFEST。
- CACHE: 换行,指定我们需要缓存的静态资源,如.css、image、js等。
- NETWORK: 换行,指定需要在线访问的资源,可使用通配符(也就是不需要缓存的、必须在网络下面才能访问的资源)。
- FALLBACK: 换行,当被缓存的文件找不到时的备用资源(当访问不到某个资源时,自动由另外一个资源替换)。
如以下例子:
1 |
|
缓存清单文件的使用
假如我们创建一个缓存清单文件叫做demo.appcache,在需要应用缓存的页面根元素(即html标签)里,添加属性manifest=”demo.appcache”。路径要保证正确。如:
1 |
|
优势
使用缓存的优势:
- 可配置需要缓存的资源;
- 网络无连接应用仍可用;
- 本地读取缓存资源,提升访问速度,增强用户体验;
- 减少请求,缓解服务器负担。
其他小tips
元素的嵌套关系
HTML5的嵌套关系:
- 块级元素可以包含行内元素。
- 块级元素不一定能包含块级元素。比如 div 中可以包含 div,但 p 标签中不能包含 div。
- 行内元素一般不能包含块级元素。比如 span 中不能包含 div。但有个特例:在 HTML5 中, a 标签中可以包含 div。
注意:在 HTML5 中 a > div 是合法的, div > a > div是不合法的 ;但是在 html 4.0.1 中, a > div 是不合法的。
CSS Reset
比如下拉框这种比较复杂的元素,是自带默认样式的。如果没有这个默认样式,则该元素在页面上不会有任何表现,则必然增加一些工作量。
同时,默认样式也会带来一些问题:比如,有些默认样式我们是不需要的;有些默认样式甚至无法去掉。
如果我们不需要默认的样式,这里就需要使用CSS Reset。
常见的 CSS Reset 方案:
- 方案一:CSS Tools: Reset CSS
- 方案二:雅虎的 CSS Reset
可以直接通过CDN引入:
1 |
|
当然还有一种会影响性能、不建议使用但是简单粗暴的方式:
1 |
|
几种CSS reset的解决思路都是将所有的默认样式清零。