You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用键盘导航时如何获取按钮的x、y坐标以正确渲染下拉菜单

解决方案

你不需要依赖鼠标事件的坐标来处理所有场景,优先读取触发元素自身的DOM位置即可覆盖键盘触发的场景,同时可以和右键跟随鼠标的场景做逻辑区分:

核心思路

不管是鼠标点击图标还是键盘回车触发点击事件,都可以通过绑定事件的元素本身的位置来定位下拉菜单,仅在右键触发需要跟随鼠标的场景下读取鼠标坐标即可。

代码实现

修改你的handleOnClick处理函数:

handleOnClick = (e) => {
  let menuX, menuY;

  // 右键触发需要跟随鼠标的场景,读取鼠标坐标
  if (e.type === "contextmenu") {
    menuX = e.clientX;
    menuY = e.clientY;
  } else {
    // 点击图标/键盘触发的场景,读取触发元素的位置
    const triggerElement = e.currentTarget;
    const rect = triggerElement.getBoundingClientRect();
    // 可根据业务需求调整定位规则,示例为定位在图标下方左对齐
    menuX = rect.left;
    menuY = rect.bottom;
    // 如果需要相对文档的绝对定位,可以加上页面滚动距离
    // menuX = rect.left + window.scrollX;
    // menuY = rect.bottom + window.scrollY;
  }

  // 后续用menuX、menuY渲染下拉菜单即可
}

注意事项

  • 必须使用e.currentTarget而非e.target:前者永远指向你绑定事件的<Icon>元素,后者可能指向Icon内部的子元素,导致获取的位置出现偏差
  • 该方案会自动适配键盘触发场景:键盘触发点击事件时e.currentTarget依然可用,不会出现坐标缺失的问题

内容的提问来源于stack exchange,提问作者RichaS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:54:06