在本文中,我将向你介绍如何使用HTML5自定义数据属性。我还将向你介绍一些开发人员在工作中经常使用的优秀实例。

为什么需要自定义数据属性?

很多时候我们需要存储一些与不同DOM元素相关联的信息。这些信息对于读者来说可能是不需要的,但是可以轻松的访问这些信息将会给我们开发者的工作带来极大的便利。

例如,假设你有一份某个餐饮类网站上所有餐馆的名单。在HTML5之前,如果你想存储餐馆提供的食物种类或餐馆与用户之间的距离等信息,那么你将使用HTML的class属性。但是如果你还需要存储餐馆的id以便查看用户想要访问的特定餐厅该怎么办?

以下是基于HTMLclass属性的方法存在的一些问题:

  1. HTMLclass属性不是用来存储这样的数据的,其主要目的是允许开发人员给一组元素添加样式信息。
  2. 我们需要为每个追加的信息向元素中添加一个新class,这使得解析JavaScript中的数据得到我们所需要的内容变得更加困难。
  3. 假设给定的类名以数字开头。如果你决定稍后根据类名来设计元素的样式,那么你在样式表中将不得不回避数字或者使用属性选择器。

为了解决这些问题,HTML5引入了自定义数据属性。一个元素上属性名以data-开头的属性都是数据属性。你也可以使用这些数据属性来给元素设计样式。

接下来,让我们深入了解数据属性的基础知识、学习如何在CSS和JavaScript中访问数据属性的值。

HTML语法

如上所述,data属性的名称始终以data-开头。以下是一个例子:

<li data-type="veg" data-distance="2miles" data-identifier="10318">
Salad King
</li>

你现在可以使用这些数据属性为你的用户搜索和排序餐厅。例如,你现在可以向他们展现在一定距离内的所有素食餐厅。

除了data-前缀之外,有效的自定义数据属性的名称必须只能包含字母、数字、连字符( - )、点(。)、冒号(:)或下划线(_),不能包含大写字母。

在使用数据属性时,你应该记住下面两个规则:

第一:存储在这些属性中的数据应该是字符串类型。任何可以被编码为字符串类型的东西也可以存储在数据属性中。所有的类型转换都需要使用JavaScript完成。

第二:数据属性应该只在没有其他合适的HTML元素或属性时使用。例如,使用data-class属性存储元素class属性的值是不恰当的。

一个元素可以具有任意数量的数据属性,这些数据属性也可以具有任何所需要的值。

数据属性与CSS

你可以根据数据属性使用CSS中的属性选择器来为元素设计样式。你还可以借助attr()函数将数据属性中存储的信息显示给用户(以工具提示或其他方式)。

设计元素样式

现在回到我们餐厅的例子,你可以使用数据属性向用户提供关于餐厅类型或者他们与餐厅之间的距离等信息,或者为餐厅设计不同的背景颜色。以下是一个例子:

li[data-type='veg'] {
background: #8BC34A;
} li[data-type='french'] {
background: #3F51B5;
}

HTML代码:

<h2>Restaurants in New York</h2>
<div class="hint"><span class="french"></span><span>French</span></div>
<div class="hint"><span class="veg"></span><span>Vegetarian</span></div>
<div class="hint"><span class="german"></span><span>German</span></div>
<ul>
<li data-type="veg" data-distance="2miles" data-identifier="10318">Bloss</li>
<li data-type="german" data-distance="3miles" data-identifier="10318">Heidelberg</li>
<li data-type="french" data-distance="1mile" data-identifier="10318">Daniel</li>
<li data-type="veg" data-distance="4miles" data-identifier="10548">Dirt Candy</li>
<li data-type="french" data-distance="3miles" data-identifier="10318">La Grenouille</li>
<li data-type="french" data-distance="1mile" data-identifier="10318">Balthazar</li>
<li data-type="veg" data-distance="2miles" data-identifier="12315">Angelica Kitchen</li>
<li data-type="german" data-distance="1mile" data-identifier="10318">Blaue Gans</li>
<li data-type="german" data-distance="2miles" data-identifier="12315">Reichenbach Hall</li>
</ul>

