Maquetación modular de emails: creando bloques reutilizables

La maquetación modular de emails consiste en diseñar correos electrónicos a partir de bloques reutilizables, coherentes y fáciles de mantener. En lugar de crear cada newsletter desde cero, se construye un sistema de piezas que pueden combinarse entre sí: cabeceras, bloques hero, botones, tarjetas de contenido, módulos de producto, llamadas a la acción, separadores y footers.

Este enfoque, conocido también como modular email design, permite trabajar con más orden, reducir errores y mantener una identidad visual consistente en campañas, automatizaciones, newsletters y emails transaccionales. Y esto es especialmente importante en email development, donde las reglas no son las mismas que en una web tradicional.

Si vienes del desarrollo frontend, seguramente ya estás acostumbrada a pensar en componentes. En una aplicación web puedes tener botones, cards, layouts, formularios o banners reutilizables. En email ocurre algo parecido, aunque con una diferencia importante: los clientes de correo tienen muchas más limitaciones. Por eso, antes de aplicar directamente una lógica de componentes web, conviene entender bien las diferencias entre diseñar una web y diseñar un email.

En este artículo vamos a ver qué es la maquetación modular de emails, por qué merece la pena crear email components, qué bloques deberías tener en tu sistema y cómo trabajar de forma más escalable sin perder claridad ni control visual.

Qué es la maquetación modular de emails

La maquetación modular de emails es una metodología que organiza el diseño y el código de un correo electrónico en bloques independientes. Cada bloque tiene una función concreta dentro del mensaje y puede reutilizarse en diferentes campañas.

Por ejemplo, una newsletter puede estar formada por diferentes módulos:

  • un preheader,
  • una cabecera con logo,
  • un bloque hero,
  • una sección de artículos destacados,
  • una tarjeta de producto o recurso,
  • una llamada a la acción,
  • un footer legal.

La clave está en que cada parte no se diseña como una pieza aislada para una única campaña, sino como un componente reutilizable dentro de un sistema mayor.

Esto permite construir emails de forma más eficiente. En lugar de decidir desde cero cómo será cada sección, puedes partir de una biblioteca de bloques ya definidos, probados y documentados. Así, cada nueva campaña se convierte en un ejercicio de composición, no en una reinvención completa.

Esta lógica también encaja muy bien con herramientas como MJML. Si estás empezando con este framework, puede interesarte leer primero qué es MJML y por qué facilita la maquetación de emails responsive, ya que su sintaxis parte precisamente de una idea más declarativa y basada en componentes.

Por qué crear bloques reutilizables en email marketing

Crear bloques reutilizables no solo sirve para ahorrar tiempo. También mejora la consistencia, reduce errores y facilita el trabajo entre diseño, desarrollo y marketing.

Consistencia visual en todas las campañas

Cuando cada email se diseña desde cero, es fácil que aparezcan pequeñas diferencias: un botón con otro tamaño, un color ligeramente distinto, un espacio irregular entre secciones o una cabecera desactualizada.

Estas diferencias pueden parecer menores, pero afectan a la percepción de marca. Un sistema modular ayuda a que todos los emails mantengan una misma lógica visual. El usuario reconoce más rápido quién le escribe, qué tipo de contenido está leyendo y dónde debe prestar atención.

La coherencia no significa que todos los correos tengan que ser iguales. Significa que todos pertenecen al mismo universo visual. Puedes variar la composición, el mensaje o la jerarquía, pero manteniendo una base común.

Menos errores en producción

El HTML para email es delicado. Un margen mal aplicado, una tabla mal cerrada, una imagen sin ancho definido o una propiedad CSS poco compatible pueden romper el diseño en determinados clientes de correo.

Cuando trabajas con bloques ya probados, reduces ese riesgo. No tienes que volver a resolver los mismos problemas en cada campaña. Reutilizas estructuras que ya han sido revisadas, adaptadas y testeadas.

Esto es especialmente útil si trabajas con newsletters responsive. Si todavía estás definiendo tus primeras plantillas, te recomiendo complementar esta lectura con el artículo sobre cómo crear tu primera newsletter responsive con MJML.

Mayor velocidad de trabajo

Un sistema modular permite producir emails más rápido porque muchas decisiones ya están tomadas. No necesitas preguntarte cada vez cómo será el botón principal, qué espaciado debe tener una sección o cómo se estructura una tarjeta de contenido.

El equipo puede centrarse en el mensaje, la estrategia y la calidad del contenido. La base visual y técnica ya existe.

Esto no solo acelera la creación del email, también mejora las revisiones. Cuando todas las personas implicadas conocen los módulos disponibles, es más fácil detectar inconsistencias y proponer cambios concretos.

Mejor escalabilidad para equipos

En proyectos pequeños, una sola persona puede diseñar, maquetar, revisar y enviar una newsletter. Pero cuando el volumen crece, el sistema empieza a necesitar más orden.

Un enfoque modular facilita que varias personas trabajen con las mismas reglas. Diseño define los bloques, desarrollo los convierte en componentes estables y marketing los combina según el objetivo de cada campaña.

La modularidad también permite documentar mejor. No basta con tener una plantilla bonita. Conviene saber cuándo usar cada bloque, qué variantes existen, qué contenido admite y qué limitaciones tiene.

Plantilla de email vs sistema modular

Una plantilla de email suele resolver un caso concreto. Por ejemplo, una newsletter mensual, una promoción puntual o un email de bienvenida. Un sistema modular, en cambio, resuelve una familia de casos.

La diferencia es importante. Una plantilla responde a la pregunta: “¿Cómo diseño este email?”. Un sistema modular responde a una pregunta más estratégica: “¿Qué piezas necesito para construir muchos emails coherentes sin empezar siempre desde cero?”.

El problema de las plantillas rígidas

Una plantilla tradicional puede funcionar muy bien mientras el contenido encaja exactamente en su estructura. El problema aparece cuando necesitas una variante: una sección extra, una card más, un bloque sin imagen, un CTA secundario o una composición diferente en móvil.

En ese momento, empiezan los parches. Se duplica la plantilla, se modifica una sección, se cambia un espaciado y, poco a poco, aparecen versiones difíciles de mantener.

El resultado suele ser una biblioteca desordenada de archivos parecidos, pero no iguales. Y eso complica el mantenimiento.

La ventaja de un sistema modular

Un sistema modular permite trabajar con variantes controladas. Por ejemplo, puedes tener un bloque hero con imagen, otro solo con texto y otro con fondo destacado. También puedes tener una card simple para artículos y una card más completa para productos.

La idea no es tener infinitas posibilidades, sino un conjunto limitado de piezas bien pensadas.

Menos decisiones, más claridad

La maquetación modular también reduce la carga cognitiva del equipo. Cuando todo es posible, cada campaña exige demasiadas decisiones: qué estructura usar, cómo alinear el contenido, cuánto espacio dejar, qué estilo aplicar o qué tipo de botón elegir.

Con un sistema de bloques, muchas de esas decisiones ya están resueltas. Esto no limita la creatividad; la enfoca.

En email, donde la claridad pesa tanto, tener menos decisiones visuales puede convertirse en una ventaja. De hecho, este enfoque conecta muy bien con una idea clave de UX: priorizar la comprensión antes que la decoración. Puedes profundizar más en este punto en el artículo sobre UX en email marketing y claridad visual.

Componentes esenciales en un sistema modular de emails

Un buen sistema de email components debe cubrir las necesidades más frecuentes de comunicación. No hace falta empezar con una biblioteca enorme. De hecho, suele ser mejor comenzar con pocos bloques sólidos y ampliar el sistema según aparezcan nuevos casos reales.

Header o cabecera

La cabecera suele incluir el logo, una posible navegación reducida y, en algunos casos, un enlace a la versión web del email.

En email conviene mantenerla simple. Una navegación demasiado compleja puede no aportar demasiado valor y complicar la adaptación a móvil. Muchas veces, un logo bien colocado y una estructura limpia son suficientes.

Bloque hero

El hero es uno de los módulos más importantes en newsletters, campañas promocionales y lanzamientos. Suele incluir un titular principal, una entradilla, una imagen y una llamada a la acción.

Un hero modular puede tener varias versiones:

  • hero con imagen superior,
  • hero con imagen lateral,
  • hero solo texto,
  • hero con fondo de color,
  • hero con CTA principal y secundaria.

