热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何使用HTML5自定义数据属性

在本文中,我将向你介绍如何使用HTML5自定义数据属性。我还将向你介绍一些开发人员在工作中经常使用的优秀实例。为什么需要自定义数据属性?很多时候我们需要存储一些与不同DOM元素相关联的

在本文中,我将向你介绍如何使用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">Wordspan>

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

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


span:hover::before {
display: inline-block;
}

HTML代码:

The gray wolf, also known as the class="tooltip" data-tooltip="some more information">class="tooltip-info">some more information timber wolf or western wolf, is a canine native to the wilderness and remote areas of Eurasia and class="tooltip" data-tooltip="some more information">class="tooltip-info">some more information North America. It is the largest extant member of its family, with males averaging 4345 kg (9599 lb), and females 3638.5 kg (7985 lb). Like the red wolf, it is distinguished from other class="tooltip" data-tooltip="some more information">class="tooltip-info">some more informationCanis species by its larger size and less pointed features, particularly on the ears and muzzle.

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/


推荐阅读
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • Android系统启动过程分析一、Android平台架构首先贴一张Android系统架构图方便理解整个Android架构,这可以让我们从整体上对整个启动流程有个大概认知。可以看出整 ... [详细]
  • React图片输入框移动端网页_018
    React-图片输入框-移动端网页gitHub地址觉得有参考价值,点个赞https:github.comxiaopingzh…目录结构.├──README.md├──dist│├─ ... [详细]
  •   html5中template用法,html5标签  一、HTML5template元素初面  模板元素,基本上可以确定 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • vue扫描二维码
    本地要用localhost。发布之后要用https的才可以看到。(你的设备也必须有摄像头)切记卡号 ... [详细]
  • backgroundposition和长图实现鼠标悬浮动画效果
    以下图片及代码均来自京东云点击这里进入京东云思路和效果图:background-position:00可以用js动态的将长图按帧数一帧一阵的展示出来效果类似gif,红框就是可视界面 ... [详细]
  • Tooltips效果,鼠标经过显示提示 ... [详细]
  • css自适应字体样式?如果是一排文字,一个background‘red’;就搞定了。是多行的话,只有根据文字行高,用一张背景图横向重复。css样式自适应分辨率高度和宽度尽量使用百分 ... [详细]
author-avatar
kobe24_3803
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有