CSS代码:

html {
font-family: 'Lato';
margin: 20px auto;
max-width: 600px;
font-size: 1.25em;
} ul {
list-style: none;
padding: 0;
} li {
padding: 5px 10px;
margin: 5px 0;
color: white;
border-radius: 5px;
} .hint {
margin-right: 30px;
display: inline-block;
} span.french, span.veg, span.german {
width: 15px;
height: 15px;
border-radius: 50%;
display: inline-block;
float: left;
margin-top: 5px;
margin-right: 5px;
} span.french {
background: #3F51B5;
} span.veg {
background: #8BC34A;
} span.german {
background: #bb6666;
} li[data-type='veg'] {
background: #8BC34A;
} li[data-type='french'] {
background: #3F51B5;
} li[data-type='german'] {
background: #bb6666;
}

效果图:

创建工具提示

你可以使用工具提示向用户显示一些与元素相关的附加信息。但是因为纯CSS的工具提示不能完全使用,所以我建议你在简单的模型上使用这种方法而不是在一个产品型的网站上。

你要显示的信息可以存储在一个data-tooltip属性中。

<span data-tooltip="A simple explanation">Word</span>

然后,你可以使用::before伪元素将数据呈现给用户。

span::before {
content: attr(data-tooltip);
// 其余的样式规则
} span:hover::before {
display: inline-block;
}

HTML代码:

<p>The gray wolf, also known as the <span class="tooltip" data-tooltip="some more information"><span class="tooltip-info">some more information </span>timber wolf</span> or western wolf, is a canine native to the wilderness and remote areas of Eurasia and <span class="tooltip" data-tooltip="some more information"><span class="tooltip-info">some more information  </span>North America</span>. It is the largest extant member of its family, with males averaging 43–45 kg (95–99 lb), and females 36–38.5 kg (79–85 lb). Like the red wolf, it is distinguished from other <span class="tooltip" data-tooltip="some more information"><span class="tooltip-info">some more information</span>Canis species</span> by its larger size and less pointed features, particularly on the ears and muzzle.</p>

CSS代码:

html {
font-family: 'Lato';
margin: 20px auto;
line-height: 1.5;
max-width: 600px;
font-size: 1.25em;
} span.tooltip {
padding: 0px 5px;
position: relative;
background: #FFBB99;
cursor: pointer;
} .tooltip-info {
position: absolute;
top: -9999px;
left: -9999px;
} span.tooltip::before {
content: attr(data-tooltip);
position: absolute;
top: 1.5em;
font-size: 0.9em;
padding: 1px 5px;
display: none;
color: white;
background: rgba(0, 0, 0, 0.75); border-radius: 4px;
transition: opacity 0.1s ease-out;
z-index: 99;
text-align: left;
} span:hover::before {
display: inline-block;
}

效果图(鼠标移入淡红色的区域会出黑色背景的提示):

使用JavaScript访问数据属性

在JavaScript中有三种方式访问数据属性。

使用getAttribute和setAttribute

你可以使用JavaScript中的getAttribute()setAttribute()来获取和设置不同数据属性的值。

如果给定的属性不存在,该getAttribute方法将返回null或一个空字符串。以下是使用这些方法的示例:

var restaurant = document.getElementById("restaurantId");
var ratings = restaurant.getAttribute("data-ratings");

你可以使用该setAttribute方法修改现有属性的值或添加新属性。

restaurant.setAttribute("data-owner-name", "someName");

使用dataset属性

访问数据属性的一种更为简单的方法是借助dataset属性。此属性返回一个DOMStringMap对象,此对象拥有一个包含所有自定义数据属性的目录。

使用 dataset属性时,你应该记住下面这些步骤:

