Andrew K, можно перед <span> добавить пробел нулевой ширины... (Правда, когда уже есть текст, то курсор ставится перед текстом, а не элементом, но я думаю идея понятна)
<button id="btn">Поставить курсор до <span></button>
<script>
const zws = document.createTextNode("\u200B");
btn.onclick = () => {
let span = document.querySelector("span"),
selection = document.getSelection(),
range = new Range();
span.before(zws);
range.setStartBefore(zws);
selection.removeAllRanges();
selection.addRange(range);
};
</script>
<style>
span { background: orange; }
</style>
<div contenteditable="true"><span>PDF</span></div>