La prioridad debe ser siempre la comprensión rápida. En email no conviene esconder el mensaje principal detrás de una composición demasiado decorativa.

Bloques de texto editorial

Los bloques de texto son fundamentales para newsletters informativas, emails educativos o comunicaciones de marca. Deben tener una jerarquía clara: título, subtítulo opcional, párrafo y enlace.

Aquí la modularidad ayuda mucho. Puedes tener un bloque de introducción, un bloque de contenido largo, un bloque destacado y un bloque de cierre.

Cada uno cumple una función diferente dentro del email.

Botones y llamadas a la acción

El botón es uno de los componentes más importantes de cualquier email. Debe verse bien, tener suficiente contraste y ser fácil de pulsar en móvil.

En email, los botones no siempre se comportan igual que en web. A veces necesitan estructuras más robustas para funcionar correctamente en clientes como Outlook. Por eso es importante conocer las limitaciones reales del CSS en clientes de correo antes de diseñar componentes demasiado dependientes de estilos modernos.

Un sistema modular debería definir al menos:

  • botón primario,
  • botón secundario,
  • enlace textual,
  • CTA en bloque destacado.

Cards o tarjetas de contenido

Las cards son muy útiles para mostrar artículos, productos, recursos, eventos o recomendaciones. Una tarjeta puede incluir imagen, categoría, título, descripción breve y enlace.

Lo importante es que la card no dependa de un contenido perfecto. Debe soportar titulares de distinta longitud, imágenes con proporciones controladas y textos más o menos extensos.

Card simple y card compleja

Una card simple puede servir para newsletters editoriales: imagen, título y enlace. Una card más compleja puede funcionar mejor para ecommerce: imagen, nombre de producto, precio, descuento, descripción y botón.

No conviene usar la misma card para todo. La modularidad no significa forzar un único bloque universal, sino crear componentes adecuados para cada contexto.

Separadores y espaciadores

Aunque parezcan elementos menores, los separadores y espaciadores son clave en email. Ayudan a organizar la lectura, separar secciones y dar ritmo visual.

En diseño modular, el espaciado debe estar sistematizado. No tiene sentido que cada bloque invente sus propios márgenes. Una escala sencilla —por ejemplo, pequeño, medio y grande— suele ser suficiente.

El footer debe ser uno de los módulos más estables del sistema. Suele incluir información legal, enlaces de baja, dirección de la empresa, redes sociales y preferencias de suscripción.

Como se repite en casi todas las campañas, es uno de los primeros bloques que conviene convertir en componente reutilizable. Además, cualquier error en esta zona puede afectar a la confianza del usuario.

Cómo diseñar bloques reutilizables sin perder flexibilidad

Un error habitual al crear sistemas modulares es diseñar bloques demasiado rígidos. Otro error es hacerlos tan flexibles que dejan de tener criterio.

El equilibrio está en permitir variaciones útiles, pero dentro de límites claros.

Define la función de cada bloque

Cada módulo debe tener un propósito. Antes de diseñarlo, conviene preguntarse: ¿qué problema resuelve este bloque?

Un bloque hero presenta el mensaje principal. Una card resume contenido. Un testimonial aporta prueba social. Un separador organiza la lectura. Un CTA dirige a una acción concreta.

Cuando la función está clara, el diseño es más fácil de evaluar. Ya no se trata solo de si “queda bonito”, sino de si cumple su objetivo.

Crea variantes, no excepciones infinitas

Las variantes son útiles. Las excepciones infinitas, no.

Por ejemplo, puedes definir un módulo de CTA con tres versiones: una centrada, una con fondo destacado y otra más editorial con enlace textual. Eso es controlable.

Lo que no conviene es permitir que cada campaña cambie colores, tamaños, alineaciones, iconos y espaciados sin criterio. En ese punto, el sistema deja de ser sistema.

Diseña pensando en contenido real

Un bloque puede verse perfecto con un texto de prueba, pero romperse con contenido real. Por eso es importante probar los módulos con titulares largos, imágenes imperfectas, descripciones breves, precios, enlaces y textos traducidos.

El contenido real revela problemas que el diseño ideal no muestra.

En email esto es todavía más importante porque los espacios son limitados y el comportamiento responsive puede variar mucho. Si este tema te interesa, puedes revisar también el artículo sobre cómo hacer emails responsive sin volverte loca con tablas HTML.

Documenta el uso de cada componente

La documentación no tiene que ser enorme, pero sí clara. Cada bloque debería tener una pequeña guía de uso:

  • nombre del componente,
  • objetivo,
  • cuándo usarlo,
  • variantes disponibles,
  • límites de texto recomendados,
  • comportamiento en móvil,
  • notas de compatibilidad.

Esta documentación evita que el sistema dependa de la memoria de una sola persona y facilita la colaboración entre perfiles.

Desarrollo modular: HTML, MJML y workflows modernos

La maquetación modular no es solo una decisión de diseño. También afecta al flujo de desarrollo.

Modularidad con HTML tradicional

Se puede trabajar de forma modular con HTML tradicional, dividiendo el email en parciales o fragmentos reutilizables. Por ejemplo, puedes tener un archivo para la cabecera, otro para el footer y varios bloques para secciones concretas.

Este enfoque puede funcionar, pero requiere mucha disciplina. El HTML para email suele apoyarse en tablas, atributos inline y estructuras repetitivas. Si no hay una buena organización, el mantenimiento puede volverse pesado.

Modularidad con MJML

MJML facilita la creación de emails responsive porque permite escribir una sintaxis más limpia y después compilarla a HTML compatible con email. Esto encaja muy bien con la idea de trabajar por componentes.

Un bloque reutilizable en MJML podría representar una sección hero, una card de artículo o un CTA destacado. Después, esos bloques pueden combinarse para construir diferentes newsletters sin tener que escribir todo el HTML final a mano.

Si quieres profundizar en este flujo de trabajo, puedes leer también cómo integrar MJML en un workflow frontend moderno.

MJML o HTML tradicional: qué elegir

No existe una única respuesta. HTML tradicional puede ser suficiente para proyectos pequeños o plantillas muy controladas. MJML puede ser más cómodo cuando necesitas velocidad, claridad y una estructura más mantenible.

La decisión depende del equipo, del volumen de campañas y del nivel de personalización necesario. Si estás valorando ambas opciones, te puede ayudar esta comparativa sobre MJML vs HTML tradicional para emails.

Compatibilidad: el gran reto de los email components

Diseñar componentes para email no es igual que diseñar componentes para web. En email hay que tener muy presente el soporte desigual de HTML y CSS entre clientes de correo.

Esto afecta directamente a cómo se construyen los módulos. Un bloque puede verse perfecto en un cliente y comportarse de forma diferente en otro. Por eso, los componentes deben diseñarse con criterios de robustez, no solo de apariencia.

Evita depender demasiado de CSS moderno

Algunas propiedades CSS funcionan bien en ciertos clientes, pero fallan en otros. Por eso, en email conviene ser prudente con layouts complejos, posicionamientos avanzados, efectos visuales sofisticados o dependencias excesivas de estilos en el <head>.

Esto no significa que todos los emails tengan que ser planos o aburridos. Significa que la creatividad debe apoyarse en patrones seguros.

Si necesitas una visión más detallada de este punto, puedes consultar el artículo sobre qué partes de CSS funcionan realmente en email marketing.

Prioriza estructura, legibilidad y fallback

Un buen componente de email debe seguir siendo comprensible aunque no se vea exactamente igual en todos los clientes. Esta es una diferencia importante frente al diseño web más visual o interactivo.

El objetivo no debería ser que todos los clientes muestren una copia idéntica, sino que todos permitan entender el mensaje, reconocer la marca y completar la acción principal.

Testea los módulos, no solo las campañas

Una gran ventaja de la modularidad es que puedes testear componentes de forma aislada. Si un hero, una card o un botón ya han sido probados en distintos clientes, cada nueva campaña parte de una base más fiable.

Aun así, cada email final debe revisarse completo. La combinación de módulos también puede generar problemas: acumulación de espaciados, imágenes demasiado pesadas, CTAs repetidas o jerarquía confusa.

Maquetación modular y accesibilidad

La modularidad también puede mejorar la accesibilidad de los emails. Si defines correctamente la jerarquía de títulos, el contraste, los textos alternativos y las llamadas a la acción, cada módulo reutilizable parte de una base más inclusiva.

