不写一行JS!纯CSS如何读取HTML属性实现Tooltip

前言

日常开发中,Tooltip(提示框)是非常常见的。正常实现方式是依赖JavaScript监听hover事件,动态计算位置并插入DOM元素。

但你知道不?​​纯CSS其实也能"读取"HTML元素上的属性值,配合伪元素生成动态Tooltip,全程无需一行JavaScript代码!​

本文将带你使用纯css实现Tooltip。

1. 实现思路

通过HTML原生的data-*属性存储提示内容,利用CSS的attr()函数读取属性值,再结合伪元素::after中的content属性渲染提示框,从而实现一个轻量的动态Tooltip方案。

具体说明下:

1.1 自定义属性

HTML5为所有元素提供了data-*自定义属性(如data-tooltip)。特点是:

  • ​纯HTML原生支持​:无需JavaScript即可直接定义
  • ​语义化存储​ :通过属性名(如tooltip)明确标识存储的内容用途
  • ​CSS/JS均可访问​ :既可以被CSS的attr()函数读取,也能通过JavaScript的datasetAPI获取。

1.2 CSS的属性读取器:attr()函数

CSS的attr()函数是一个"能获取指定HTML属性的值,并在CSS规则中使用。

例如:

css 复制代码
div::after {
  content: attr(data-tooltip); /* 读取data-tooltip属性的值作为内容 */
}

目前attr()​最稳定且广泛支持的场景是配合伪元素(如::before/::after)的content属性​​,这是实现Tooltip的关键。

当然不用担心兼容性,基本全部支持:

2. 纯CSS实现

话不多说,直接上代码:

xml 复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8" />
  <title>纯 CSS Tooltip</title>
  <style>
    .tooltip {
      position: relative;
      display: inline-block;
      margin: 20px;
      padding: 10px 15px;
      background: #28a745;
      color: white;
      border-radius: 4px;
      cursor: pointer;
    }

    .tooltip::after {
      content: attr(data-tooltip);
      position: absolute;
      bottom: 100%;
      left: 50%;
      transform: translateX(-50%);
      margin-bottom: 5px;
      padding: 5px 10px;
      background: #333;
      color: white;
      font-size: 12px;
      white-space: nowrap;
      border-radius: 4px;
      opacity: 0;
      visibility: hidden;
      transition: all 0.3s;
      z-index: 10;
    }

    .tooltip:hover::after {
      opacity: 1;
      visibility: visible;
    }
  </style>
</head>
<body>
  <div class="tooltip" data-tooltip="这是一个纯 CSS 提示">悬停我</div>
</body>
</html>

✅ 这种方式不依赖 JavaScript 或框架,适合简单的、静态的提示需求。

效果:

3. 总结

最后总结一下:纯CSS通过读取HTML的data-*属性(attr()函数)+ 伪元素渲染(::after),配合定位与动画,即可实现无需JS的动态Tooltip,兼容性完全不用担心。

如有错误,请指正O^O!

相关推荐
2601_9657984710 分钟前
Arrow Unlocker HTML5 Game Review: Keep Web Arcade Players Coming Back
前端·html·html5
不简说38 分钟前
JS 代码技巧 vol.10 — 20 个 V8 引擎原理,解释"为什么这样写快"
前端·javascript·面试
醉城夜风~1 小时前
HTML常用标签详解学习博客:从基础标签到页面结构完整掌握
前端·学习·html
OpenTiny社区1 小时前
拒绝臃肿!TinyRobot从“AI 输入框”到“AI输入控制台”的可扩展进化
前端·vue.js
淼澄研学2 小时前
PyTorch深度学习实战:5个核心方法从0到1构建神经网络
前端·数据库·python
MartinYeung52 小时前
[论文学习]WASP:面向提示注入攻击的Web代理安全性基准测试
前端·网络·学习
lemon_sjdk2 小时前
从 ServletRequest 到 Spring 抽象:Web 请求的底层基石与演化
java·前端·spring
程序员黑豆2 小时前
鸿蒙应用开发之状态变化通知:@Watch 装饰器详解与实战
前端·harmonyos
swipe2 小时前
13|(前端转全栈)支付成功不等于结束:回调、幂等、超时关单和状态竞争
前端·后端·面试
swipe3 小时前
12|(前端转全栈)点击提交订单后,后端如何用事务守住价格、库存和订单?
前端·后端·面试