Balloon.css 纯 CSS 提示工具(Tooltip)实战指南:零 JavaScript、仅靠 CSS 实现悬浮气泡提示
前端UI组件【免费下载链接】balloon.cssSimple tooltips made of pure CSS项目地址https://gitcode.com/gh_mirrors/ba/balloon.css点击查看免费下载Balloon.css 是一个以纯 CSS 实现 Tooltip为核心理念的轻量级开源库它不依赖任何 JavaScript只要在元素上添加aria-label与data-balloon-pos属性就能获得带箭头、带动画的悬浮提示气泡。本文将以仓库 readme.md 为主体脉络结合 src/balloon.scss、src/_mixins.scss、src/_variables.scss 等源码与 test.html 演示页完整讲解安装引入、八个方向定位、程序化显示、动画控制、CSS 变量定制、富文本内容以及底层的伪元素与边框箭头实现原理让你既能直接上手也能深入理解其工作机制。Balloon.css 是什么Balloon.css 的核心卖点正如项目描述所写——Simple tooltips made of pure CSS纯 CSS 制作的简单提示气泡。它具备以下显著特点完全不需要 JavaScript提示的显示、隐藏、定位、动画全部由 CSS 完成只是给元素打上aria-label和data-balloon-pos两个属性体积极小根据 readme 说明minified 压缩后仅约1.1KBBrotli 压缩后直接复用无障碍属性提示文字取自aria-label兼顾了屏幕阅读器语义MIT 协议开源仓库根目录提供 LICENSE 文件当前仓库对应版本为1.2.0见 package.json。它的适用场景非常典型按钮、图标、链接等元素上的简短解释说明在悬停hover或聚焦focus时弹出无需为这一小功能引入动辄几十 KB 的 JS 工具库。快速安装与引入方式一npm 安装npm install balloon-css安装后有两种引入方式。第一种是直接在 JS 入口中引入打包好的 CSS适用于 Webpack 等打包器// Your index.js file, etc. import balloon-css;第二种是在使用 SASS/SCSS 的项目中引入源码注意这里的src/balloon指向的是 src/balloon.scss/* Your main.scss file, etc. */ import ~balloon-css/src/balloon方式二CDN 引入如果不使用 npm可以直接用 unpkg 的 CDN 版本该地址始终指向最新版本!-- This link will always fetch the latest version of Balloon.css -- link relstylesheet hrefhttps://unpkg.com/balloon-css/balloon.min.css方式三手动下载从本仓库下载构建产物 balloon.min.css或未压缩的 balloon.css放到项目目录后引入link relstylesheet hrefpath/to/balloon.min.css提示balloon.css与balloon.min.css都是通过node-sass从 SASS 源码构建出来的生成文件参见 package.json 中的build脚本两者内容一致仅压缩程度不同日常使用引入任一个即可。基础用法用>button aria-labelWhats up!>[data-balloon-pos^up] { :before, :after { bottom: 100%; transform-origin: top; transform: translate(0, var(--balloon-move)); } :after { margin-bottom: $balloon-arrow-size 5px; } }程序化显示data-balloon-visible默认情况下提示只在:hover或:focus时出现但如果你希望在没有用户交互时也显示提示例如引导新手、默认展示某项说明可以给元素添加data-balloon-visible属性button aria-labelWhats up!>:hover, [data-balloon-visible], :not([data-balloon-nofocus]):focus { :before, :after { opacity: 1; pointer-events: none; } }注意这里还隐藏了一个配套特性如果只想让提示在 hover 时显示、不希望聚焦focus也触发可以在元素上添加data-balloon-nofocus属性它是 readme 未展开说明、但源码明确支持的细节能力。pointer-events: none保证气泡本体不会拦截鼠标事件。禁用动画data-balloon-blunt如果某些场景不需要过渡动画例如追求极简、或在特定布局下动画会引起跳动只需添加data-balloon-blunt属性button>/* Add this to your CSS */ .tooltip-red { --balloon-color: red; } .tooltip-big-text { --balloon-font-size: 20px; } .tooltip-slide { --balloon-move: 30px; }配合 HTMLbutton aria-labelI am red!>/* All tooltips would now be square and blue */ :root { --balloon-border-radius: 0; --balloon-color: blue; }由于 CSS 变量具备继承特性在任意中间容器上声明同样会生效——这也意味着你可以为某个页面区块整体换肤而无需逐元素打类名。富文本内容HTML 字符、Emoji 与图标字体提示文字取自aria-label因此理论上可以放入任意 HTML 实体字符甚至 Emojibutton aria-labelHTML special characters: #9787; #9986; #9820;>button classfa aria-labelFont Awesome: #xf030; #xf133; #xf1fc; #xf03e; #xf1f8;>.font-awesome:after { font-family: FontAwesome, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Open Sans, Helvetica Neue, sans-serif; }在 test.html 的 Glyphs and Icon Fonts 演示段中可以看到对应的完整示例。源码级进阶长文本、换行与更多隐藏属性readme 主要面向基础使用但源码中还包含一批隐藏能力可以在不引入任何新依赖的情况下解决长文本场景data-balloon-length控制气泡宽度默认气泡是white-space: nowrap单行显示的过长的文本会撑爆布局。data-balloon-length提供 5 档固定宽度见 src/balloon.scss取值气泡宽度small80pxmedium150pxlarge260pxxlarge380px屏幕宽度 ≤ 768px 时自动降为90vwfit100%撑满宿主元素宽度button>[data-balloon-break] { :after { white-space: pre; } [data-balloon-length] { :after { white-space: pre-line; word-break: break-word; } } }无障碍与兼容性细节源码中还包含了三个看不见但很有用的处理键盘可达性[aria-label][data-balloon-pos]在获得焦点:focus时同样显示气泡除非加了data-balloon-nofocus键盘用户也能获得提示IE 11 修复button[aria-label][data-balloon-pos] { overflow: visible; }专门修复 IE 11 中按钮默认样式导致气泡被裁剪的问题src/balloon.scssiOS Safari 修复为带提示的元素设置cursor: pointer规避 iOS Safari 上点击事件无法触发的问题源码注释中给出了原由。工作原理纯 CSS 的秘密整个库的实现只依赖一个属性选择器和两个伪元素这是它体积能做到 1.1KB 的根本原因。1. 内容来源attr(aria-label)。气泡正文由::after伪元素承载其content直接取用宿主元素的aria-labelsrc/balloon.scss因此 HTML 结构零冗余:after { include base-effects(); include normalized-text(); background: var(--balloon-color); border-radius: var(--balloon-border-radius); content: attr(aria-label); padding: .5em 1em; position: absolute; white-space: nowrap; z-index: 10; }2. 箭头经典边框三角形。箭头由::before承载借助arrow($direction)mixinsrc/_mixins.scss生成把元素宽高设为 0设置 5px 的透明边框再单独给某一侧上色就形成了指向任意方向的三角形。方向与着色边的映射关系用 Sass Map 维护$ARROW_DIRECTIONS: ( down: top, up: bottom, left: right, right: left, ); mixin arrow($direction) { if not map-has-key($ARROW_DIRECTIONS, $direction) { error [balloon] The $direction parameter must be one of: ...; } width: 0; height: 0; border: $balloon-arrow-size solid transparent; border-#{map-get($ARROW_DIRECTIONS, $direction)}-color: var(--balloon-color); }比如上方位置的气泡箭头着色边是top箭头朝上down位置则调用arrow(up)着色边是bottom箭头朝下。箭头与气泡背景统一使用var(--balloon-color)保证换色时两者始终一致。3. 动画透明度过过渡 位移。base-effects()mixinsrc/_mixins.scss为气泡和箭头统一设置初始opacity: 0、pointer-events: none并以0.18s ease-out 0.18s过渡透明度和位移显示时位移量由--balloon-move变量控制不同方向用translate/calc(var(--balloon-move) * -1)处理正向与反向滑动形成浮现 滑入的柔和动效。4. 整体接线。宿主元素只需position: relative气泡与箭头绝对定位在它周围配合各方向的left/right/top/bottom与margin箭头尺寸 5px 间距完成贴合。整个逻辑串联在 src/balloon.scss 这一份文件中结构非常清晰。本地演示与测试仓库根目录自带了 test.html它引入本地balloon.min.css并覆盖了所有核心能力的分节演示Positioning8 个方向逐一展示Lengthsmall/medium/large/xlarge/fit五档宽度对比Disabling animationdata-balloon-blunt示例Showing tooltips programaticallydata-balloon-visible示例Customizing Tooltips.tooltip-red、.tooltip-big-text、.tooltip-slide三个定制类示例Glyphs and Icon Fonts特殊字符、Emoji 与 Font Awesome 示例。克隆仓库后直接用浏览器打开该文件或配合本地静态服务器访问即可在一个页面里完整验证本文涉及的全部特性。参与贡献与构建流程Balloon.css 的源码以 SASS.scss维护readme 给出如下开发流程克隆仓库git clone https://github.com/kazzkiq/balloon.css.git安装依赖npm install修改 SASS 源码后执行npm run build生成生产环境 CSS在网站gh-pages分支上验证生成文件无误后再提交 Pull Request。需要特别留意的是 readme 中的两条注意点务必修改 SASS 源码即 src/balloon.scss 及其引入的 _variables.scss、_mixins.scss而不是直接改生成的balloon.css/balloon.min.css——因为它们在每次构建时都会被覆盖构建命令定义在 package.json 中scripts: { build: node-sass src/balloon.scss ./balloon.css node-sass src/balloon.scss ./balloon.min.css --output-style compressed, prepublishOnly: npm run build }即先用node-sass生成未压缩版再用--output-style compressed生成压缩版开发依赖为node-sass ^4.14。小结Balloon.css 用极小的代价约 1.1KB minified Brotli、零 JavaScript解决了 Web 开发中高频的 Tooltip 需求data-balloon-pos负责 8 向定位data-balloon-visible支持程序化常显data-balloon-blunt一键去动画CSS 变量体系覆盖颜色、字号、圆角与位移的定制data-balloon-length/data-balloon-break则补齐了长文本场景。配合 src/balloon.scss 中::after气泡 ::before箭头 attr(aria-label)内容的精简实现你可以快速把它接入现有项目也能在需要时读懂并二次定制它。赞分享前端UI组件【免费下载链接】balloon.cssSimple tooltips made of pure CSS项目地址https://gitcode.com/gh_mirrors/ba/balloon.css点击查看免费下载相关推荐纯CSS工具提示实现无需JavaScript的悬浮提示框终极指南纯CSS工具提示实现无需JavaScript的悬浮提示框终极指南 你是否曾经想过不写一行JavaScript代码也能实现漂亮的悬浮提示框 在 You前端示例工程You-Dont-Need-JavaScript工具提示纯CSS实现信息提示气泡的完整指南You Dont Need JavaScript工具提示纯CSS实现信息提示气泡的完整指南 还在为网页添加JavaScript工具提示而烦恼吗 You前端示例工程Mermaid Live Editor免费在线图表编辑器的5分钟快速上手指南Mermaid Live Editor免费在线图表编辑器的5分钟快速上手指南 还在为复杂的图表制作工具而烦恼吗想要一个简单、免费且功能强大的图表编辑器吗前端开发者工具数据可视化上一篇SpotiFLAC下载文件质量验证使用专业工具检测FLAC文件的真实性下一篇解决Ant Design Pro v6安装依赖失败及空白页面问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

