Можно ли предотвратить удаление этих дочерних элементов?
Нет, но есть альтернативное решение.
Демонстрация:
Поскольку у нас не может быть прямых потомков, нам нужно создать два отдельных элемента.
<div class="editor">
<label class="editor-label">You can't remove me</label>
<div class="editor-area" contentEditable="true"></div>
</div>
Затем мы удаляем label из потока, чтобы он не оказывал никакого влияния на area .
.editor {
border: solid 1px #CCC;
position: relative; // context for label
line-height: 1.5;
}
.editor-area {
min-height: 100px;
padding: 5px;
}
.editor-label {
position: absolute; // out of the flow
padding: 5px 0 0 5px;
user-select: none;
}
Наконец, чтобы каретка начиналась после текста label , нам нужно знать ее ширину и применить ее к значению area * text-indent
.
var editorLabel = document.querySelector('.editor-label');
var editorArea = document.querySelector('.editor-area');
var editorLabelRect = editorLabel.getBoundingClientRect();
editorArea.style.textIndent = editorLabelRect.width + 'px';
editorArea.innerHTML = ' ';
Полный код:
var editorLabel = document.querySelector('.editor-label');
var editorArea = document.querySelector('.editor-area');
var editorLabelRect = editorLabel.getBoundingClientRect();
editorArea.style.textIndent = editorLabelRect.width + 'px';
editorArea.innerHTML = ' ';
.editor {
border: solid 1px #CCC;
position: relative;
line-height: 1.5;
}
.editor-area {
min-height: 100px;
padding: 5px;
}
.editor-label {
position: absolute;
margin: 5px 0 0 5px;
user-select: none;
}
<div class="editor">
<label class="editor-label">You can't remove me</label>
<div class="editor-area" contentEditable="true"></div>
</div>