Редактируемый контент «только для открытого текста»; Комбинация значений атрибутов теперь является базовой версией. Недавно доступно.

Опубликовано: 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>

Панель Chrome DevTools Elements проверяет текстовую область, показывая, что она использует div в теневом корне пользовательского агента.

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

Демонстрация, показывающая, как API Custom Highlight API работает только с редактируемыми элементами div, но не с текстовой областью.