HTML5元素

html-css021

HTML5元素,第1张

h5元素大致的分为下面几大类:

1.内嵌------在文档中添加其他类型的内容,如audio,video,canvas,iframe等

2.流------在文档和应用的body中使用的元素,如form,h1,small等

3.标题------段落标题,如h1,h2,hgroup等

4.交互------与用户交互的内容,如音频和视频的空间,button,textarea等

5.元数据------通常出现在页面的head中,设置页面其他部分的表现和行为,如script,style,title等

6.短语------文本和文本标记元素,如mark,kbd,sub,sup等

以上所有类型的元素都可以通过css来设定样式。

HTML5定义类一组新的语义化标记来描述元素的内容。简化了HTML页面设计。

这些分别是

1.header------标记头部区域的内容(用于整个页面或页面中的一块区域)

2.footer------标记脚部区域的内容(用于整个页面或页面中的一块区域)

3.section------Web页面中的一块区域

4.article------独立的文章内容

5.aside------相关内容或者引文

6.nav------导航类辅助内容

1.hgroup------用于对整个页面或页面中一个内容区块的标题进行组合

2.figure------表示一段独立的流内容,一般表示文档主体流内容中的一个独立单元,使用figcaption元素可为figure元素组添加标题

3.vedio------定义视频,比如电影片段或其他视频流

4.audio------定义音频,比如音乐或其他音频流

5.embed------用来插入各种多媒体,格式可以使MIDI,WAV,AIFF,AU,MP3等

6.mark------主要用来在视觉上向用户呈现那些需要突出显示和高亮显示的文字。

7.time------表示日期或时间,也可以同时表示两者

8.canvas------表示图形,这个元素本身没有行为,仅提供一块画布,但它把一个绘图API展现给客户端JavaScript,以使脚本能够把想绘制的东西回执到这块画布上。

9.output------表示不同类型的输出,比如脚本的输出

10.source------为媒介元素

11.menu------表示菜单列表。当希望列出表单控件时使用的该标签

12.ruby------表示ruby注释(中文注音或字符)

13.rt------表示字符的解释或发音

14.rp------在ruby注释中使用,以定义不支持ruby元素的浏览器所显示的内容

15.wbr------表示软换行。与br的区别在于br表示此处必须换行,而wbr意思是浏览器窗口或父级元素的宽度足够宽时,不进行换行,宽度不够时,主动在此处进行换行。

16.command------表示命令按钮,如单选按钮,复选按钮或按钮框。

17.details------表示用户要求得到并且可以得到的细节信息,可以与summary元素配合使用,summary元素提供标题或图例,标题是可见的,用户单机标题时,会显示细节信息。summary应该是details元素的第一个子元素

18.datalist------表示可选数据的列表,与input元素配合使用,可以制作出输入值的下拉列表。

19.datagrid------表示可选数据的列表,它以树形列表形式来显示

20.keygen------表示生成密钥

21.progress------表示运行中的进程,可以使用progress元素来显示JavaScript中耗费时间函数的进程

22.email------表示必须输入email地址的文本输入框

23.url------表示必须输入url地址的文本输入框

24.number------表示必须输入数值地址的文本输入框

25.range------表示必须输入一定范围内数字值址的文本输入框

26.Date Pickers------HTML5拥有多个可供选取日期和时间的新型输入文本框

这个就不说了。

创建自定义的HTML元素

document.registerElement() 函数用来创建自定义的HTML元素。它将返回一个构造函数,其中有一个参数选项,用来声明自定义HTML元素的名称,另外有一个可选参数项,用来描述原型的对象,自定义功能的元素。

在下面的示例中,简单的创建了一个新的HTML元素 <x-treehouse>,并且将它放入到页面中:

var XTreehouseElement = document.registerElement('x-treehouse')

document.body.appendChild(new XTreehouseElement())

下面的HTML就会插入 <body>元素内:

