Это не идеально, но мне удалось заставить что-то работать в качестве доказательства концепции, обратите внимание, что для значка используется FontAwesome.
https://codepen.io/martincarlin87/pen/GaQmxe
HTML
<div>
<input type="text" id="test">
<span>edit <i class="fas fa-edit"></i></span>
</div>
JS
document.getElementById('test').addEventListener('keydown', handleInput);
document.getElementById('test').addEventListener('keyup', handleInput);
function handleInput(e) {
if (document.getElementById('test').value != '') {
let caretPosition = e.target.selectionStart;
let newCaretPosition = ((caretPosition * 10) + 1) + 15;
console.log('Caret at: ', caretPosition);
document.querySelector('div > span').style.display = 'inline-block';
document.querySelector('div > span').style.left = `${newCaretPosition}px`;
} else {
document.querySelector('div > span').style.display = 'none';
document.querySelector('div > span').style.left = `15px`;
}
}
вычисление левой позиции требует немного работы, может быть проще просто использовать длину значения вместо позиции каретки.
Сначала я попробовал псевдоэлемент, но он не может быть добавлен к входам, следовательно, к контейнеру div, но затем оказывается, что вы не можете легко изменить их стили с помощью JavaScript, поэтому вместо этого применил элемент span.