role="tooltip"需配合aria-describedby生效,目标元素须可见、有可读文本且aria-hidden="false";定位用getBoundingClientRect();移动端用focusin/focusout替代mouseenter/mouseleave;气泡应挂载到body避免overflow:hidden裁剪。

role="tooltip" 必须搭配 aria-describedby 才生效
单独写 role="tooltip" 不会让屏幕阅读器读出内容,它只是个语义标记。真正触发播报的是 aria-describedby 指向一个 ID,而那个 ID 对应的元素必须同时满足:存在、非 display: none、有可读文本(不能纯空格或 aria-hidden="true")。
常见错误: 用 实操建议: iOS Safari 和部分 Android 浏览器里, 关键点: 把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。 气泡突然从中间被砍掉?90% 是因为父容器设了 两个有效解法,选其一即可: 别试图用 —— 如果这个 display: none 或 opacity: 0 但没加 aria-hidden="true",部分读屏器会提前读出来;如果加了 aria-hidden="true" 又没在显示时动态移除,就完全不读。
aria-hidden="false"(或直接删掉该属性),且 display 或 visibility 为可见状态aria-hidden="true" + display: none(或 visibility: hidden),避免焦点或读屏干扰opacity: 0 单独控制显隐——读屏器仍会扫描并播报JS 定位气泡必须避开 offsetParent 的陷阱
getBoundingClientRect() 获取触发元素位置最可靠,但直接套用 top/left 值到气泡上常导致偏移。原因在于:如果触发元素父级有 transform、perspective 或 filter,它的 offsetParent 就不是最近的 position: relative 元素,而是 body,此时用 offsetTop/offsetLeft 会错。
element.getBoundingClientRect(),它返回视口坐标,不受 CSS 变换影响bottom 边 + 间距为 Y 起点,用 left + width / 2 居中 X 轴scroll 事件并重定位;更稳妥的做法是把气泡挂到 document.body 下,避免被局部 overflow: hidden 裁剪移动端点击后气泡消失太快?focusin/focusout 比 mouseenter/mouseleave 更稳
mouseenter 在触摸设备上行为不可靠:点一下触发,手指抬起立刻 mouseleave,气泡闪退。改用 focusin/focusout 能保持焦点态,直到用户点别处或按 Tab 键离开。
tabindex="0"(按钮、链接默认可聚焦,但 等需手动加)focusin 显示气泡,focusout 隐藏;但要注意 focusout 会在气泡内部点击时也触发——得用 relatedTarget 判断是否移出了整个 tooltip 区域Tab 进入/离开时,同样走这套逻辑,天然支持无障碍z-index 和 overflow:hidden 冲突时,气泡被裁切的解法很直接
overflow: hidden,而气泡用了 position: absolute 但没脱离该容器的剪裁边界。
appendChild 到 document.body,彻底脱离原 DOM 层级(推荐,尤其当触发元素嵌套深时)overflow: hidden 的祖先加 overflow: visible !important —— 但可能破坏原有布局,慎用z-index 强行盖过,overflow: hidden 的裁剪发生在绘制阶段,z-index 再高也没用。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