Por ejemplo, una card de contenido debería incluir una imagen con texto alternativo adecuado, un título claro y un enlace comprensible. Un botón no debería depender solo del color para transmitir importancia. Un bloque destacado debería mantener suficiente contraste entre texto y fondo.

Si cada componente ya contempla estos criterios, no tendrás que corregir los mismos errores en cada campaña. La accesibilidad se convierte en parte del sistema, no en una revisión de última hora.

Para ampliar esta parte, puedes leer el artículo sobre emails accesibles, contraste, jerarquía y lectores de pantalla.

Maquetación modular y carga cognitiva

La modularidad no solo beneficia al equipo que crea el email. También mejora la experiencia de quien lo lee.

Un email bien estructurado reduce la carga cognitiva porque permite entender rápidamente quién envía el mensaje, cuál es la idea principal, qué información es secundaria y qué acción se espera.

Cuando cada módulo tiene una función clara, la lectura se vuelve más fluida. La persona que recibe el email no tiene que interpretar una composición completamente nueva en cada envío. Reconoce patrones: aquí está el titular, aquí el contenido destacado, aquí la acción principal y aquí la información secundaria.

Jerarquía visual reutilizable

Los bloques reutilizables ayudan a mantener una jerarquía constante. Por ejemplo:

  • el hero comunica la idea principal,
  • las cards agrupan contenidos relacionados,
  • los destacados refuerzan una idea importante,
  • el CTA marca la acción prioritaria,
  • el footer recoge información secundaria.

Esta estructura facilita la lectura escaneada, muy habitual en email. Muchas personas no leen de forma lineal: abren, miran, deciden y actúan —o cierran— en pocos segundos.

Menos decoración, más intención

Un sistema modular también ayuda a evitar la decoración innecesaria. Si cada bloque tiene una razón de ser, es más difícil añadir elementos solo porque “queda vacío”.

En email, la claridad suele superar a la complejidad. Un diseño con menos ruido visual puede funcionar mejor que una composición muy elaborada pero difícil de entender.

Buenas prácticas para crear una biblioteca modular de emails

Crear bloques reutilizables no consiste solo en guardar trozos de código. Requiere criterio, organización y mantenimiento.

Audita tus emails actuales

Antes de crear nuevos módulos, revisa qué tipos de emails envías o necesitas enviar:

  • newsletters editoriales,
  • campañas promocionales,
  • emails transaccionales,
  • automatizaciones de bienvenida,
  • emails de recuperación,
  • lanzamientos,
  • comunicaciones internas.

Después, identifica patrones repetidos. Seguramente descubrirás que muchas campañas comparten estructuras similares.

Empieza con una biblioteca mínima viable

No hace falta crear veinte componentes desde el primer día. Una biblioteca inicial puede incluir:

  • header,
  • hero,
  • bloque de texto,
  • botón,
  • card,
  • sección de dos columnas,
  • bloque destacado,
  • separador,
  • footer.

Con estos bloques ya puedes construir muchas campañas. Más adelante podrás añadir módulos específicos para productos, eventos, cupones, testimonios, recursos descargables o preguntas frecuentes.

Usa nombres claros

El naming importa. Nombres como bloque-rosa-1 o seccion-nueva no ayudan a mantener un sistema.

Es mejor usar nombres relacionados con la función:

  • hero-principal,
  • card-articulo,
  • cta-destacado,
  • bloque-testimonial,
  • footer-legal,
  • separador-simple.

Esto facilita la comunicación entre diseño, desarrollo y marketing.

Diseña para móvil desde el principio

Gran parte de la lectura de emails ocurre en móvil. Por eso, los módulos deben pensarse con una lógica responsive clara: columnas que se apilan, botones cómodos de pulsar, textos legibles, imágenes optimizadas y jerarquía limpia.

Un bloque reutilizable que solo funciona bien en escritorio no es realmente reutilizable.

Errores frecuentes en modular email design

La modularidad puede mejorar mucho el flujo de trabajo, pero también puede generar problemas si se aplica sin criterio.

Crear demasiados módulos

Tener demasiados bloques puede ser tan problemático como no tener ninguno. Si existen cinco versiones casi iguales de una card o siete estilos de CTA, el equipo vuelve a tener demasiadas decisiones.

Un sistema modular debe simplificar, no multiplicar la complejidad.

No contemplar casos extremos

Un componente debe probarse con contenido realista y también con casos límite: titulares largos, imágenes verticales, textos breves, ausencia de imagen, nombres de producto extensos o traducciones más largas.

Si un módulo solo funciona con el ejemplo perfecto del diseño, fallará en producción.

Pensar solo en diseño y olvidar desarrollo

Un bloque visualmente atractivo puede ser difícil o frágil de maquetar en email. Por eso, diseño y desarrollo deben colaborar desde el principio.

La pregunta no debería ser únicamente “¿cómo queremos que se vea?”, sino también “¿cómo se comportará en Gmail, Outlook, Apple Mail y móvil?”.

No actualizar la biblioteca

Un sistema modular no es algo que se crea una vez y se abandona. Debe evolucionar. Cada campaña puede revelar mejoras: un bloque que sobra, una variante que falta, un espaciado que conviene ajustar o una CTA que necesita más contraste.

La biblioteca debe tener mantenimiento, igual que cualquier otro sistema de diseño.

Ejemplo de estructura modular para una newsletter

Una newsletter modular podría construirse con esta secuencia:

1. Preheader

Texto breve que complementa el asunto y anticipa el contenido del email.

2. Header

Logo de la marca y, si procede, enlace a la versión web.

3. Hero principal

Titular, entradilla y CTA. Este bloque comunica la idea central.

4. Bloque editorial

Texto de contexto o explicación. Sirve para desarrollar el mensaje sin saturar el hero.

5. Cards de contenido

Tres artículos, recursos o productos destacados, cada uno con imagen, título, descripción y enlace.

6. CTA secundario

Un bloque final que refuerza la acción principal o invita a seguir leyendo.

Información legal, enlaces de baja, redes sociales y datos de contacto.

Esta estructura es flexible. Puedes eliminar las cards, añadir un bloque testimonial o cambiar el CTA según el objetivo. Lo importante es que la lógica se mantenga.

Preguntas frecuentes sobre maquetación modular de emails

¿Qué es modular email design?

El modular email design es una forma de diseñar y desarrollar emails a partir de bloques reutilizables. En vez de crear cada campaña desde cero, se construye una biblioteca de componentes como headers, botones, cards, bloques de texto, CTAs y footers.

¿Qué son los email components?

Los email components son piezas reutilizables de una plantilla de email. Cada componente tiene una función concreta: mostrar una llamada a la acción, presentar un artículo, destacar un producto, separar secciones o cerrar el email con información legal.

¿Puedo usar componentes de React para maquetar emails?

Se puede trabajar con enfoques inspirados en componentes, pero no conviene asumir que un componente web sirve directamente para email. El HTML de email tiene restricciones propias y necesita compatibilidad con clientes de correo. En muchos casos, herramientas específicas como MJML pueden ser una alternativa más adecuada.

Diseñar emails como sistema, no como piezas sueltas

La maquetación modular de emails cambia la forma de trabajar. En lugar de enfrentarte a cada campaña como si fuera un lienzo en blanco, construyes un sistema de bloques que te permite avanzar con más seguridad, coherencia y velocidad.

Esto no significa renunciar a la creatividad. Significa darle una estructura. Un buen sistema modular no limita: orienta. Ayuda a decidir mejor, evita inconsistencias y permite que cada email cumpla su función sin reinventar la rueda.

En email development, donde cada cliente de correo puede comportarse de forma diferente, la modularidad es también una estrategia de supervivencia. Cuanto más probados, documentados y reutilizables sean tus bloques, menos dependerás de soluciones improvisadas.

La clave está en empezar pequeño: una cabecera, un hero, un botón, una card, un bloque de texto y un footer. A partir de ahí, cada campaña puede ayudarte a mejorar la biblioteca.

Porque un buen email no es solo una pieza visual atractiva. Es una estructura pensada para comunicar con claridad, funcionar en contextos difíciles y facilitar una decisión. Y cuando esa estructura se convierte en sistema, todo el proceso —diseño, desarrollo, revisión y envío— se vuelve mucho más sostenible.

Cómo crear un efecto typing con CSS

