HTML 中不存在原生 toggle 事件,anchor-size() 等 CSS 锚点定位语法尚未被任何主流浏览器支持,真实可用的 toggle 与锚点联动方案必须依赖 JavaScript 获取锚元素尺寸并手动设置弹层样式。

toggle 事件根本不存在于 HTML 标准中
浏览器没有原生的 toggle 事件,你看到的所谓“toggle 事件”基本是以下三种情况之一:
• 框架封装(如 React 的 useState 切换触发的自定义逻辑)
• 第三方库模拟(比如 Bootstrap 的 Collapse 插件 emit 的 shown.bs.collapse)
• 开发者手动 dispatch 的 CustomEvent('toggle'),非标准、无跨浏览器保障
试图监听 toggle 作为 DOM 原生事件来驱动 CSS 锚点定位,会直接失败——因为事件压根不会被触发。
CSS 锚点定位目前不支持运行时响应式尺寸计算
即使你用 JS 模拟出 toggle 行为,也无法靠 anchor-size(--anchor, width) 动态读取锚元素尺寸:
• anchor-size() 函数未被任何稳定版浏览器实现(Chrome 130 / Firefox 129 / Safari 18 均标记为 “No support”)
• 它依赖的底层机制(anchor-name 注册、position-anchor、@position-try)全部处于草案冻结状态,无启用 flag 可用
• 所有声称“已跑通 anchor-size”的 CodePen 或博客示例,实际都是用 PostCSS 静态替换或硬编码数值伪造的,无法响应元素 resize 或 DOM 变更
真正能落地的 toggle + 锚点联动方案只有 JS 驱动
如果你需要点击按钮展开弹层,并让弹层尺寸/位置随锚点(比如按钮)实时变化,必须绕过 CSS 实验性语法,走 JS 路线:
• 用 getBoundingClientRect() 在每次 toggle 触发时读取锚元素尺寸和位置
• 手动设置弹层的 style.width、style.height、style.left、style.top
• 若使用 <div popover>,在 <code>beforetoggle 事件中同步调用 getBoundingClientRect() 并更新 style.transform
• 框架中可封装成 useAnchorRect(anchorRef) Hook,避免重复计算和内存泄漏
注意:不要在 resize 或 scroll 中高频调用该逻辑,加节流或用 ResizeObserver 替代
别把 :target 和 toggle 混为一谈
:target 是 URL hash 匹配机制,和 toggle 完全无关:
• 点击 <a href="#menu"></a> 会触发 #menu:target,但这是地址栏变更+滚动行为,不是状态切换
• 它不能控制弹层显隐,也不能响应 JS 中的布尔值翻转
• 如果你想要“点击按钮显示弹层”,请用 hidden 属性或 aria-expanded + class 切换,再配合 JS 计算位置
混淆这两者会导致样式失效、无障碍支持断裂、以及调试时完全找不到触发源
立即学习“前端免费学习笔记(深入)”;
真正的难点不在写法,而在判断“什么时候该放弃 CSS 锚点幻想,老老实实写三行 JS”。现在(2026年10月)所有生产环境中的 tooltip、dropdown、context menu,其尺寸对齐逻辑仍 100% 依赖getBoundingClientRect() ——不是因为不想用 CSS,而是因为没得选。



















