工具提示动画(4 向 CSS Tooltip 气泡源码,零 JS)

CSS 许可:自研原创

工具提示动画源码:纯 CSS 实现上下左右 4 向气泡提示,data-tip 属性驱动文案,弹性缓动滑入 + 小箭头,键盘聚焦同样触发,零 JS 零依赖复制即用。

效果演示(真实可交互)

工具提示(Tooltip)是图标按钮、表格操作列里最常见的微交互:鼠标悬停时在元素附近弹出解释文案,移开后自然消失。演示区共 4 款按钮,分别对应上、下、左、右四个方向,全部由纯 CSS 实现——文案写在 data-tip 属性里,气泡与箭头分别由 ::after 和 ::before 伪元素生成,无需一行 JS。把鼠标移到按钮上可以看到气泡带着轻微过冲的弹性缓动滑入;用键盘 Tab 聚焦按钮同样能弹出提示,屏幕阅读器用户也能感知到焦点位置,无障碍表现友好。气泡采用深底白字、圆角与轻投影,在浅色页面上对比清晰;气泡设了 pointer-events: none,鼠标即使悬停在气泡上也不会触发闪烁或遮挡按钮点击。四个方向的气泡都带小箭头指向触发元素,帮助用户快速建立空间关联。除了纯展示,工具提示也常用于解释操作后果,比如「删除后不可恢复」这类关键文案;深浅配色与箭头指向让信息归属明确,用户无需猜测提示来自哪个按钮,误操作率也会随之下降。

悬停任意按钮弹出提示,键盘 Tab 聚焦同样触发(无障碍友好)

完整代码

HTML 只需给按钮加一个 data-tip 属性,方向用 data-pos 声明:

<button class="tt-btn" data-tip="顶部提示:悬停或聚焦我看看" data-pos="top">顶部提示</button>
<button class="tt-btn" data-tip="底部提示,带小箭头" data-pos="bottom">底部提示</button>

CSS 核心:气泡文案由 content: attr(data-tip) 读取,四个方向只改定位,动画统一走 transform:

.tt-btn { position: relative; }

/* 气泡本体:white-space 保持单行,opacity + transform 组合过渡 */
.tt-btn::after {
  content: attr(data-tip);
  position: absolute; padding: 8px 12px; border-radius: 8px;
  background: #1c2442; color: #fff; font-size: 12px; white-space: nowrap;
  opacity: 0; pointer-events: none;
  transition: opacity .2s ease, transform .25s cubic-bezier(.34, 1.56, .64, 1);
}

/* 顶部方向:气泡在按钮上方,从下往上滑入 */
.tt-btn[data-pos="top"]::after {
  left: 50%; bottom: calc(100% + 12px);
  transform: translate(-50%, 6px);
}

/* 小箭头:45° 旋转的正方形,与气泡同底色 */
.tt-btn[data-pos="top"]::before {
  content: ""; position: absolute; width: 8px; height: 8px;
  left: 50%; bottom: calc(100% + 8px); margin-left: -4px;
  background: #1c2442; transform: rotate(45deg) scale(0);
  transition: transform .25s cubic-bezier(.34, 1.56, .64, 1), opacity .2s ease;
}

/* 悬停或键盘聚焦时同时点亮气泡与箭头 */
.tt-btn:hover::after, .tt-btn:hover::before,
.tt-btn:focus-visible::after, .tt-btn:focus-visible::before {
  opacity: 1; transform: translate(0, 0);
}
.tt-btn:hover::before, .tt-btn:focus-visible::before { transform: rotate(45deg) scale(1); }

底部、左侧、右侧的实现与顶部完全同构,只改定位坐标与初始位移方向,完整写法见演示组件源码中的 [data-pos="bottom" | "left" | "right"] 规则。

参数说明

参数位置说明
文案内容data-tip 属性写在元素上的提示文本,伪元素 attr() 自动读取
弹出方向data-postop / bottom / left / right 四选一
滑入缓动cubic-bezier(.34,1.56,.64,1)1.56 过冲系数带来轻微弹跳手感
气泡底色::after 的 background深色底对比度最佳,也可改为主题色
触发方式:hover 与 :focus-visible鼠标与键盘两种入口,默认已内置

兼容性与性能

常见问题

Q: 气泡文案很长会换行吗? 默认 white-space: nowrap 强制单行;文案过长时去掉该属性并设置 max-width 即可自动换行,同时把定位从 50% 改成靠左对齐,避免超出屏幕。

Q: 想延迟 0.3 秒再弹出? 把 transition 里的 opacity .2s 改为 opacity .2s .3s,并把 hover 态下的 transition 恢复为无延迟,即可实现「慢出快收」的经典体验。

Q: 放在页面边缘会溢出屏幕吗? 会。右侧按钮的 tooltip 建议用 data-pos="left",或对 ::after 追加 max-width: 60vw 并允许换行。

Q: 可以商用吗? 可以。本组件为粤喵自研原创代码,免费商用无需署名。

许可与来源

  • 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
  • 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
  • 首次发布:2026-09-01 · 最近更新:2026-09-01
  • 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
  • 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理

常见问题

这个组件可以商用吗?

可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。

浏览器兼容性如何?

支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。

怎么修改动画参数?

直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核