<x-treehouse></x-treehouse>

自定义元素的名称 必须使用连字符 - ,这样浏览器就可以区分标准元素和自定义元素。这也意味着,你不会遇到一个新的HTML元素和你自己定义元素使用相同名称的问题。

给自定义元素创建JavaScript API

可以给自定义元素创建一个JavaScript API,这样自定义元素就具备一系列的方法和属性。要做到这一点,首先需要创建一个JavaScript对象。可以通过使用 Object.create() 方法。将 HTMLElement.prototype 传给这个方法,创建一个对象。这个对象和标准的HTML的方法和属性相同。

var XTreehouseProto = Object.create(HTMLElement.prototype)

可以像下面这样,在这个新对像上定义你的需要的方法:

XTreehouseProto.hello = function(){

alert('Hello!')

}

使用 Object.defineProperty() 方法给自定义元素定义一个属性。这个方法的第一个参数是需要定义属性的对象,第二个参数是需被定义或修改的属性名,第三个参数是需被定义或修改的属性的描述符。在这里你可以设置一个默认值指定属性是可写还是可读。

Object.defineProperty(XTreehouseProto, 'badges', {

value: 20,

writable : true

})

一旦给自完义元素定义好API,需要通过 document.registerElement() 来调用。使用自定义元素的名称作为第一个参数,然后给对象设置为一个名为 prototype 的属性。这个属性的值应该设置您在前面创建好的原型对象。

var XTreehouseElement = document.registerElement('x-treehouse', {

prototype: XTreehouseProto

})

一旦注册自定义元素,可以创建一个新元素,并将其添加到页面中。

var xtreehouse = new XTreehouseElement()

document.body.appendChild(xtreehouse)

可以像其他的HTML元素一样使用前面定义好的方法和属性。

xtreehouse.hello()

var badges = xtreehouse.badges

扩展现有的元素

正如创建的自定义元素,还可以使用 registerElement() 方法来扩展现有的HTML元素的功能。比如我们可以扩展 <img>元素来创建一个带变量的缩略图显示。

像之前那样先创建一个对象原型。不过这次,是从现有的HTML元素上来扩展对象原型。在这个示例中,扩展的是 HTMLImageElement 。

var ThumbImageProto = Object.create(HTMLImageElement.prototype)

接下来使用 createCallback 定义一个函数(回调函数),在创建元素时就定义了图像的 width 和 height 。

ThumbImageProto.createdCallback = function() {

this.width = '100'

this.height = '100'

}

还可以自定义自己的属性和方法:

ThumbImageProto.changeImage = function() {

this.src = 'new-image.jpg'

}

当你想扩展元素时,在 document.registerElement() 创建元素时,可以通过给对象添加 extends 属性。这个属性的属性值就是你需要扩展的元素名称。

var ThumbImage = document.registerElement('thumb-img', {

prototype: ThumbImageProto,

extends: 'img'

})

要使用自定义元素,可以给元素指定一个属性来扩展元素。这个属性的值是自定义的元素名称,可以告诉浏览器 <img>使用了自定义的API: thumb-img 。

<img is="thumb-img">

自定义元素回调方法

创建和管理自定义元素时有很多回调方法可使用:

createdCallback : 元素创建后调用

attachedCallback : 元素附加到文档后调用

detachedCallback : 从文档中移除元素后调用

attributeChangedCallback(attrName, oldValue, newValue) : 元素任一属性变更后调用

指定这些回调函数的原型对象,并传递给 document.registerElement() 。

var XTreehouseProto = Object.create(HTMLElement.prototype)

XTreehouseProto.createdCallback = function() {}

XTreehouseProto.attachedCallback = function() {}

XTreehouseProto.detachedCallback = function() {}

XTreehouseProto.attributeChangedCallback = function(attrName, oldValue, newValue) {}

var XTreehouse = document.registerElement('x-treehouse', { prototype: XTreehouseProto })