将自定义数据属性转换为DOMStringMap的键值需要三个步骤:

  1. 将该data-前缀从属性名中删除
  2. 将任何后跟小写字母的连字符从名称中删除,并将其后面的字母转换为大写字母(即驼峰命名法——译者注)
  3. 其他字符保持不变。这意味着任何没有被小写字母跟着的连字符也将保持不变。

然后可以使用存储在对象中按照驼峰命名法命名的名称作为键来访问属性,如element.dataset.keyname

访问属性的另一种方法是使用括号符号,如 element.dataset[keyname]

考虑以下的HTML代码:

<li data-type="veg" data-distance="2miles" data-identifier="10318" data-owner-name="someName">
Salad King
</li>

以下是几个例子:

var restaurant = document.getElementById("restaurantId");

var ratings = restaurant.dataset.ratings;
restaurant.dataset.ratings = newRating; var owner = restaurant.dataset['ownerName'];
restaurant.dataset['ownerName'] = 'newOwner';

现在所有的主流浏览器都支持这种方法。相比之前访问自定义数据属性的方法,你应该更喜欢这种方法。

使用 jQuery

你也可以使用jQuery的data()方法来访问元素的数据属性。在jQuery1.6之前,你必须使用以下代码来访问数据属性:

var restaurant = $("#restaurantId");

var owner = restaurant.data("owner-name");
restaurant.data("owner-name", "newName");

从版本1.6开始,jQuery使用驼峰命名法版本的数据属性。现在,你可以使用以下代码来做同样的事情:

var restaurant = $("#restaurantId");

var owner = restaurant.data("ownerName");
restaurant.data("ownerName", "newName");

你应该知道,jQuery内部还试图将从数据属性中获取的字符串转换成合适的类型,如数字,布尔值,对象,数组和空值等。

var restaurant = $("#restaurantId");
var identifier = restaurant.data("identifier"); console.log(typeof identifier);
// number

如果你希望jQuery以字符串的形式获取属性的值,而不用尝试将其转换为其他类型,则应该使用jQuery的attr()方法。

jQuery仅在第一次访问时检索数据属性的值。以后不再访问或更改数据属性的值。你对这些属性所做的所有更改都会在内部进行,并且只能使用jQuery访问。

假设你正在操作以下列表项的数据属性:

<li id="salad" data-type="veg" data-distance="2miles" data-identifier="10318">
Salad King
</li>

你可以使用以下代码更改其data-distance属性的值:

var distance = $("#salad").data("distance");
console.log(distance);
// "2miles" $("#salad").data("distance","1.5miles");
console.log(distance);
// "1.5miles" document.getElementById("salad").dataset.distance;
// "2miles"

你可以看到,使用普通的JavaScript(不是jQuery)获取属性data-distance的值返回给我们的一直是旧的结果。

结论

在本教程中,我介绍了HTML5数据属性中你需要了解的所有重要的知识。除了使用属性选择器创建工具提示和样式元素之外,还可以使用数据属性来存储和显示用户一些其他数据,例如一个未读消息的通知等等。

如果你对数据属性有任何其他问题,请在评论中告诉我。

原文链接:https://www.sitepoint.com/how-why-use-html5-custom-data-attributes/

