2026年,你终于可以在 `<textarea>` 里定位任意字符了
2026年8月,Chrome 152正式发布了 OpaqueRange API。这个API解决了一个困扰前端开发者十几年的问题:如何在 或
听起来很小,但你想想这个场景:用户在搜索框输入时,你想在光标下方弹出一个自动补全下拉框;用户在代码编辑器的
你想做一个带自动补全的搜索框。用户打字时,下拉建议框应该出现在光标正下方。听起来很简单对吧?
和
方案一:镜像元素(Mirror Element) 。在输入框下面隐藏一个完全一样的
方案二:隐藏 textarea + 可编辑div。放弃原生输入框,自己用 contenteditable 的div做一个“假输入框”,这样内部每个字符都是真实的DOM节点,可以随便定位。但这样做等于放弃了原生输入框的所有能力:输入法、撤销、自动填充、无障碍支持。
方案三:第三方库。引入 CodeMirror、Monaco 这样的编辑器库。但它们体积巨大(动辄几百KB),而且本质上也是用方案二实现的。
十几年了,前端开发者一直在用各种Workaround来模拟“输入框内的文本定位”。
OpaqueRange API 一次性解决了所有问题。
OpaqueRange 是一个新的 Web API,代表 或
“Opaque”的意思是“不透明的”——你不需要知道输入框内部是怎么渲染的,你只需要拿到这段文字在屏幕上的位置信息。
它不暴露输入框内部DOM结构。你拿不到输入框里的 ,你只拿到几何信息和高亮能力。这既保护了浏览器对输入框的渲染控制权,又给了开发者需要的能力。
createValueRange() 是新的方法,直接在 或
OpaqueRange 与 CSS Custom Highlight API 集成,可以对输入框内的文字应用自定义样式:
就这么简单。 不需要镜像元素,不需要隐藏的div,不需要第三方库。你直接告诉浏览器“我要索引3到8这段文字的位置和高亮”,浏览器就给你。
用户在搜索框打字时,建议列表应该出现在光标下方。以前只能靠镜像元素“猜”位置,现在可以直接用 createValueRange(caretIndex, caretIndex) 创建零长度的范围,拿到光标的精确坐标。
在
浏览器原生的拼写检查只能用红色波浪线。如果你想要自定义的拼写检查样式,或者集成第三方拼写检查服务,OpaqueRange 让你可以在任意文字范围上应用自定义高亮。
“在输入框的第42个字符下面弹出一个tooltip”——以前这几乎是不可能完成的任务。现在 getBoundingClientRect() 直接给你坐标,你只需要把弹窗定位到那个位置。
这是一个渐进增强的API。 在不支持的浏览器上,你可以降级到传统的镜像元素方案,或者直接跳过相关功能。它不会导致页面崩溃——createValueRange() 在不支持的浏览器上只是一个未定义的方法。
2026年,Microsoft Edge 团队还推出了 OpaqueRange API 的兄弟功能:
referenceTarget:让
aria-actions:让复合组件(比如带关闭按钮的标签页)可以把次要操作暴露给辅助技术。
WebMCP:让网站主动向 AI Agent 暴露结构化的工具和表单,Agent 不再需要“猜”页面怎么用。
来源:稀土掘金 原文