详解HTML5中的标签


Posted in HTML / CSS onJune 19, 2015

一、HTML5 template元素初面

<template>元素,基本上可以确定是2013年才出现的。干嘛用的呢,顾名思意,就是用来声明是“模板元素”。

目前,我们在HTML中嵌入模板HTML,往往是类似这样的写法:

XML/HTML Code复制内容到剪贴板
  1. <script type="text/template">  
  2. // ...   
  3. </script>  

实际上,并不存在type="text/template"这样的标准写法,<template>元素的出现旨在让HTML模板HTML变得更加标准与规范。

以前,我们可能还使用过<textarea>或者<xmp>(废止但依然可用)嵌套非转义的HTML标签代码,实现一些特定的前端功能,但,同样的,跟上面的流行用法一样,都是不规范的。从未来趋势来讲,显然<template>标签才是王道。但是,兼容性是个不可忽略的问题,因此,就算扯得很多很少,实际价值有有限,因此,这里仅仅简单介绍下。
二、HTML5 template元素复面

看下下面四种嵌套图片HTML,同时图片内容不显示,不会有请求的写法:

XML/HTML Code复制内容到剪贴板
  1. <script type="text/template">  
  2. <img src="mm1.jpg">  
  3. </script>  
  4.   
  5. <textarea style="display: none;">  
  6. <img src="mm1.jpg">  
  7. </textarea>  
  8.   
  9. <xmp style="display: none;">  
  10. <img src="mm1.jpg">  
  11. </xmp>  
  12.   
  13. <template>  
  14. <img src="mm1.jpg">  
  15. </template>  

1. 标签内容隐藏性

    <script>本身的特定,让内部的HTML标签是按照字符串处理的,因此,天生内容不显示。但是,在DreamWeaver中,这种写法有个很大的问题,就是在script中书写模板HTML时候,标签自动闭合的永远是</script>这个很讨厌的。
    <textarea>为文本域,里面嵌套的HTML片段会被当做文本域的值。但,文本域本身是可见的,因此需要额外的设置display: none;
    <xmp>是个很老很特殊的属性,语义为example,示例。据说后来被<pre>标签取代而废止,实际上,目前,所有的浏览器都是支持的。但是,其跟<pre>标签不能划等号。<pre>里面有个<img>标签,显示的则是一张图片,而<xmp>呈现的就是一段HTML代码。不过,与<textarea>一样,内容不显示的话,还需要额外的设置display: none;
    上面这个<template>标签上没有设置display: none;,注意到了没有。为何?这只是发挥了<template>标签元素的原本特性,天生display:none,同时模板元素内部内容是死活不会呈现的。因此,无需设置隐藏。这就是HTML5 <template>标签元素特征之一:标签内容隐藏性.

2. 标签位置任意性
除了上面<template>子元素天然隐藏外,<template>标签还有一个特性,就是位置任意性,这非常类似<script>或者<style>标签,可以在<head>中,也可以在<body>或者<frameset>中。

3. childNodes无效性
虽然,肉眼看上去是<template>标签里面还有很多子标签,这种惯性思维在这里是不受用的。假设变量template是我们获得的一个<template>标签DOM(里面一大堆HTML代码),你会发现:template.childNodes是个空大屁。我们可以使用template.innerHTML获取完整的HTML片段。如果你非得获取“伪子元素”。也是有办法的,OK,睁大眼睛,要使用content属性。

template.content会返回一个文档片段,你可以理解为另外一个document,然后,使用document下的一些查询API就可以获得<template>标签里面的“伪子元素”了。例如,获得第一张图片元素则是:

CSS Code复制内容到剪贴板
  1. var image_first = template.content.querySelector("img");  

三、HTML5 template元素终面

您可以狠狠地点击这里:HTML5 template模板元素体验demo

模板元素与CSS
如果浏览器有眼不识泰山,认为<template>就是个普通的自定义元素,则显示的就会使下面这个样子,内部的标签按照一般的标签渲染了。

