La combinación de valores de atributos "texto sin formato" y "editable por el usuario" ahora está disponible como modelo de referencia

Fecha de publicación: 20 de marzo de 2025

Cuando quieras permitir que el usuario ingrese información de texto sin formato, tu primer instinto podría ser usar un <textarea>. Esto funciona en muchos casos y no requiere ningún esfuerzo especial para que funcione con formularios, pero también tiene limitaciones.

Un ejemplo es aumentar <textarea> de forma dinámica con el contenido sin recurrir a trucos. Existe field-sizing: content, pero tiene compatibilidad limitada con los navegadores. Aquí es donde entra en juego la combinación de valores del atributo contenteditable="plaintext-only". Puedes agregarlo a elementos genéricos, como <div>, y hacer que el elemento se encargue automáticamente de cambiar el tamaño.

Otra limitación es el diseño. La API de Custom Highlight de CSS proporciona un mecanismo para aplicar diseño a rangos de texto arbitrarios en un documento con JavaScript para crear los rangos y CSS para aplicarles diseño. Un <textarea> usa internamente un <div> en la raíz de sombra del usuario-agente, por lo que no funciona aplicar diseño al texto con la API de Custom Highlight de CSS. Si se usa directamente en un elemento como un <div> que creaste como contenteditable, la API de CSS Custom Highlight funciona bien.

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

Panel de elementos de las Herramientas para desarrolladores de Chrome que inspecciona un textarea que muestra que usa un div en un raíz en sombra de usuario-agente.

Esta es una captura de pantalla de la demo que muestra esta limitación. Ten en cuenta que el texto en <textarea> no tiene diseño, pero el texto en los dos elementos <div> genéricos de contenteditable sí.

Demostración que muestra cómo la API de CSS Custom Highlight solo funciona con los elementos div de contenteditable, pero no con textarea.