为什么 Range.getBoundingClientRect() 对于文本区域内的范围返回 0?

dir*_*lik 6 html javascript css range getboundingclientrect

我有<textarea>元素并在其中创建范围:

  • 通过创建新范围document.createRange()
  • <textarea>获取via的唯一子节点textarea.childNodes[0]
  • range.setStart通过和设置范围开始和范围结束range.setEnd

然后我打电话range.getBoundingClientRect()

let textarea = document.querySelector('textarea');
let node = textarea.childNodes[0];

let range = document.createRange();
range.setStart(node, 3);
range.setEnd(node, 5);
console.log(range.getBoundingClientRect());
Run Code Online (Sandbox Code Playgroud)
<textarea>aa bb cc</textarea>
Run Code Online (Sandbox Code Playgroud)

但我收到ClientRect全零字段的对象,即left = top = width = height = 0. 为什么这些字段为零?


<textarea>请注意,如果我用普通的 div替换,一切正常:

let textarea = document.querySelector('div');
let node = textarea.childNodes[0];

let range = document.createRange();
range.setStart(node, 3);
range.setEnd(node, 5);
console.log(range.getBoundingClientRect());
Run Code Online (Sandbox Code Playgroud)
<div>aa bb cc</div>
Run Code Online (Sandbox Code Playgroud)

gue*_*314 3

<textarea>是一个替换元素

使用 CSS content 属性插入的对象是匿名替换元素。它们是“匿名的”,因为它们不存在于 HTML 标记中。

  • 这似乎不太准确?该页面上的任何地方都没有提到“&lt;textarea&gt;”,它与任何提到的元素也没有任何相似之处,也与 CSS“content”没有任何关系。事实上,“&lt;textarea&gt;”内容直接作为文本节点包含在文档中,并且可以像文档的任何其他部分一样进行查询和选择。如果有什么原因的话,那就不是这个了。 (2认同)