如何使用HTML5自定义数据属性的更多相关文章

  1. html5 自定义数据属性 ,也就是 data-* 自定义属性---笔记。

    html5  自定义数据属性 ,也就是 data-* 自定义属性.  例如 <div data-last-value="43" data-hidden="true& ...

  2. Html5 自定义数据属性

    html5 可以为元素添加自定义属性,但是要添加前缀data-.(下面这个例子中的自定义属性的命名,其实是不规范的,不应该包含大写字符,例如:data-myName 应改命名为:data-myname ...

  3. 【翻译】详解HTML5 自定义 Data 属性

    原标题:HTML5 Custom Data Attributes (data-*) 你是否曾经使用 class 或 rel 来保存任意的元数据,只为了使你的JavaScript更简单?如果你回答是的, ...

  4. HTML5自定义select标签样式的方法

    HTML5自定义select标签样式的方法 -webkit-appearance: none; 这个东西可以隐藏箭头 不过手机端就直接 设置透明度为0就行了(如果这种做法比前面个要麻烦点 毕竟还要对他 ...

  5. 基于HTML5自定义文字背景生成QQ签名档

    分享一款利用HTML5实现的自定义文字背景应用,首先我们可以输入需要显示的文字,并且为该文字选择一张背景图片,背景图片就像蒙版一样覆盖在文字上.点击生成QQ签名档即可将文字背景融为一体生成另外一张图片 ...

  6. html5 自定义验证信息

      h5 为表单新增了很多类型,及属性. 根据这些新增的类型及属性 h5也为我们提供了验证这些数据的js函数,这些验证表单的函数都存在了ValidityState对象中,接下来让我们一起来了解一下这些 ...

  7. HTML5自定义data属性

    可能大家在使用jquery mobile时,经常会看到data-role.data-theme等的使用,比如:通过如下代码即可实现页眉的效果: [html] <div data-role=&qu ...

  8. 【转载】HTML5自定义data属性

    可能大家在使用jquery mobile时,经常会看到data-role.data-theme等的使用,比如:通过如下代码即可实现页眉的效果:   [html]  <div data-role= ...

  9. html5 自定义标签取值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. Altera Stratix IV Overview

    由于要开发基于DE4平台的应用,应该要了解一下该平台的芯片情况Stratix IV 具体型号为:Stratix IV EP4SGX230KF40C2 命名规范如下 官网资料为:https://www. ...

  2. .Net轻量级ORM-NPoco的使用方法-摘自NPoco国外官方Wiki

    文章引用自NPoco官方Wiki,地址:https://github.com/schotime/NPoco/wiki,因公司网络不稳定,有时无法访问,特将其摘抄. Home Adam Schroder ...

  3. echarts 各类图形小计

    通用  官网 1.提示框组件 效果: 代码: 配置项手册 2.工具框组件 效果: 代码: 配置项: 3.series系列列表 a)折线line 效果: 代码: if(serSets[v]){ //注释 ...

  4. 在腾讯云上部署Hexo博客

    推荐理由 ----搭建个人的空间博客目前深受个人开发者的追捧,然而博客的种类和平台有很多,Hexo是一个开源的静态博客生成器.相比于其他博客而言它只要是web容器就能用.除了闷头专研技术之外,程序员还 ...

  5. 开源一个vue2的tree组件

    一直打算偷懒使用个现成的树组件,但是在github上找了一大圈没有找到真正满足应用开发的树组件,所以没办法只能自己写了一个,开源出来希望可以帮助到需要的人,同时如果大家觉得好用,我可以顺带骗骗★(希望 ...

  6. mybatis generator 插件安装及使用

    现在Mybatis特别火,但是在开发中却要经常写实体类和配置文件,会不会特别烦人,所以可以利用Mybatis的代码生成插件来生成这部分代码: 1,打开eclipse,点击Help>Softwar ...

  7. 关于压缩jar包时提示*.*没有这个文件或目录的问题以及解决办法:

    关于压缩jar包时提示.没有这个文件或目录的问题以及解决办法: 问题描述: 我在打包jar时,CMD中进入到包的上一层目录. 在命令提示符中输入 提示如下: 从提示中可知没有找到我们想要打包的clas ...

  8. 使用SevenZipSharp压缩/解压7z格式

    7z格式采用的LZMA算法,号称具有现今最高压缩率.笔者在nuget上搜索7z,在搜索结果中最终选择了SevenZipSharp来进行压缩/解压.不得不说,SevenZipSharp的API设计得非常 ...

  9. 老李分享:jvm结构简介 1

    老李分享:jvm结构简介     poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...

  10. laravel blade $loop

    laravel 5.3 blade 新增$loop变量 文档如下: 在Laravel 5.3中,@foreach指令提供了更加强大的功能,在每一个@foreach循环体中都可以调用一个新的$loop变 ...