Опубликовано: 20 марта 2025 г.
Если вы хотите разрешить пользователю вводить информацию в виде открытого текста, вашим первым побуждением может быть использование <textarea> . Это работает во многих случаях и не требует особых усилий для работы с формами, но также имеет ограничения.
Одним из примеров является динамическое увеличение <textarea> вместе с содержимым без необходимости взлома . Существует field-sizing: content , но он имеет ограниченную поддержку браузеров. Здесь на помощь приходит комбинация значений атрибута contenteditable="plaintext-only" . Вы можете добавить ее к общим элементам, таким как <div> , и элемент автоматически позаботится об изменении размера.
Еще одним ограничением является стиль. API Custom Highlight CSS предоставляет механизм для стилизации произвольных текстовых диапазонов в документе с использованием JavaScript для создания диапазонов и CSS для их стилизации. <textarea> внутренне использует <div> в теневом корне пользовательского агента, поэтому стилизация текста с помощью CSS Custom Highlight API не работает. Если вы используете его непосредственно в элементе типа <div> , который вы сделали contenteditable , CSS Custom Highlight API работает нормально.
<style>
::highlight(highlight) {
background-color: yellow;
color: black;
}
</style>
<div contenteditable="plaintext-only">Edit me</div>
<script>
const parentNode = document.querySelector('div').firstChild;
const range = new Range();
range.setStart(parentNode, 0);
range.setEnd(parentNode, 3);
const highlight = new Highlight(range);
CSS.highlights.set('highlight', highlight);
</script>

Вот скриншот демо-версии , которая показывает это ограничение. Обратите внимание, что текст в <textarea> не стилизован, а текст в двух contenteditable общих элементах <div> стилизован.