C语言指针动态内存管理:从malloc到内存泄漏实战排查

C语言指针动态内存管理:从malloc到内存泄漏实战排查

C语言里,指针动态内存的申请和释放,是我在排查一个线上问题后彻底想清楚的事。当时某个服务端模块跑上几天就崩溃,内存占用一路上涨,最后在一个看似毫不相关的地方段错误退出。用工具定位之后,发现根因就是某个错误处理…

2026/10/15 2:06:13 阅读更多 →
foobox-cn:5步装好foobar2000中文DUI皮肤,含组件集成

foobox-cn:5步装好foobar2000中文DUI皮肤,含组件集成

foobox-cn:5步装好foobar2000中文DUI皮肤,含组件集成 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn foobox-cn 是 foobar2000 的 DUI 皮肤配置,基于 JSplitter 组…

2026/10/15 2:06:13 阅读更多 →
Vale 基准测试实战:从 bench.md 看 Markdown 散文检查的性能保障体系

Vale 基准测试实战:从 bench.md 看 Markdown 散文检查的性能保障体系

开发工具代码质量CLI 【免费下载链接】vale :pencil: A markup-aware linter for prose built with speed and extensibility in mind. 项目地址: https://gitcode.com/gh_mirrors/va/vale 点击查看 免费下载 bench.md 是 Vale(一个面向散文的 markup-a…

