我们来一起看看新的HTML5有什么新的特性和使用技巧吧。如果你对HTML5还不是很了解,那么下面这些内容可以帮你快速进阶。
1、新的doctype
还在用下面这个长的根本没法记住的doctype吗?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
如果是,那么赶紧使用新的吧。
<!DOCTYPE html>
事实上,HTML5根本不需要这个东西,这是用来给浏览器兼容用的,如果浏览器不认识一个doctype,那么他会使用标准模式来解析。所以,没什么好担心的,尽管用吧。
2、Figure元素
看看下面的这个图片的说明部分吧:
<img src="path/to/image" alt="About image" />
<p>Image of Mars. </p>
想把图片和相应的说明文字写在一起还真不是个容易的事情,在HTML5里面这就好办了:
<figure>
<img src="path/to/image" alt="About image" />
<figcaption>
<p>This is an image of something interesting. </p>
</figcaption>
</figure>
3、重定义了<small>
以前我还用这个标签来显示Logo下面的小字,这是个不错的表示标签,但是现在,这就是不推荐的做法了。这个标签被重定义了,用来表示用于打印的小字体了。
4、script和link标签都不再有type属性了
<link rel="stylesheet" href="path/to/stylesheet.css" type="text/css" />
<script type="text/javascript" src="path/to/script.js"></script>
以前的这种写法都不是必须的了,可以省去type属性。
5、要不要引号都无所谓了
<p class=myClass id=someId> Start the reactor.
HTML5不是XHTML,没有那么严格的要求,加不加引号看你自己了。
6、让你的内容成为可编辑的
新的浏览器的contenteditable属性非常不错,可以让你的元素成为可编辑的,这些可以用在一些todo list之类的应用上,然后调用本地存储。使用这个属性的元素和他的子元素都会获得这个特性。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>untitled</title>
</head>
<body>
<h2> To-Do List </h2>
<ul contenteditable="true">
<li> Break mechanical cab driver. </li>
<li> Drive to abandoned factory
<li> Watch video of self </li>
</ul>
</body>
</html>
7、Email输入框
我们可以给表单的输入框赋予email属性,这样浏览器就能以email的合法格式来检测输入框的内容了。我们现在还不能100%的依附这个,因为一些旧的浏览器不支持email属性,他只会把这当成是普通输入框。要校验格式还得靠自己。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>untitled</title>
</head>
<body>
<form action="" method="get">
<label for="email">Email:</label>
<input id="email" name="email" type="email" />
<button type="submit"> Submit Form </button>
</form>
</body>
</html>
8、输入框的默认提示文字
以前,我们要给输入框写上提示文字,就得用js来控制,而HTML5现在支持这个特性了,只要这样写就可以了:
<input name="email" type="email" placeholder="XXX@XXX.com" />
当然,现在还不是所有的浏览器都支持这个属性,比如Firefox和Opera就不行,但是这也不影响什么。
9、本地存储
使用本地存储,我们就可以让浏览器记住我们的输入,就算是刷新或者关掉浏览器再打开也无妨。
当然,并不是所有浏览器都支持这个特性,支持的有IE8,Safari,Firefox3.5+,对于那些老版的浏览器,应该使用window.localStorage检验一下是否支持。
10、语义化的header和footer
以前我们这样写:
<div id="header">
...
</div>
<div id="footer">
...
</div>
使用了HTML5之后,就可以这样写了:
<header>
...
</header>
<footer>
...
</footer>
11、更多HTML5的表单特性
12、IE与HTML5
不幸的是,IE需要一些额外的配置来支持HTML5的元素。
在IE中,所有的元素都有一个默认的display:inline;
为了正确渲染HTML5中的块级元素,我们需要这样写:
header, footer, article, section, nav, menu, hgroup {
display: block;
}
但是IE会忽略这些样式,因为他根本就不知道header是什么,还好,还有解决办法:
document.createElement("article");
document.createElement("footer");
document.createElement("header");
document.createElement("hgroup");
document.createElement("nav");
document.createElement("menu");
很奇怪,这些代码在IE中就能起作用。
13、hgroup
想象这样的场景,在我博客的头部,我需要一个大标题,然后紧接着一个副标题,在HTML4中我虽然可以使用H1,H2来分表表示,但是还是不够语义化,HTML5中可以这样:
<header>
<hgroup>
<h1> Recall Fan Page </h1>
<h2> Only for people who want the memory of a lifetime. </h2>
</hgroup>
</header>
14、required属性
Form添加了required属性,用来标记那些必填项。有两种写法。
<input type="text" name="someInput" required>
或者
<input type="text" name="someInput" required="required">
15、autofocus属性
如果我们需要输入框被选中,那么我们可以使用autofocus属性:
<input type="text" name="someInput" placeholder="Douglas Quaid" required autofocus>
16、支持音频
HTML5中我们不再需要而外的插件来播放音频了。 HTML5现在支持了audio标签,我们也不必在乎那些插件了。不过现在只有少部分的浏览器支持这个特性,还是需要做一些向下兼容的处理的:
<audio autoplay="autoplay" controls="controls">
<source src="file.ogg" />
<source src="file.mp3" />
<a href="file.mp3">Download this file.</a>
</audio>
Mozilla和Webkit还是有些合不来的,所以需要至少写两种格式的,safari的话他先读取到了ogg格式,那么他就会使用ogg格式,IE现在支持wav格式的。
17、支持视频
与对音频的支持类似,HTML5也支持视频:
<video controls preload>
<source src="cohagenPhoneCall.ogv" type="video/ogg; codecs='vorbis, theora'" />
<source src="cohagenPhoneCall.mp4" type="video/mp4; 'codecs='avc1.42E01E, mp4a.40.2'" />
<p> Your browser is old. <a href="cohagenPhoneCall.mp4">Download this video instead.</a> </p>
</video>
1 我们并不强迫写type属性,浏览器会自己解析。
2 不是所有浏览器都能支持HTML5视频,所以还需要一个下载链接或者Flash视频。
3 controls和preload属性我们后面介绍
18、预加载视频
preload属性正如你所想。但是,你的相好是不是要先加载视频,如果你的页面主要就是为了显示这个视频,那么绝对要先加载,增强用户体验。他的用法也很简单,你前面也看到了。
19、显示控制条
如果不加controls属性,那么这个视频就只是画面部分,没有控制条,加上之后就会出现。
20、正则表达式
你有没有计算过你多久就要针对一个input写一些特别的验证,使用新的正则属性,我们就可以很方便的添加正则验证。
<form action="" method="post">
<label for="username">Create a Username: </label>
<input type="text"
name="username"
id="username"
placeholder="4 <> 10"
pattern="[A-Za-z]{4,10}"
autofocus
required>
<button type="submit">Go </button>
</form>
如果你熟悉正则表达式,那么应该很容易就可以看到上面的正则是为了校验4-10个大写或小写字母。
21、支持属性的能力检测
如果我们不知道浏览器是不是支持这些特性,那这些特性有什么好处呢?这个问题问得好,有很多种办法,我们这里讨论两种。第一,我们可以使用优秀的Modernizr库。或者,我们可以创建一些元素然后来检测,比如:
alert( 'pattern' in document.createElement('input') ) // boolean;
jQuery也使用了类似的方法:
<script>
if (!'pattern' in document.createElement('input') ) {
// do client/server side validation
}
</script>
22、Mark元素
可以将他想象为一个高亮器,与用户的行为相关。例如,我搜索了open your mind,然后我就可以用js将包含这个字符串的元素用mark包起来。
<h3> Search Results </h3>
<p> They were interrupted, just after Quato said, <mark>"Open your Mind"</mark>. </p>
23、什么时候使用<div>
我们现在有了footer,header,section,那么什么时候使用div呢,应该在没有更好的元素可以用的情况下使用。
比如,你发现你需要将一段代码放在一起,然后固定在页面的某个位置,那么这个时候div就很管用。如果你打算将你的新博文包起来或者给footer加一些链接,那么这个时候<article>和<nav>更加语义化一些。
24、现在有什么马上能用的么
说起HTML5这些特性,有些人可能觉得这得2022年才能普及吧,那现在搞有啥意义呢?其实这是不对的,有些东西我们现在就能用,保持代码的赶紧整洁,还是很必要的。
25、什么不是HTML5
理解倒是什么是HTML5对于开发人员还是比较重要的,要么很多时候会尴尬的。
1 SVG:不是HTML5,它至少5岁了。
2 CSS3:它不是HTML5,它是css。
3 地理位置(Geolocation):不是HTML5.
4 本地存储:不是HTML5,曾经是一个特性,但是被移除了。
5 Sockets:不是HTML5,有它自己的规范。
虽然这些也都是很新鲜的技术,但是他们真的不是HTML5。事实上,这些规范也是相同的一些人在制定。
26、其他属性
现在我们也有了可以定制私有属性的规范了:
<div id="myDiv" data-custom-attr="My Value"> Bla Bla </div>
获取属性值:
var theDiv = document.getElementById('myDiv');
var attr = theDiv.getAttribute('data-custom-attr');
alert(attr); // My Val
在css中也可以使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Sort of Lame CSS Text Changing</title>
<style>
h1 { position: relative; }
h1:hover { color: transparent; }
h1:hover:after {
content: attr(data-hover-response);
color: black;
position: absolute;
left: 0;
}
</style>
</head>
<body>
<h1 data-hover-response="I Said Don't Touch Me!"> Don't Touch Me </h1>
</body>
</html>
这里可以查看示例。
27、output元素
正如你所想的,output元素就是用来展示一些计算值的。比如你计算当前鼠标的位置,或者一些数字的和,下面我们就来看看计算两个数字和的例子:
<form action="" method="get">
<p>
10 + 5 = <output name="sum"></output>
</p>
<button type="submit"> Calculate </button>
</form>
<script>
(function() {
var f = document.forms[0];
if ( typeof f['sum'] !== 'undefined' ) {
f.addEventListener('submit', function(e) {
f['sum'].value = 15;
e.preventDefault();
}, false);
}
else { alert('Your browser is not ready yet.'); }
})();
</script>
对这个元素的支持还是有点挫的,上面这段代码下,如果浏览器不支持output属性,那么就会弹出一个对话框告知计算结果。
28、使用Range input创建一个幻灯片
现在只有Opera完全支持range input的max,min,step和value属性,为了快速说明,我们来看一个例子。
HTML部分:
<form method="post">
<h1> Total Recall Awesomness Gauge </h1>
<input type="range" name="range" min="0" max="10" step="1" value="">
<output name="result"> </output>
</form>
CSS部分:
body {
font-family: 'Myriad-Pro', 'myriad', helvetica, arial, sans-serif;
text-align: center;
}
input { font-size: 14px; font-weight: bold; }
input[type=range]:before { content: attr(min); padding-right: 5px; }
input[type=range]:after { content: attr(max); padding-left: 5px;}
output {
display: block;
font-size: 5.5em;
font-weight: bold;
}JS部分:
(function() {
var f = document.forms[0],
range = f['range'],
result = f['result'],
cachedRangeValue = localStorage.rangeValue ? localStorage.rangeValue : 5;
// Determine if browser is one of the cool kids that
// recognizes the range input.
var o = document.createElement('input');
o.type = 'range';
if ( o.type === 'text' ) alert('Sorry. Your browser is not cool enough yet. Try the latest Opera.');
// Set initial values of the input and ouput elements to
// either what's stored locally, or the number 5.
range.value = cachedRangeValue;
result.value = cachedRangeValue;
// When the user makes a selection, update local storage.
range.addEventListener("mouseup", function() {
alert("The selected value was " + range.value + ". I am using local storage to remember the value. Refresh and check on a modern browser.");
localStorage ? (localStorage.rangeValue = range.value) : alert("Save data to database or something instead.");
}, false);
// Display chosen value when sliding.
range.addEventListener("change", function() {
result.value = range.value;
}, false);
})();