A combinação de valor do atributo contenteditable "plaintext-only" agora está disponível como referência

Publicado em 20 de março de 2025

Quando você quer permitir que o usuário insira informações em texto simples, seu primeiro instinto pode ser usar um <textarea>. Isso funciona para muitos casos e não requer esforço especial para funcionar com formulários, mas também tem limitações.

Um exemplo é aumentar o <textarea> dinamicamente com o conteúdo sem recorrer a hacks. Há o field-sizing: content, mas ele tem suporte limitado a navegadores. É aqui que entra a combinação de valores de atributo contenteditable="plaintext-only". Você pode adicionar esse recurso a elementos genéricos, como <div>, e fazer com que o elemento se redimensione automaticamente.

Outra limitação é o estilo. A API CSS Custom Highlight oferece um mecanismo para definir o estilo de intervalos de texto arbitrários em um documento usando JavaScript para criar os intervalos e CSS para definir o estilo deles. Um <textarea> usa internamente um <div> na raiz de sombra do agente do usuário. É por isso que o estilo do texto com a API CSS Custom Highlight não funciona. Se for usada em um elemento como um <div> diretamente que você tenha feito contenteditable, a API CSS Custom Highlight vai funcionar normalmente.

<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>

Painel &quot;Elements&quot; do Chrome DevTools inspecionando um textarea mostrando que ele está usando uma div em uma raiz de sombra do user agent.

Confira uma captura de tela da demonstração que mostra essa limitação. Observe que o texto no <textarea> não tem estilo, mas o texto nos dois elementos <div> genéricos contenteditable tem.

Demonstração mostrando como a API CSS Custom Highlight só funciona com os elementos div contenteditable, mas não com o textarea.