El efecto typing con CSS es una animación sencilla, visual y muy reconocible: el texto aparece progresivamente, como si alguien lo estuviera escribiendo en una máquina de escribir o en una terminal. Es un recurso muy utilizado en portfolios, páginas personales, landings, cabeceras creativas y secciones hero donde interesa captar la atención desde el primer vistazo.

Lo interesante de este efecto es que no necesitas JavaScript para conseguirlo. Con unas cuantas líneas de HTML y CSS puedes crear una animación ligera, fácil de personalizar y compatible con la mayoría de proyectos web. Eso sí, como ocurre con cualquier animación CSS, conviene aplicarla con criterio para que no perjudique la legibilidad, el rendimiento ni la accesibilidad.

En este artículo veremos cómo crear un efecto typing CSS paso a paso, cómo funciona la propiedad steps(), cómo añadir un cursor parpadeante, cómo adaptar el efecto a diferentes pantallas y qué buenas prácticas deberías tener en cuenta antes de incluirlo en una web real.

Si estás trabajando una serie de contenidos sobre movimiento en interfaces, este efecto encaja muy bien dentro de una estrategia más amplia sobre animaciones CSS, especialmente si quieres aprender a crear detalles visuales pequeños pero efectivos.

Un efecto typing en CSS, también conocido como efecto máquina de escribir, es una animación que muestra un texto de forma progresiva. En lugar de aparecer completo desde el inicio, el contenido se revela carácter a carácter o por pequeños bloques, generando la sensación de que se está escribiendo en tiempo real.

Este tipo de animación suele combinar tres elementos principales:

  • Un texto que inicialmente está oculto.
  • Una animación que va ampliando el área visible del texto.
  • Un cursor visual, normalmente una línea vertical, que parpadea al final de la frase.

El resultado recuerda a una máquina de escribir clásica, a una consola de comandos o a una interfaz tecnológica. Por eso también se le suele llamar typewriter effect o typing animation CSS.

Aunque puede parecer un detalle puramente decorativo, bien utilizado puede ayudar a destacar una frase importante, reforzar la identidad visual de una página o aportar una sensación de dinamismo sin sobrecargar la interfaz.

El texto animado CSS puede resultar muy atractivo, pero no debería usarse en cualquier parte de una página. Como cualquier recurso visual, debe tener una intención clara.

El efecto typing funciona especialmente bien en:

  • La cabecera principal de un portfolio.
  • Una landing page con una propuesta de valor breve.
  • Un titular destacado dentro de una página de servicios.
  • Interfaces con estética de terminal, tecnología o escritura.
  • Presentaciones personales donde quieras añadir un punto expresivo.

Por ejemplo, en una página de inicio podrías usar una frase como:

<h1>Creo interfaces web accesibles y cuidadas</h1>

Aplicada con efecto typing, esa frase gana presencia y puede llamar más la atención. Sin embargo, si animas párrafos largos o información demasiado importante, el usuario puede sentirse obligado a esperar para leer. Y eso no siempre es buena idea.

La clave está en usar este recurso en textos breves, relevantes y fáciles de entender. Una animación debería acompañar el contenido, no convertirse en una barrera.

El efecto typing con CSS suele construirse animando el ancho del elemento que contiene el texto. Al principio, ese ancho es 0, por lo que el texto no se ve. Después, el ancho va creciendo hasta mostrar la frase completa.

Para que funcione correctamente, se combinan varias propiedades:

  • overflow: hidden, para ocultar el texto que queda fuera del ancho visible.
  • white-space: nowrap, para evitar que el texto salte de línea.
  • width, para controlar cuánto texto se muestra.
  • animation, para animar el cambio de ancho.
  • steps(), para que la animación avance por saltos y no de forma fluida.
  • border-right o un pseudo-elemento, para simular el cursor.

Si ya has trabajado antes con @keyframes en CSS, este efecto te resultará bastante familiar. La diferencia principal está en el uso de steps(), que es lo que da esa sensación de escritura carácter a carácter.

La estructura HTML puede ser muy sencilla. Puedes aplicar el efecto directamente sobre un título, un párrafo o un span.

<h1 class="typing">Cómo crear interfaces con personalidad</h1>

También puedes aplicarlo solo a una parte de una frase:

<h1>
  Diseño <span class="typing">experiencias digitales</span>
</h1>

Esta segunda opción es muy útil cuando quieres que solo una parte del titular tenga movimiento. Por ejemplo, podrías mantener una frase fija y animar únicamente el concepto principal.

El siguiente código crea un efecto máquina de escribir sencillo, con texto progresivo y cursor parpadeante.

.typing {
  display: inline-block;
  width: 38ch;
  overflow: hidden;
  white-space: nowrap;
  border-right: 3px solid currentColor;
  animation: typing 3s steps(38), blink 0.7s step-end infinite;
}

@keyframes typing {
  from {
    width: 0;
  }

  to {
    width: 38ch;
  }
}

@keyframes blink {
  50% {
    border-color: transparent;
  }
}

Con este bloque ya tienes un efecto typing CSS funcional. El texto se revela poco a poco y el borde derecho actúa como cursor.

Usamos display: inline-block para que el elemento pueda comportarse como texto en línea, pero permita controlar su ancho. Sin esta propiedad, algunos elementos en línea no responderían igual al cambio de width.

display: inline-block;

La propiedad width define cuánto espacio ocupa el texto cuando la animación termina.

width: 38ch;

La unidad ch es muy práctica para este tipo de animación porque se relaciona con el ancho de los caracteres de la fuente. No es una medida perfecta para todos los casos, pero suele funcionar bien en textos de una sola línea.

Esta propiedad oculta la parte del texto que queda fuera del ancho visible.

overflow: hidden;

Sin overflow: hidden, el texto aparecería completo desde el principio y la animación perdería su sentido.

Esta línea evita que el texto salte a una segunda línea.

white-space: nowrap;

En un efecto máquina de escribir básico, normalmente queremos que la frase se mantenga en una sola línea mientras se revela.

El cursor se consigue con un borde derecho.

border-right: 3px solid currentColor;

Usar currentColor permite que el cursor herede el color del texto. Esto es útil si más adelante cambias el color del titular o trabajas con temas claros y oscuros.

La función steps() es una de las claves del efecto typing. Si animáramos el ancho de forma lineal, el texto se revelaría como una cortina horizontal continua. En cambio, steps() divide la animación en saltos.

animation: typing 3s steps(38);

Esto hace que el texto aparezca poco a poco, de una forma más parecida a la escritura real.

El número que colocas dentro de steps() debería coincidir aproximadamente con el número de caracteres del texto. Si la frase tiene 38 caracteres, puedes usar steps(38). Si tiene 24, puedes usar steps(24).

No hace falta que sea exacto al cien por cien, pero cuanto más se acerque el valor al contenido real, más natural se verá la animación.

A continuación tienes un ejemplo completo que puedes adaptar a una sección hero o a un bloque destacado de tu web.

<section class="hero">
  <p class="hero__intro">Frontend & UX</p>

  <h1 class="hero__title">
    <span class="typing">Creo interfaces web con CSS</span>
  </h1>
</section>
.hero {
  min-height: 60vh;
  display: grid;
  place-content: center;
  text-align: center;
  padding: 2rem;
}

