面试防线:公式智能提示层的光标位置跟随是如何实现的

面试官提问
“用户输入一个函数时,悬浮的智能提示框(IntelliSense)需要紧贴着光标出现。但是在复杂的滚动条嵌套和富文本 DOM 里,你是如何精准计算并实时更新这个提示框绝对定位(Absolute/Fixed 坐标)的?”

核心回答思路 (STAR法则)

  1. 业务痛点 (Situation)
    当编辑框内内容过多产生滚动,或者网页本身有滚动时。如果仅仅使用简单的相对父元素定位,悬浮提示框极容易发生被遮挡、位置错乱甚至飞出屏幕的尴尬问题。传统的获取 DOM 坐标的方式在复杂的富文本环境中极不可靠。

  2. 技术考量 (Task)
    必须能够精准获取当前打字光标(Caret)相对于视口(Viewport)的绝对屏幕坐标,并将这个坐标交给悬浮框。同时要考虑到边界碰撞检测(如果光标在屏幕底部,提示框应该向上弹而不是向下被截断)。

  3. 架构决策 (Action)

  • 底层坐标系统 API (coordsAtPos):我利用了 ProseMirror/Tiptap 提供的核心视图能力。在每一次键盘输入的 Transaction 派发后,调用 view.coordsAtPos(state.selection.from)。这个底层 API 能直接穿透复杂的 DOM 树,精准返回光标当前在视口上的绝对包围盒(getBoundingClientRect 等效的 top/left/bottom/right)。
  • 脱离 DOM 树层级 (Portal 传送门):拿到绝对坐标后,提示层组件绝不能挂载在编辑器内部。我使用了 React 的 createPortal,将提示框直接挂载到 document.body 的最顶层,彻底摆脱了复杂的 overflow: hiddenz-index 堆叠上下文陷阱。
  • 碰撞检测与动态定位 (借助第三方库体系):为了防止提示框飞出屏幕,我将拿到的绝对坐标交给专门的浮层计算库(如 @floating-ui/react 或 Popper.js)作为 Virtual Element。利用其内置的碰撞检测算法,自动判断如果下方空间不够,就翻转到光标上方显示。
  1. 业务价值 (Result)
    这套严丝合缝的坐标计算与浮层渲染机制,使得我们的公式编辑器在全屏、侧边栏、甚至弹窗 Modal 中,智能提示都能 100% 完美跟随光标,体验完全对标 VSCode 等专业级 IDE,极大提升了产品的工业级质感。