获取textarea中文字的位置

获取textarea中某个文字的位置,
如新浪微博的输入框,输入一个@或#符号后,会自动调起popover层,这个层的位置显然是基于@或#符号的位置来计算的,
那么,如何获取@或#符号的位置呢(相对于body或textarea边框的偏移量)?

阅读 4k
2 个回答

大概思路是:

  1. 创建一个隐藏的div,样式textarea一样
  2. 当textarea内容发生变化,复制内容到div
  3. 添加一个inline-block到div
  4. 这个inline-block相对于div的位置就是popover所在的位置
<!DOCTYPE html>
<html>

<head>
    <title>Parcel Sandbox</title>
    <meta charset="UTF-8" />
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        #input {
            display: block;
            width: 100%;
            font-size: 16px;
        }
        #display {
            border: 1px solid red;
        }
        #text{
            white-space: pre;
        }
        #popover {
            display: inline-block;
            font-size: 16px;
        }
    </style>
</head>

<body>
    <textarea id="input"></textarea>
    <div id="display">
        <span id="text"></span>
        <div id="popover">popover</div>
    </div>
    <script>
        const input = document.querySelector("#input");
        const display = document.querySelector("#display");
        const text = document.querySelector("#text");
        const popover = document.querySelector("#popover");

        input.addEventListener("input", () => {
            text.textContent = input.value;
            setTimeout(() => {
                const displayRect = display.getBoundingClientRect();
                const popoverRect = popover.getBoundingClientRect();
                const left = popoverRect.left - displayRect.left;
                const top = popoverRect.top - displayRect.top;
                console.log(`left:${left}, top:${top}`);
            }, 0);
        });
    </script>
</body>

</html>

CodeSandbox

如果用textarea来实现,说实话非常难达到你的需求。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题