如果浏览器与时俱进,则显示会是下面这样,自身CSS渲染,内部标签直接异空间不渲染,例如Chrome:
详解HTML5中的标签

也就是说,虽然从CSS的角度看,<template>就是个跟CSS打得火热的普通元素,但是,从HTML角度看,其犹如带土的写轮眼,可以让内部标签转移到异空间,血迹界限般稀有。

默认情况下,<template>是隐藏的,实际是默认其display属性为none. 使用下面的代码一测便知:

window.getComputedStyle(template).display;    // 结果是"none"

详解HTML5中的标签

因此,demo中才设置了如下的CSS声明:

CSS Code复制内容到剪贴板
  1. template { displayblock; ... }  

模板的克隆
如果你是在HTML字符串上处理,类似于现在流行的MVC框架或模板技术,则template.innerHTML足矣。然,<template>比<script>强大之处在于,<script>内部内容只能当做字符串来获取,而<template>虽然存在于异空间,但是,依然可以节点获取(上面有展示),以及完整克隆,语法类似下面:

CSS Code复制内容到剪贴板
  1. var clone = document.importNode(template.content, true);  

然后,你就可以用append节点(appendChild)的方式,加载模板内容了,而不是(没得选择)append字符串加载模板内容。标题是“简介”,因此,不展开,也不放具体的实例了(若有兴趣,可参考文末的参考文章),大家知道有这么回事就好。
四、HTML5 template面试小结

至此,<template>元素的行为、表现以及一些方法基本上有了大致的认识,如果这是场面试的话,则我对<template>的评价还是挺高的,特殊场景使用的特殊利器,一些类似“异空间”的设计也是让人大开眼界,这个元素要比<hgroup>之类的HTML5元素更受欢迎更受关注也更有潜力。

临近最后,放上兼容性表,IE浏览器拖了好大的后腿,不过我表示很淡定,因为对IE早已麻木!

兼容性
详解HTML5中的标签

HTML / CSS 相关文章推荐
CSS3动画之利用requestAnimationFrame触发重新播放功能
Sep 11 HTML / CSS
纯CSS实现设置半个字符的样式
Jul 03 HTML / CSS
基于CSS3实现图片模糊过滤效果
Nov 19 HTML / CSS
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
Apr 26 HTML / CSS
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
Jun 28 HTML / CSS
详解CSS3中强大的filter(滤镜)属性
Jun 29 HTML / CSS
HTML+CSS3模拟心的跳动实例代码
Sep 05 HTML / CSS
详解HTML5通讯录获取指定多个人的信息
Dec 20 HTML / CSS
使用HTML5的File实现base64和图片的互转
Aug 01 HTML / CSS
实例讲解HTML5的meta标签的一些应用
Dec 08 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
Aug 19 HTML / CSS
h5页面背景图很长要有滚动条滑动效果的实现
Jan 27 HTML / CSS
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
Apr 10 #HTML / CSS
使用HTML5捕捉音频与视频信息概述及实例
Aug 22 #HTML / CSS
CSS3只让背景图片旋转180度的实现示例
Mar 09 #HTML / CSS
CSS3 真的会替代 SCSS 吗
Mar 09 #HTML / CSS
css3实现书本翻页效果的示例代码
Mar 08 #HTML / CSS
纯CSS3实现圆圈动态发光特效动画的示例代码
Mar 08 #HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
Mar 05 #HTML / CSS
You might like
PHP中for循环语句的几种变型
2006/11/26 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
js实现日历
2020/11/07 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
python服务器与android客户端socket通信实例
2014/11/12 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
python解析xml简单示例
2019/06/21 Python
python安装requests库的实例代码
2019/06/25 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
浅析HTML5 Landmark
2020/09/11 HTML / CSS
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
英语专业推荐信
2013/11/16 职场文书
会计求职信范文
2014/05/24 职场文书
2014年技术部工作总结
2014/12/12 职场文书
车队安全员岗位职责
2015/02/15 职场文书
怎样写家长意见
2015/06/04 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技