2026/10/15 2:06:13 阅读更多 →

最新新闻

Electron + Vue 项目结构搭建:主进程、渲染进程与IPC通信实践

Electron + Vue 项目结构搭建:主进程、渲染进程与IPC通信实践

我最早是在做一个后台管理系统的时候碰上了 Electron。当时需求很明确:系统本身是 Vue 写好的网页,但客户希望在 Windows 桌面上能直接双击打开、离线可用、还能调用一些浏览器里做不了的系统能力,比如文件拖拽和本地目录读写。如果单独做一套…

2026/10/15 2:49:27 阅读更多 →
生成函数在算法竞赛中的应用:解锁计数与递推难题

生成函数在算法竞赛中的应用:解锁计数与递推难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 2:49:27 阅读更多 →
ASM1083数据表解读:PCIe转PCI桥片硬件设计与调试指南

ASM1083数据表解读:PCIe转PCI桥片硬件设计与调试指南

简介:ASM1083 PCIe转PCI芯片数据表面向硬件工程师、嵌入式开发者与主板维修人员,用于解决PCIe接口与传统PCI设备之间的桥接设计问题。该芯片由ASMedia出品,支持x1至x16多种PCI Express lanes,数据传输速率最高2.5Gb/s,…

2026/10/15 2:49:27 阅读更多 →
JUnitCore方法级运行为何比类级更慢?揭秘Runner生命周期开销

JUnitCore方法级运行为何比类级更慢?揭秘Runner生命周期开销

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 2:49:27 阅读更多 →
U8g2单色屏图形库应用笔记:移植、中文显示与刷新提速

U8g2单色屏图形库应用笔记:移植、中文显示与刷新提速

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 2:49:27 阅读更多 →
ESXi 升级到 8.0 后 VM 快照删不掉?一篇讲透 “in progress“ 死循环的 3 种解法

ESXi 升级到 8.0 后 VM 快照删不掉?一篇讲透 “in progress“ 死循环的 3 种解法

本文适用版本:ESXi 7.0 U3 → 8.0 U2 升级场景(vSphere 6.7 升级也会遇到) 阅读时长:约 8 分钟 难度:⭐⭐⭐(操作不可逆,生产 VM 强烈建议先备份再动)一、为什么写这篇文章?最近私信里又有几位网友问:ESXi 7.0 升到 8.0 之后,VM 的快照怎么都删不掉,vSphere Client 里一直显示…

2026/10/15 2:48:27 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →