Introducción
Los efectos visuales en texto suelen ser desafiantes en CSS por la falta de selectores granulares como ::nth-letter(). Sin embargo, con propiedades existentes como letter-spacing, ::first-letter y ::first-line es posible crear efectos de revelado de texto funcionales y con buen rendimiento. La clave está en usar valores negativos de letter-spacing para superponer caracteres y luego animarlos hacia valores positivos, revelando el contenido progresivamente.
Esta técnica es útil para:
- Tooltips interactivos en interfaces de infraestructura
- Mensajes de carga o progreso
- Indicadores de estado animados
- Componentes UI accesibles sin JavaScript
Qué es y para qué sirve
El efecto se basa en tres principios CSS:
- Superposición de caracteres: Usar
letter-spacing: -1ch(o valores equivalentes) para reducir el espacio entre letras hasta que se solapen. - Ocultamiento visual: Combinar con
color: transparentpara esconder el texto superpuesto. - Revelado progresivo: Animar
letter-spacinghacia valores positivos (ej.0cho1ch) mientras se cambia el color a un valor visible.
La unidad ch (ancho del carácter «0») es ideal porque es relativa al ancho de la fuente actual, evitando cálculos manuales. Por ejemplo, -1ch reduce el espacio entre letras justo lo suficiente para que se solapen en la mayoría de fuentes monoespace o de ancho fijo.
Prerequisitos
Para seguir esta guía necesitas:
- Navegador moderno con soporte para:
letter-spacing (todos los navegadores modernos)– ::first-letter y ::first-line (Chrome, Firefox, Safari, Edge)
– Animaciones CSS (@keyframes o transiciones)
– La unidad ch (soportada desde hace años, pero verifica en navegadores legacy si es crítico)
- Editor de texto o IDE para editar HTML/CSS
- Conocimientos básicos de HTML y CSS (selectores, propiedades de texto)
- En IE11 no funciona
letter-spacingcon valores negativos en algunos casos. Si necesitas soporte legacy, considera polyfills o alternativas con transformaciones. - La unidad
chtiene soporte universal, pero en fuentes proporcionales (como Arial) el efecto puede variar ligeramente.
Guía paso a paso
Caso 1: Reveal de texto con checkbox interactivo
Objetivo: Crear un componente donde al marcar un checkbox se revele texto oculto mediante animación deletter-spacing.Paso 1: Estructura HTML
<div class="text-reveal-container">
<input type="checkbox" id="reveal-toggle" class="reveal-toggle">
<label for="reveal-toggle" class="reveal-label">
<span class="reveal-text reveal-text--hidden">Contenido oculto</span>
<span class="reveal-text reveal-text--visible">Contenido visible</span>
</label>
</div>Explicación:- Usamos dos
<span>dentro del<label>para separar el texto que se ocultará y el que se revelará. - El
inputes oculto visualmente pero funcional para el toggle.
Paso 2: Estilos base
.text-reveal-container {
position: relative;
display: inline-block;
}
.reveal-toggle {
position: absolute;
opacity: 0; /* Oculta el checkbox visualmente */
pointer-events: none; /* Evita interferencias con clics */
}
.reveal-label {
display: inline-block;
cursor: pointer;
font-family: monospace; /* Usamos monospace para consistencia con 'ch' */
font-size: 2rem;
white-space: nowrap;
overflow: hidden;
position: relative;
}
.reveal-text {
display: inline-block;
transition:
letter-spacing 0.4s ease,
color 0.4s ease;
}
.reveal-text--hidden {
letter-spacing: -2ch;
color: transparent;
}
.reveal-text--visible {
letter-spacing: 0ch;
color: #333;
}Resultado esperado:- El texto «Contenido oculto» está superpuesto y oculto.
- El texto «Contenido visible» es visible pero oculta al primero.
Paso 3: Activar el efecto con el checkbox
.reveal-toggle:checked ~ .reveal-label .reveal-text--hidden {
letter-spacing: 0ch;
color: #333;
}
.reveal-toggle:checked ~ .reveal-label .reveal-text--visible {
letter-spacing: -1.5ch;
color: transparent;
}Explicación:- Cuando el checkbox está marcado (
:checked), el texto oculto (reveal-text--hidden) revela su contenido. - Simultáneamente, el texto visible (
reveal-text--visible) se oculta superponiendo sus caracteres.
- Abrí la página en un navegador.
- Hacé clic en la etiqueta del checkbox.
- El texto «Contenido oculto» debería aparecer mientras «Contenido visible» desaparece.
Caso 2: Acrónimo que revela su significado al hacer hover
Objetivo: Mostrar el significado completo de un acrónimo al pasar el mouse, usandoletter-spacing y ::first-letter.Paso 1: Estructura HTML
<figure class="acronym-reveal">
<figcaption>
<span class="acronym-reveal__letter" aria-hidden="true">U</span>NICEF
</figcaption>
</figure>Explicación:- Cada letra del acrónimo está envuelta en un
<span>con clase.acronym-reveal__letter. - Usamos
aria-hidden="true"para asegurar accesibilidad (el lector de pantalla ignorará el carácter duplicado).
Paso 2: Estilos base
.acronym-reveal {
font-family: monospace;
font-size: 3rem;
text-align: center;
}
.acronym-reveal__letter {
display: inline-block;
letter-spacing: -1ch;
color: transparent;
transition: letter-spacing 0.3s ease, color 0.3s ease;
}
.acronym-reveal:hover .acronym-reveal__letter {
letter-spacing: 0ch;
color: #0056b3; /* Azul corporativo de UNICEF */
}Resultado esperado:- Al pasar el mouse, las letras superpuestas se separan y cambian de color.
Si querés simplificar el markup, podés usar ::first-letter para mantener visible la primera letra:
.acronym-reveal:hover {
letter-spacing: 0ch;
}
.acronym-reveal:hover::first-letter {
color: inherit; /* Mantiene el color original */
}Caso 3: Texto que se revela desde un borde específico
Objetivo: Crear un efecto donde el texto se revele desde el centro o la derecha, útil para mensajes de progreso.Paso 1: Estructura HTML
<div class="text-reveal text-reveal--center">
<span class="text-reveal__content">Procesando...</span>
</div>Paso 2: Estilos para revelado desde el centro
.text-reveal--center {
text-align: center;
font-family: monospace;
overflow: hidden;
position: relative;
display: inline-block;
}
.text-reveal__content {
display: inline-block;
letter-spacing: -3ch;
color: transparent;
transition:
letter-spacing 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55),
color 0.5s ease;
}
.text-reveal--center:hover .text-reveal__content {
letter-spacing: 0ch;
color: #2e7d32; /* Verde para "éxito" */
}Explicación:- El
letter-spacing: -3chsuperpone las letras en el centro. - Al hacer hover, las letras se separan desde el centro hacia afuera.
Paso 3: Versión para revelado desde la derecha
.text-reveal--right {
text-align: right;
}
.text-reveal--right .text-reveal__content {
text-indent: -1.5ch; /* Mueve el texto hacia la izquierda inicialmente */
}
.text-reveal--right:hover .text-reveal__content {
letter-spacing: 0ch;
text-indent: 0;
color: #c62828; /* Rojo para "error" */
}Verificación:- Pasá el mouse sobre el texto.
- Las letras deberían separarse desde el centro (versión center) o desde la derecha (versión right).
Consideraciones y buenas prácticas
Limitaciones y alternativas
- Precisión con fuentes proporcionales:
ch funciona mejor con fuentes monospace (ej. Courier New, Consolas).– Para fuentes proporcionales (ej. Arial, Helvetica), calibrá los valores de letter-spacing manualmente:
.text-reveal__content {
letter-spacing: -0.2em; /* Ajusta según la fuente */
}
- Rendimiento en animaciones:
will-change: letter-spacing, color para optimizar animaciones: .text-reveal__content {
will-change: letter-spacing, color;
}
– Evitá animar letter-spacing en elementos con transform o opacity en la misma timeline.
- Accesibilidad:
aria-hidden="true" en los caracteres superpuestos.– Proporcioná una alternativa textual si el efecto es puramente decorativo:
<span class="sr-only">Contenido oculto: Procesando...</span>
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
- Soporte en navegadores legacy:
letter-spacing negativo con transform: scaleX(-1) y direction: rtl (pero esto invierte el texto).– Usá @supports para aplicar estilos alternativos:
@supports not (letter-spacing: -1ch) {
.text-reveal__content {
transform: scaleX(-1);
direction: rtl;
}
}
Buenas prácticas para producción
- Animaciones suaves: Usá
cubic-bezier()para dar naturalidad al movimiento:
transition: letter-spacing 0.5s cubic-bezier(0.4, 0, 0.2, 1);
- Colores con suficiente contraste: Asegurate de que el texto revelado tenga un contraste mínimo de 4.5:1 con el fondo.
- Tiempos de animación: No superes los 500ms para efectos de revelado. Para UIs críticas (ej. errores), usá 200-300ms.
- Pruebas en diferentes fuentes: Verificá el efecto con fuentes como
Arial,Roboto Mono, yTimes New Romanpara asegurar consistencia.
Ejemplo avanzado: Combinación con ::first-line
Usá ::first-line para revelar solo la primera línea de un párrafo:
<p class="multi-line-reveal">
Esto es un párrafo largo<br>
que revela su primera línea al hacer hover.
</p>.multi-line-reveal {
font-family: sans-serif;
line-height: 1.5;
overflow: hidden;
}
.multi-line-reveal:hover::first-line {
letter-spacing: 0ch;
color: #1976d2;
}
.multi-line-reveal::first-line {
letter-spacing: -0.5ch;
color: transparent;
}Conclusión
Hemos explorado cómo aprovechar letter-spacing negativo y animaciones CSS para crear efectos de revelado de texto sin JavaScript. Las técnicas son:
- Superposición de caracteres con
letter-spacing: -Xch. - Ocultamiento visual con
color: transparent. - Revelado progresivo mediante animación de
letter-spacingy cambio de color.
Estos efectos son ideales para componentes dinámicos en dashboards de infraestructura, mensajes de estado, o interacciones minimalistas. La clave está en ajustar los valores de letter-spacing según la fuente y en probar la accesibilidad para asegurar que el contenido sea comprensible sin el efecto visual.
Experimentá con combinaciones de ::first-letter, ::first-line, y text-align para crear variantes como revelados desde el centro o bordes específicos. Recordá siempre priorizar el rendimiento y la accesibilidad en implementaciones productivas.