使用Shadow DOM创建自定义元素

自定义元素真正的威力就是如何和 Shadow DOM 一起使用。使得它很容易创建可重用的组件。

在接下来的内容中将看看如何使用Shadow DOM自定元素,来创建一个网上商店可展示的商品。这里的想法是,Web开发人员可通过添加一行HTML标签来轻松的创建产品。需要显示的产口所有信息都通过自定义的 data- 属性来完成。

<x-product data-name="Product Name" data-img="image.png" data-url="http://example.com"></x-product>

首先基于 HTMLElement.prototype 创建一个新的原型对象。

// Create a new object based of the HTMLElement prototype

var XProductProto = Object.create(HTMLElement.prototype)

接下来,我们需要设置一个 createdCallback 函数。我们将要创建一个 <img>和<a>元素,用来显示产品。先把代码展示一下,再详细介绍:

// Set up the element.

XProductProto.createdCallback = function() {

// Create a Shadow Root

var shadow = this.createShadowRoot()

// Create an img element and set it's attributes.

var img = document.createElement('img')

img.alt = this.getAttribute('data-name')

img.src = this.getAttribute('data-img')

img.width = '150'

img.height = '150'

img.className = 'product-img'

// Add the image to the Shadow Root.

shadow.appendChild(img)

// Add an event listener to the image.

img.addEventListener('click', function(e) {

window.location = this.getAttribute('data-url')

})

// Create a link to the product.

var link = document.createElement('a')

link.innerText = this.getAttribute('data-name')

link.href = this.getAttribute('data-url')

link.className = 'product-name'

// Add the link to the Shadow Root.

shadow.appendChild(link)

}

首先创建一个新的Shadow DOM。如果你对Shadow DOM不熟悉,可以先阅读之前的文章。然后创建一个 <img>元素,并设置其 alt 、 src 、 width 和 height 属性指定 x-product 元素的一些信息。

注:回调函数, this 指的是自定义元素的标记。

接下来将 <img>和 <a>元素添加到Shadow root下面。并设置元素的属性值从自定义元素的 data- 属性获取。

现在我们需要注册自定义元素,并且将 x-product 元素传给 document.registerElement() ,同时指定对象原型为 XProductProto :

// Register the new element.

var XProduct = document.registerElement('x-product', {

prototype: XProductProto

})

为了让项目展示更好,需要添加一些CSS代码:

x-product {

display: inline-block

float: left

margin: 0.5em

border-radius: 3px

box-shadow: 0 1px 3px rgba(0,0,0,0.3)

font-family: Helvetica, arial, sans-serif

-webkit-font-smoothing: antialiased

}

x-product::shadow .product-img {

cursor: pointer

background: #FFF

margin: 0.5em

}

x-product::shadow .product-name {

display: block

text-align: center

text-decoration: none

color: #08C

border-top: 1px solid #EEE

font-weight: bold

padding: 0.75em 0

}

为了显示产品,我们需要将 <x-product>元素添加到HTML模板中。使用 data-name , data-img 和 data-url 属性指定产品相关数据。当页面加载时,自定义元素就会通过 createCallback 来调用它们。

<x-product data-name="Ruby" data-img="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4621/ruby.png" data-url="http://example.com/1"></x-product>

<x-product data-name="JavaScript" data-img="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4621/javascript.png" data-url="http://example.com/2"></x-product>

<x-product data-name="Python" data-img="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4621/python.png" data-url="http://example.com/3"></x-product>

就是这样,你现在已经使用Shadow DOM自定义了一个元素,显示一系列的产品。

浏览器支持自定义HTML元素

Chrome 33+和Opera支持自定义元素。然而有一个强大的 polyfill 可以让其他的浏览器,比如说 Polymer 和 X-tags 。

可以使用 registerElement() 方法检测 document 对象是否被浏览器支持:

if ('registerElement' in document) {

// Supported.

} else {

// Not supported.

}