.hero__intro {
  margin-bottom: 1rem;
  font-size: 1rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.hero__title {
  margin: 0;
  font-size: clamp(2rem, 6vw, 4.5rem);
  line-height: 1.1;
}

.typing {
  display: inline-block;
  width: 29ch;
  overflow: hidden;
  white-space: nowrap;
  border-right: 0.08em solid currentColor;
  animation: typing 3s steps(29), blink 0.7s step-end infinite;
}

@keyframes typing {
  from {
    width: 0;
  }

  to {
    width: 29ch;
  }
}

@keyframes blink {
  50% {
    border-color: transparent;
  }
}

Este ejemplo utiliza clamp() para que el tamaño del texto sea más adaptable. Además, el cursor usa em, de modo que su grosor se relaciona con el tamaño de la fuente.

Si te interesa profundizar en qué propiedades conviene animar y cuáles pueden afectar más al rendimiento, puedes revisar esta guía sobre animaciones CSS y rendimiento.

La velocidad del efecto se controla principalmente desde la propiedad animation.

animation: typing 3s steps(29), blink 0.7s step-end infinite;

El valor 3s indica cuánto tarda el texto en escribirse por completo. Si quieres una animación más rápida, puedes reducir ese tiempo:

animation: typing 2s steps(29), blink 0.7s step-end infinite;

Si prefieres un ritmo más pausado, puedes aumentarlo:

animation: typing 4s steps(29), blink 0.7s step-end infinite;

Como referencia, para titulares cortos suele funcionar bien una duración entre 2 y 4 segundos. Si el texto tarda demasiado en aparecer, la animación puede volverse pesada.

El cursor es un detalle pequeño, pero influye mucho en el aspecto final. Puedes hacerlo más fino, más grueso, más rápido o más lento.

Para modificar el grosor, cambia el valor de border-right:

border-right: 2px solid currentColor;

También puedes usar unidades relativas:

border-right: 0.08em solid currentColor;

Esta opción suele integrarse mejor en diseños responsive porque el cursor escala junto con el texto.

La velocidad del parpadeo se controla en la animación blink.

animation: blink 0.7s step-end infinite;

Un valor menor hará que el cursor parpadee más rápido:

animation: blink 0.4s step-end infinite;

Un valor mayor hará que parpadee más despacio:

animation: blink 1s step-end infinite;

En general, conviene evitar un parpadeo demasiado rápido. Puede resultar visualmente agresivo y distraer más de la cuenta.

También puedes hacer que el texto se escriba, permanezca visible durante un momento y luego desaparezca. Para ello, basta con modificar los porcentajes del @keyframes.

<h2 class="typing-loop">Diseño. Desarrollo. Optimizo.</h2>
.typing-loop {
  display: inline-block;
  width: 28ch;
  overflow: hidden;
  white-space: nowrap;
  border-right: 0.08em solid currentColor;
  animation:
    typing-loop 6s steps(28) infinite,
    blink 0.7s step-end infinite;
}

@keyframes typing-loop {
  0% {
    width: 0;
  }

  40% {
    width: 28ch;
  }

  60% {
    width: 28ch;
  }

  100% {
    width: 0;
  }
}

@keyframes blink {
  50% {
    border-color: transparent;
  }
}

En este caso, el texto se escribe, se mantiene visible y después se borra. Es una solución útil para una frase fija, aunque si quieres rotar varias frases diferentes quizá te interese combinar CSS con JavaScript.

Para efectos sencillos, CSS es más que suficiente. Para secuencias más complejas, JavaScript te dará más control sobre los tiempos, las pausas y el contenido dinámico.

Uno de los principales problemas del efecto máquina de escribir es que puede romperse en pantallas pequeñas. Como usamos white-space: nowrap, el texto no salta de línea, y eso puede provocar desbordamientos si la frase es demasiado larga.

Para evitarlo, lo mejor es escribir frases breves y comprobar siempre el resultado en móvil.

Puedes controlar mejor el tamaño del texto con clamp():

.typing {
  font-size: clamp(1.5rem, 5vw, 3.5rem);
}

De esta forma, el texto se adapta mejor a diferentes anchos de pantalla.

En algunos casos, la mejor decisión es mostrar el texto completo en móvil y desactivar la animación.

@media (max-width: 480px) {
  .typing {
    width: auto;
    white-space: normal;
    border-right: 0;
    animation: none;
  }
}

Esta solución prioriza la legibilidad. El efecto typing puede ser muy atractivo en escritorio, pero si en móvil dificulta la lectura, es mejor simplificarlo.

Las animaciones pueden mejorar una interfaz, pero también pueden generar molestias si se usan sin cuidado. Algunas personas prefieren reducir el movimiento en sus dispositivos por razones de accesibilidad, concentración o comodidad visual.

CSS permite respetar esta preferencia con la media query prefers-reduced-motion.

@media (prefers-reduced-motion: reduce) {
  .typing {
    width: auto;
    overflow: visible;
    white-space: normal;
    border-right: 0;
    animation: none;
  }
}

Con esta regla, si el usuario tiene activada la reducción de movimiento, el texto se muestra directamente y la animación se desactiva.

Este detalle es especialmente importante cuando el texto contiene información relevante. El usuario no debería depender de una animación para entender el contenido.

Si quieres profundizar en este tema, puedes leer también la guía sobre prefers-reduced-motion en CSS, donde se explica cómo crear interfaces más respetuosas con las preferencias del usuario.

El texto animado CSS puede aportar personalidad, pero conviene usarlo con moderación. Estas recomendaciones te ayudarán a conseguir un resultado más profesional.

El efecto typing funciona mejor con frases breves. Una línea clara y directa suele tener más impacto que un titular largo que tarda demasiado en escribirse.

Si el mensaje es importante, no obligues al usuario a esperar. La animación debe acompañar la lectura, no retrasarla.

Un cursor parpadeante puede funcionar muy bien en una cabecera, pero varios cursores animados a la vez pueden resultar molestos.

El efecto puede verse perfecto en escritorio y romperse en pantallas pequeñas. Antes de publicarlo, revisa el resultado en diferentes anchos.

Añadir soporte para prefers-reduced-motion es una buena práctica básica cuando trabajas con animaciones. No cuesta mucho y mejora la experiencia de quienes prefieren interfaces más estáticas.

Uno de los errores más habituales es copiar un ejemplo sin adaptar el width ni los steps() al texto real.

width: 40ch;
animation: typing 3s steps(40);

Si tu frase tiene menos caracteres, quedará demasiado espacio vacío. Si tiene más, puede cortarse antes de tiempo.

Sin overflow: hidden, el texto se mostrará completo desde el principio. La animación seguirá existiendo, pero visualmente no parecerá una máquina de escribir.

Este efecto no está pensado para párrafos enteros. Funciona mejor en titulares, frases cortas o pequeños fragmentos destacados.

Si el cursor tiene poco contraste con el fondo, puede pasar desapercibido. Si tiene demasiado peso visual, puede distraer. Lo ideal es que acompañe al texto sin robar protagonismo.

Aunque este efecto es ligero, sigue siendo una animación. Si tu página ya tiene muchos elementos en movimiento, quizá convenga reducir o simplificar. En este sentido, también puede ayudarte revisar cuándo conviene usar transform y opacity en animaciones CSS frente a otras propiedades.

Si quieres aplicar el efecto typing en varios textos, puedes usar variables CSS para controlar el número de caracteres y la duración.

<h1 class="typing" style="--characters: 31; --duration: 3s;">
  Animaciones CSS con estilo
</h1>
.typing {
  display: inline-block;
  width: calc(var(--characters) * 1ch);
  overflow: hidden;
  white-space: nowrap;
  border-right: 0.08em solid currentColor;
  animation:
    typing var(--duration) steps(var(--characters)),
    blink 0.7s step-end infinite;
}

@keyframes typing {
  from {
    width: 0;
  }

  to {
    width: calc(var(--characters) * 1ch);
  }
}

@keyframes blink {
  50% {
    border-color: transparent;
  }
}

Esta variante es muy útil si quieres reutilizar el mismo efecto en diferentes componentes. Solo tienes que cambiar --characters y --duration en cada elemento.

Otra forma de crear el cursor es usar un pseudo-elemento ::after. Esta técnica da más control sobre la altura, el grosor y la posición del cursor.

<h1 class="typing typing--cursor">Efecto typing solo con CSS</h1>
.typing {
  position: relative;
  display: inline-block;
  width: 29ch;
  overflow: hidden;
  white-space: nowrap;
  animation: typing 3s steps(29) forwards;
}

.typing--cursor::after {
  content: "";
  position: absolute;
  right: 0;
  top: 0;
  width: 0.08em;
  height: 1em;
  background: currentColor;
  animation: blink-cursor 0.7s step-end infinite;
}

@keyframes typing {
  from {
    width: 0;
  }

  to {
    width: 29ch;
  }
}

@keyframes blink-cursor {
  50% {
    opacity: 0;
  }
}

Esta opción puede venir bien si el borde derecho no se ajusta exactamente al diseño que necesitas. Con ::after puedes modificar el alto, la posición y el comportamiento del cursor de forma más precisa.

Una pregunta habitual es si este efecto debería hacerse con CSS o con JavaScript. La respuesta depende del nivel de control que necesites.

CSS es una buena opción cuando:

  • El texto es fijo.
  • La animación es sencilla.
  • No necesitas cambiar frases dinámicamente.
  • Buscas una solución ligera.
  • Quieres añadir un detalle visual a una sección concreta.

JavaScript puede ser más adecuado cuando:

  • Quieres rotar varias frases.
  • Necesitas borrar y escribir textos diferentes.
  • El contenido viene de una API.
  • Quieres controlar pausas y velocidades de forma dinámica.
  • Necesitas una animación más interactiva.

Para una cabecera, una frase destacada o un pequeño detalle visual, CSS suele ser suficiente. Para sistemas más complejos, JavaScript ofrece más flexibilidad.

También es importante entender la diferencia entre distintos tipos de animación. Si estás comparando enfoques, puedes revisar este artículo sobre transition vs animation en CSS, donde se explica cuándo conviene usar cada una.

Sí. Puedes crear un efecto typing solo con CSS usando overflow: hidden, white-space: nowrap, una animación sobre width y la función steps(). También puedes añadir un cursor con border-right o con un pseudo-elemento.

steps() divide la animación en saltos. En lugar de revelar el texto de forma fluida, lo muestra por partes, generando una sensación similar a la escritura carácter a carácter.

Depende de la longitud del texto y del diseño. Si la frase es corta, puede funcionar bien. Si el texto se desborda o dificulta la lectura, es mejor desactivar la animación en pantallas pequeñas y mostrar el contenido completo.

Crear un efecto typing con CSS es relativamente sencillo, pero aplicarlo bien requiere algo más que copiar y pegar código. Hay que pensar en la longitud del texto, el ritmo de la animación, el comportamiento responsive, el cursor y la accesibilidad.

El efecto máquina de escribir puede aportar personalidad a una interfaz, especialmente en titulares y secciones hero. Sin embargo, su fuerza está en la sutileza. Cuando se usa en una frase breve y relevante, puede captar la atención sin resultar invasivo. Cuando se aplica a demasiados textos o se alarga demasiado, puede convertirse en una distracción.

CSS nos permite crear movimiento de forma ligera y expresiva, pero el criterio de diseño sigue siendo lo más importante. Una buena animación no es la que más se nota, sino la que aparece en el momento adecuado, con la duración justa y al servicio de un mensaje claro.

Si quieres añadir dinamismo a tu web sin depender de JavaScript, el efecto typing CSS es una opción práctica, visual y fácil de adaptar. Bien utilizado, puede convertir una simple línea de texto en un detalle memorable dentro de la experiencia de usuario.

Cómo organizar componentes reutilizables en MJML

Cuando empiezas a maquetar emails con MJML, la primera sensación suele ser bastante agradable: todo parece más limpio que trabajar directamente con tablas HTML, las columnas son más fáciles de entender y la estructura general del email resulta menos intimidante. MJML está pensado precisamente para reducir la complejidad de crear emails responsive, usando una sintaxis más legible que después se transforma en HTML compatible con distintos clientes de correo.

Pero hay un punto en el que esa comodidad inicial puede empezar a desordenarse: cuando dejas de tener una sola newsletter puntual y pasas a mantener varias campañas, automatizaciones, emails transaccionales, cabeceras, footers, banners, bloques de producto, llamadas a la acción y versiones para distintos públicos.

Ahí aparece la gran pregunta: cómo organizar componentes reutilizables en MJML sin convertir el proyecto en una carpeta llena de archivos imposibles de mantener.

La respuesta no está solo en “separar archivos”. Está en pensar el email como un pequeño sistema de diseño: con piezas reutilizables, estilos globales, nombres claros, componentes con una responsabilidad concreta y una estructura que permita escalar sin duplicar código en cada campaña.

Si estás dando tus primeros pasos con esta tecnología, antes puede ayudarte leer qué es MJML y por qué facilita la maquetación de emails responsive. Y si ya vienes de trabajar con HTML tradicional, también te recomiendo revisar la comparación entre MJML vs HTML tradicional para emails, porque entender esas diferencias ayuda mucho a organizar mejor cualquier proyecto.

Por qué tiene sentido crear componentes reutilizables en MJML

Un email rara vez es una pieza completamente nueva desde cero. Aunque cambie el contenido, muchas partes suelen repetirse: el encabezado, el logo, el footer legal, los botones, los separadores, los módulos de imagen más texto, las tarjetas de producto, las llamadas a la acción o los bloques de artículos recomendados.

Si cada email copia y pega esos bloques manualmente, tarde o temprano aparecen problemas: cambios de marca aplicados en unos emails sí y en otros no, botones con paddings diferentes, footers legales desactualizados, errores visuales por duplicar estructuras complejas y mucho tiempo perdido revisando detalles que ya deberían estar resueltos.

Aquí es donde la reutilización aporta valor. Organizar componentes reutilizables en MJML permite convertir piezas repetidas en bloques consistentes, fáciles de mantener y más seguros para producción.

MJML ya trabaja con una lógica basada en componentes. Elementos como <mj-section>, <mj-column>, <mj-text>, <mj-image> o <mj-button> permiten construir emails a partir de bloques comprensibles. La clave está en dar un paso más: no usar solo los componentes base de MJML, sino crear una organización propia para que el proyecto tenga una lógica de sistema.

Esto cobra todavía más importancia cuando trabajas newsletters, campañas recurrentes o automatizaciones. En esos casos, no solo estás diseñando un email; estás creando una pequeña biblioteca de piezas que vas a reutilizar muchas veces.

Qué entendemos por componentes reutilizables en MJML

Cuando hablamos de componentes MJML reutilizables, no nos referimos necesariamente a componentes como los de React, Vue o Svelte. En MJML, la reutilización puede adoptar varias formas.

Puede ser un archivo parcial que se incluye en varias plantillas, una sección completa que se repite, un conjunto de estilos globales dentro de <mj-attributes>, una clase reutilizable con mj-class o incluso un bloque de contenido generado desde Node.js antes de compilar el MJML final.

Lo importante es que el componente tenga una función clara y pueda reutilizarse sin tener que reescribirlo cada vez.

<mj-section background-color="#F8E0EA" padding="32px 24px">
  <mj-column>
    <mj-text font-size="24px" font-weight="700" color="#020101">
      Título de la campaña
    </mj-text>

    <mj-text font-size="16px" line-height="1.6" color="#333333">
      Texto introductorio del email.
    </mj-text>

    <mj-button background-color="#CC2B5E" color="#ffffff" border-radius="8px">
      Leer más
    </mj-button>
  </mj-column>
</mj-section>

Este bloque podría ser un hero reutilizable. Pero si lo copiamos y pegamos en diez emails, no estamos reutilizando de verdad: solo estamos duplicando una estructura. Para que sea realmente reutilizable, lo ideal es aislarlo dentro de una arquitectura clara.

Una estructura de carpetas clara para proyectos MJML

La organización de carpetas es una de las decisiones más importantes. No hace falta complicarla demasiado, pero sí conviene separar las piezas según su responsabilidad.

Una estructura práctica podría ser esta:

emails/
  templates/
    newsletter.mjml
    welcome.mjml
    password-reset.mjml

  components/
    header.mjml
    footer.mjml
    hero.mjml
    button-primary.mjml
    article-card.mjml
    product-card.mjml
    divider.mjml

  layouts/
    base.mjml
    marketing-layout.mjml
    transactional-layout.mjml

  styles/
    attributes.mjml
    fonts.mjml
    head.mjml

  data/
    newsletter.json
    products.json

  dist/
    newsletter.html
    welcome.html

Esta estructura separa varios niveles. Las templates son los emails finales, como una newsletter, un email de bienvenida o una recuperación de contraseña. Los components son piezas reutilizables pequeñas o medianas, como cabeceras, botones, tarjetas o bloques de contenido.

Los layouts definen estructuras generales. Por ejemplo, un layout de marketing con hero y CTA, o un layout transaccional más sobrio. Los archivos de styles agrupan configuración global, fuentes, clases, atributos y estilos comunes. Y la carpeta dist contiene el HTML final compilado, listo para probar o integrar en una herramienta de email marketing.

La ventaja de esta separación es que cada archivo tiene un papel claro. No mezclas el contenido de una campaña concreta con el estilo global de todos los emails, ni duplicas el footer en cada plantilla.

Cómo usar mj-include para dividir archivos

Una de las formas más directas de reutilizar piezas en MJML es usar <mj-include>. Este recurso permite incluir otros archivos dentro de una plantilla principal, lo que resulta muy útil para cabeceras, footers, bloques repetidos o estilos compartidos.

Por ejemplo, una plantilla principal podría verse así:

<mjml>
  <mj-head>
    <mj-include path="../styles/attributes.mjml" />
  </mj-head>

  <mj-body background-color="#ffffff">
    <mj-include path="../components/header.mjml" />
    <mj-include path="../components/hero.mjml" />
    <mj-include path="../components/article-card.mjml" />
    <mj-include path="../components/footer.mjml" />
  </mj-body>
</mjml>

Esto hace que el email final sea mucho más fácil de leer. En lugar de enfrentarte a un archivo enorme de cientos de líneas, puedes ver la composición general del email de un vistazo.

Cuándo usar archivos parciales

Los parciales funcionan muy bien cuando una pieza se repite en varios emails y no cambia demasiado. Por ejemplo: header corporativo, footer legal, bloque de redes sociales, separadores visuales, banner promocional, módulo de artículo destacado, CTA final o bloque de aviso legal.

La clave está en no crear parciales para absolutamente todo. Si fragmentas demasiado, puedes acabar con una arquitectura difícil de seguir. Un componente reutilizable debe tener una razón clara para existir.

Qué no conviene convertir en componente

No todo merece ser un componente. Si un bloque solo aparece una vez y no tiene previsión de repetirse, quizá sea mejor dejarlo dentro de la plantilla.

Tampoco conviene crear componentes demasiado específicos, como este:

hero-black-friday-2026-discount-30.mjml

Ese archivo difícilmente será reutilizable. En cambio, tendría más sentido crear algo como esto:

hero-campaign.mjml

Después puedes modificar el contenido desde la plantilla, desde variables o desde una fase previa de renderizado si trabajas con Node.js.

Centralizar estilos con mj-attributes y mj-class

Una parte esencial de los componentes reutilizables en MJML es evitar repetir estilos en cada bloque. Si todos los botones tienen el mismo color, border-radius, padding y tipografía, no tiene sentido escribir esos atributos una y otra vez.

MJML permite definir estilos globales dentro de <mj-head>, especialmente mediante <mj-attributes>. Esta técnica ayuda a establecer valores por defecto para componentes como <mj-text>, <mj-button> o <mj-section>.

<mj-attributes>
  <mj-text
    font-family="Arial, sans-serif"
    font-size="16px"
    line-height="1.6"
    color="#020101"
  />

  <mj-button
    font-family="Arial, sans-serif"
    font-size="16px"
    font-weight="700"
    background-color="#CC2B5E"
    color="#ffffff"
    border-radius="8px"
    padding="16px 24px"
  />

  <mj-section padding="24px" />
</mj-attributes>

Con esta configuración, cada vez que uses <mj-text> o <mj-button>, partirás de una base común. Después podrás sobrescribir atributos concretos si una pieza necesita un ajuste específico.

Esta idea conecta muy bien con otras decisiones de diseño y desarrollo frontend: crear una base común, reducir la repetición y mantener criterios consistentes. Es el mismo principio que aplicamos cuando organizamos estilos, componentes o patrones visuales en una web.

Crear variantes con mj-class

Además de estilos globales, puedes crear clases reutilizables con mj-class. Por ejemplo:

<mj-attributes>
  <mj-class
    name="text-muted"
    color="#666666"
    font-size="14px"
    line-height="1.5"
  />

  <mj-class
    name="heading-lg"
    font-size="28px"
    font-weight="700"
    line-height="1.3"
    color="#020101"
  />

  <mj-class
    name="button-secondary"
    background-color="#753A88"
    color="#ffffff"
    border-radius="8px"
  />
</mj-attributes>

Después puedes aplicarlas así:

<mj-text mj-class="heading-lg">
  Novedades de la semana
</mj-text>

<mj-text mj-class="text-muted">
  Una selección breve de recursos para mejorar tus emails.
</mj-text>

<mj-button mj-class="button-secondary">
  Ver recursos
</mj-button>

Este enfoque se parece mucho a trabajar con tokens o utilidades de diseño. Ayuda a mantener consistencia sin llenar cada componente de atributos repetidos.

Consejo práctico para nombres de clases

Los nombres deben explicar intención, no apariencia temporal. Es mejor usar nombres como heading-lg, text-muted, button-primary o section-soft que nombres como text-gray, button-purple o pink-section.

¿Por qué? Porque la marca puede cambiar de color, pero la intención del componente se mantiene. Un botón primario seguirá siendo primario aunque mañana cambie de rosa a azul.

Diseñar componentes por responsabilidad, no por campaña

Uno de los errores más comunes al organizar reusable email components es pensar en campañas concretas en lugar de pensar en responsabilidades.

Por ejemplo, podrías tener un archivo llamado:

newsletter-january-header.mjml

Pero eso lo ata demasiado a una campaña concreta. En cambio, conviene pensar en algo más reutilizable:

header-brand.mjml

La pregunta útil es: qué hace este componente.

¿Presenta la marca? ¿Muestra una imagen destacada? ¿Agrupa un listado de artículos? ¿Cierra el email con información legal? ¿Guía hacia una acción principal? ¿Muestra una tarjeta de producto?

Si el nombre responde a la función, será más fácil reutilizarlo en distintos contextos.

Componentes pequeños, medianos y grandes

No todos los componentes tienen que tener el mismo tamaño. Puedes pensar en tres niveles.

Los componentes pequeños pueden ser botones, separadores, bloques de texto, badges o pequeños avisos. Los componentes medianos pueden ser tarjetas de artículo, bloques de producto, módulos de imagen más texto o llamadas a la acción. Y los componentes grandes pueden ser headers, footers, heroes, secciones completas o bloques de campaña.

Esta división ayuda a evitar dos extremos: componentes enormes que hacen demasiadas cosas o componentes tan pequeños que obligan a abrir veinte archivos para entender un email.

Ejemplo de sistema de componentes MJML para una newsletter

Imaginemos una newsletter mensual sobre desarrollo web. Podríamos definir las siguientes piezas:

components/
  header-brand.mjml
  hero-newsletter.mjml
  intro-text.mjml
  article-card.mjml
  resource-list.mjml
  cta-block.mjml
  footer-legal.mjml

La plantilla final quedaría mucho más limpia:

<mjml>
  <mj-head>
    <mj-include path="../styles/head.mjml" />
    <mj-include path="../styles/attributes.mjml" />
  </mj-head>

  <mj-body background-color="#ffffff">
    <mj-include path="../components/header-brand.mjml" />
    <mj-include path="../components/hero-newsletter.mjml" />
    <mj-include path="../components/intro-text.mjml" />
    <mj-include path="../components/article-card.mjml" />
    <mj-include path="../components/resource-list.mjml" />
    <mj-include path="../components/cta-block.mjml" />
    <mj-include path="../components/footer-legal.mjml" />
  </mj-body>
</mjml>

Desde fuera, la plantilla cuenta una historia clara: cabecera, hero, introducción, contenido principal, recursos, CTA y cierre. Eso mejora mucho la mantenibilidad.

Si estás trabajando una primera newsletter desde cero, puedes ampliar esta parte con la guía sobre cómo crear tu primera newsletter responsive con MJML, donde la prioridad está más en la estructura inicial del email y no tanto en la arquitectura de componentes.

Separar estructura, contenido y presentación

Para proyectos pequeños, puedes mantener contenido y estructura juntos. Pero si vas a trabajar con muchas campañas, es mejor separar tres capas: estructura, contenido y presentación.

La estructura define qué bloques existen y en qué orden aparecen. El contenido incluye textos, enlaces, imágenes y datos variables. La presentación agrupa estilos globales, colores, tipografías, espaciados y clases.

Esta separación no tiene que ser perfecta desde el primer día. Pero cuanto más crece el proyecto, más se agradece.

Cómo trabajar con datos dinámicos y MJML

MJML puede integrarse en workflows con Node.js para generar HTML a partir de plantillas. Esto abre una posibilidad interesante: crear emails a partir de datos externos.

Por ejemplo, podrías tener un archivo JSON con el contenido de una newsletter:

{
  "title": "Recursos de frontend de la semana",
  "intro": "Una selección breve para mejorar tus proyectos.",
  "articles": [
    {
      "title": "Cómo mejorar la accesibilidad de tus formularios",
      "url": "https://example.com/articulo-1"
    },
    {
      "title": "Buenas prácticas para emails responsive",
      "url": "https://example.com/articulo-2"
    }
  ]
}

Después, con un script de Node.js, podrías generar el MJML final antes de compilarlo a HTML. En ese caso, MJML funciona como capa de presentación, mientras que los datos vienen de otra fuente: un CMS, una API, un JSON o una base de datos.

Este enfoque es muy útil cuando necesitas producir muchas variaciones de un email sin cambiar manualmente cada archivo. También encaja bien con un workflow frontend moderno, donde el código, los datos y la generación de archivos pueden formar parte de un proceso automatizado.

Buenas prácticas para nombrar componentes MJML

La nomenclatura parece un detalle menor, pero en proyectos reales marca una gran diferencia. Un buen nombre evita confusión y reduce el tiempo de decisión.

Conviene usar nombres descriptivos y funcionales. Es mejor article-card.mjml que block-1.mjml. También es preferible evitar nombres demasiado ligados a una campaña concreta. Por ejemplo, promo-banner.mjml será más útil a largo plazo que summer-sale-2026-banner.mjml.

Mantener una convención consistente también ayuda. Si usas kebab-case, úsalo en todo el proyecto: footer-legal.mjml, hero-simple.mjml, button-primary.mjml.

También puedes distinguir variantes cuando sea necesario. Por ejemplo: hero-simple.mjml, hero-image.mjml y hero-centered.mjml. Pero es importante no crear variantes innecesarias. Si dos componentes solo cambian una palabra o un color, quizá deberían ser el mismo componente con estilos o datos distintos.

Patrones que conviene evitar

Organizar componentes reutilizables en MJML también implica saber qué no hacer. El primer patrón a evitar es copiar y pegar bloques entre emails. Es rápido al principio, pero caro a medio plazo. Si el footer cambia, tendrás que actualizarlo en todos los emails donde lo hayas copiado.

Otro error habitual es crear componentes sin criterio. Separar por separar tampoco ayuda. Si cada <mj-text> vive en un archivo diferente, la plantilla será difícil de leer.

También conviene evitar mezclar estilos globales con estilos puntuales. Si cada componente redefine tipografías, colores y paddings sin seguir una base común, acabarás con un sistema inconsistente.

Por último, no hay que olvidar las limitaciones propias del email. MJML simplifica mucho la maquetación, pero los emails siguen dependiendo de clientes de correo con comportamientos distintos. Por eso es importante revisar qué partes de CSS son realmente seguras. Para profundizar en este punto, puedes leer qué partes de CSS funcionan realmente en email marketing y también el artículo sobre limitaciones reales del CSS en clientes de correo.

Organización recomendada para un workflow frontend moderno

Si trabajas en un entorno frontend moderno, puedes integrar MJML dentro de un flujo con scripts, control de versiones y generación automática.

Una estructura posible sería:

src/
  emails/
    templates/
    components/
    layouts/
    styles/
    data/

scripts/
  build-emails.js

dist/
  emails/

Y en el archivo package.json podrías tener scripts como estos:

{
  "scripts": {
    "build:emails": "node scripts/build-emails.js",
    "watch:emails": "mjml src/emails/templates -o dist/emails --watch"
  }
}

La idea es que los emails formen parte del proyecto, no que vivan como archivos sueltos en una carpeta perdida. Así puedes versionarlos, revisarlos en pull requests, automatizar la compilación y mantener consistencia entre campañas.

Este enfoque también facilita integrar MJML con otras herramientas del ecosistema frontend. Si te interesa esta parte más técnica, puedes continuar con el artículo sobre cómo integrar MJML en un workflow frontend moderno.

Documentar los componentes

Si el proyecto crece, conviene crear una pequeña documentación interna. No hace falta algo enorme. Puede bastar con un archivo README.md donde expliques qué componentes existen, cuándo usar cada uno, qué variantes hay, qué estilos globales están disponibles, cómo compilar los emails y qué criterios seguir antes de crear un componente nuevo.

Esta documentación evita que cada persona del equipo tome decisiones distintas. También reduce la carga cognitiva, porque no tienes que recordar de memoria cómo se construye cada bloque.

Accesibilidad y componentes reutilizables en emails

Cuando organizamos componentes MJML, no deberíamos pensar solo en la parte visual. También conviene tener en cuenta la accesibilidad.

Un componente reutilizable puede ayudar mucho si ya incluye buenas prácticas desde el principio: textos alternativos en imágenes relevantes, jerarquía clara, botones comprensibles, contraste suficiente y una estructura fácil de leer.

Por ejemplo, si tienes un componente de tarjeta de artículo, no debería limitarse a mostrar una imagen, un título y un botón genérico de “Leer más”. Sería más recomendable que el enlace o el botón tengan un contexto claro, especialmente para personas que navegan con lector de pantalla.

En lugar de repetir un patrón poco descriptivo en todos los emails, puedes resolverlo bien una vez y reutilizarlo en cada campaña. Para ampliar este enfoque, puedes revisar la guía sobre emails accesibles, contraste, jerarquía y lectores de pantalla.

Cómo decidir si un bloque merece ser componente

Antes de crear un nuevo componente, puedes hacerte varias preguntas. La primera es sencilla: ¿este bloque se va a repetir? Si la respuesta es sí, probablemente merece convertirse en componente.

También conviene preguntarse si tiene una responsabilidad clara. Un buen componente debe poder explicarse en una frase. Si necesitas demasiada explicación, quizá ese bloque está mezclando demasiadas funciones.

Otra pregunta útil es si depende demasiado de una campaña concreta. Si depende de una promoción única, quizá no sea reusable. En cambio, si representa un patrón que puede volver a aparecer, como una tarjeta, un CTA o un módulo de artículos, sí tiene sentido aislarlo.

Por último, piensa si ese componente mejorará la consistencia del sistema y reducirá errores futuros. Un footer legal, un botón principal o un bloque de baja de suscripción suelen beneficiarse mucho de estar centralizados.

La reutilización no consiste en crear más archivos, sino en reducir decisiones repetitivas. Un buen sistema de componentes debe hacer que crear un nuevo email sea más rápido, más claro y más fiable.

Preguntas frecuentes sobre componentes reutilizables en MJML

¿MJML permite crear componentes como en React?

No exactamente de la misma forma. MJML trabaja con su propio sistema de componentes y permite organizar archivos mediante inclusiones, atributos globales, clases y estructuras reutilizables. También existen formas más avanzadas de crear componentes personalizados, pero para la mayoría de proyectos de email marketing suele ser suficiente trabajar con parciales, layouts y estilos centralizados.

¿Cuándo debería usar mj-include?

Deberías usar <mj-include> cuando una parte del email se repite en varias plantillas o cuando separar un bloque mejora la legibilidad del archivo principal. Es especialmente útil para headers, footers, bloques legales, CTAs, módulos de artículos y estilos compartidos.

¿Es mejor tener muchos componentes pequeños o pocos componentes grandes?

Depende del proyecto, pero normalmente funciona mejor un equilibrio. Los componentes pequeños ayudan a reutilizar piezas concretas, mientras que los componentes medianos o grandes facilitan componer emails rápidamente. Lo importante es que cada componente tenga una responsabilidad clara y que la estructura completa siga siendo fácil de entender.

Reutilizar componentes también es diseñar mejor

Organizar componentes reutilizables en MJML no es solo una decisión técnica. También es una decisión de diseño, de mantenimiento y de experiencia de trabajo.

Un buen sistema de componentes evita repetir decisiones, reduce errores, mejora la coherencia visual y permite que cada nuevo email parta de una base sólida. En lugar de preguntarte cada vez cuánto padding debe tener un botón, cómo se construye el footer o qué estructura debe seguir una tarjeta, puedes apoyarte en un sistema ya definido.

Y eso tiene un impacto directo en la calidad final. Porque cuando la estructura está clara, puedes dedicar más energía a lo importante: el mensaje, la jerarquía, la claridad del contenido y la experiencia de quien recibe el email.

MJML ya te da una base mucho más amable que el HTML tradicional para emails. Pero la diferencia entre “usar MJML” y “trabajar bien con MJML” está en cómo organizas tus piezas.

Un proyecto con buenos reusable email components no solo es más cómodo para desarrollar: también es más consistente, más escalable y más fácil de mantener en el tiempo.