实现一个带有emoji选择面板的评论输入框,技术点其实挺琐碎的,但最让人头疼的反而不是面板动画,而是光标定位和编码一致性问题。简单拆解一下,把关键细节理清楚。

Emoji面板如何触发显示又不干扰输入焦点
点击emoji按钮弹出面板时,最怕的就是光标跑掉——用户正打着字,面板一弹,焦点丢了,后续输入全乱套。这里有个窍门:不让面板去抢焦点,而是让面板“隐身”地出现。具体做法包括几个要点:
- 面板容器用
role="region"配合aria-hidden="true"初始隐藏,展开时仅改aria-hidden="false",不调用focus(),避免焦点切换。 - emoji按钮设置
type="button",防止触发表单提交或默认行为。 - 每个表情图标用
button包裹,并加上tabindex="-1",这样键盘可达但不会挤入Tab导航流。 - 点击表情后,用
inputElement.setRangeText(emoji, start, end, "end")精准插入,光标自然落在插入点后面。
插入emoji时如何正确处理光标位置和中文输入法兼容性
如果直接用value += emoji,光标会被推到末尾,更麻烦的是在中文输入法下——比如正在输入“你好”,光标停在“你”后面,插入表情就会变成“你
