Tutorial WordPress: Diseñar un bloque de testimonios apilados con CSS

·

·

Introducción

Este tutorial muestra, con todo lujo de detalles, cómo diseñar un bloque de testimonios apilados para WordPress utilizando CSS moderno. El objetivo es conseguir un bloque visual, accesible y fácilmente integrable en Gutenberg o en cualquier plantilla, con tarjetas de testimonios que aparecen apiladas con ligero solapamiento y comportamiento responsivo y animado.

Visión general y objetivos

Requisitos previos

  1. WordPress 5.8 (o cualquier versión con editor de bloques moderno).
  2. Conocimiento básico de CSS, HTML y registrar/encolar assets en WordPress.
  3. Opcional: experiencia creando bloques con registerBlockType o bloques renderizados en servidor.

Estructura HTML recomendada

Usa un marcado semántico sencillo: una lista de testimonios o una serie de article con blockquote y cite. A continuación se muestra una estructura típica que puedes usar como plantilla dentro del bloque (este bloque es sólo ejemplo de contenido el HTML real va dentro del editor o se genera dinámicamente desde PHP/JS).

Excelentes resultados con el servicio. La atención fue cercana y profesional.
Ana García CEO, Empresa X
El equipo cumplió los plazos y decidió soluciones efectivas para nosotros.
Carlos López Marketing Manager
Recomendado al 100%. Comunicación clara y resultados visibles en semanas.
María Ruiz Freelance

CSS base: diseño apilado y visual

La idea es usar variables CSS para facilitar la personalización y emplear transformaciones con z-index para crear el efecto de apilamiento. Aquí un CSS completo y comentado que sirve como punto de partida.

:root{
  --testi-bg: #ffffff
  --testi-accent: #0a84ff
  --testi-text: #222222
  --testi-muted: #6b6b6b
  --testi-radius: 12px
  --testi-shadow: 0 8px 24px rgba(18, 18, 18, 0.12)
  --testi-gap: 18px / espacio vertical entre elementos apilados /
  --testi-max-width: 720px
}

/ Contenedor principal /
.stacked-testimonials{
  max-width: var(--testi-max-width)
  margin: 0 auto
  padding: calc(var(--testi-gap)  1.25) 1rem
  position: relative
  / evita que elementos flotantes overflow: visible /
}

/ Reset básico de artículos para controlar posicionamiento /
.stacked-testimonials .testimonial{
  background: var(--testi-bg)
  color: var(--testi-text)
  border-radius: var(--testi-radius)
  box-shadow: var(--testi-shadow)
  padding: 1.25rem 1.25rem
  border: 1px solid rgba(10,10,10,0.04)
  transition: transform 320ms cubic-bezier(.2,.9,.25,1), box-shadow 320ms
  position: relative
  / cada tarjeta ocupa el mismo ancho /
  width: 100%
  / para el orden visual /
  transform-origin: center top
}

/ Estilo del contenido interior /
.stacked-testimonials .testimonial__quote{
  font-size: 1rem
  line-height: 1.5
  margin: 0 0 0.75rem 0
}

/ Metadatos /
.stacked-testimonials .testimonial__meta{
  display: flex
  flex-direction: column
  gap: 0.2rem
  color: var(--testi-muted)
  font-size: 0.9rem
}

/ Efecto de apilamiento: desplazamientos y z-index /
.stacked-testimonials .testimonial:nth-child(1){
  z-index: 30
  transform: translateY(0) scale(1)
}
.stacked-testimonials .testimonial:nth-child(2){
  z-index: 20
  transform: translateY(var(--testi-gap)) scale(.985)
  opacity: 0.98
}
.stacked-testimonials .testimonial:nth-child(3){
  z-index: 10
  transform: translateY(calc(var(--testi-gap)  2)) scale(.97)
  opacity: 0.95
}
/ Si hay más elementos, se pueden añadir más reglas o usar una regla genérica con nth-child(n) /

/ Al pasar el ratón o focus, elevamos la tarjeta y traemos al frente /
.stacked-testimonials .testimonial:hover,
.stacked-testimonials .testimonial:focus{
  transform: translateY(0) scale(1.006)
  z-index: 60 !important
  box-shadow: 0 18px 36px rgba(18,18,18,0.18)
}

/ En dispositivos pequeños mostramos la lista sin solapar (mejor legibilidad) /
@media (max-width: 640px){
  .stacked-testimonials .testimonial{
    transform: none !important
    margin-bottom: 1rem
  }
  .stacked-testimonials{
    padding: 1rem
  }
}

/ Opcional: pequeñas rotaciones para estilo más apilado /
.stacked-testimonials .testimonial:nth-child(2){
  transform: translateY(var(--testi-gap)) rotate(-0.6deg) scale(.986)
}
.stacked-testimonials .testimonial:nth-child(3){
  transform: translateY(calc(var(--testi-gap)  2)) rotate(0.6deg) scale(.974)
}

Comportamiento responsivo y variantes

Para pantallas pequeñas es preferible eliminar el solapamiento y mostrar las tarjetas en columna normal. Para pantallas muy grandes puedes aumentar los offsets o incluso mostrar 2 columnas con apilamiento en cada columna.

/ Dos columnas en pantallas grandes, manteniendo apilamiento por columna /
@media (min-width: 1100px){
  .stacked-testimonials{
    display: grid
    grid-template-columns: 1fr 1fr
    gap: 2rem
  }
  / controla la lógica de apilamiento por columna si el HTML lo organiza así /
}

Animaciones y microinteracciones

Las animaciones deben ser sutiles. Hemos usado transiciones en transform y box-shadow. Para mejorar la percepción de profundidad puedes añadir un pequeño delay progresivo para cada tarjeta.

.stacked-testimonials .testimonial{
  transition: transform 360ms cubic-bezier(.2,.9,.25,1), box-shadow 360ms
}
.stacked-testimonials .testimonial:nth-child(1){
  transition-delay: 0ms
}
.stacked-testimonials .testimonial:nth-child(2){
  transition-delay: 30ms
}
.stacked-testimonials .testimonial:nth-child(3){
  transition-delay: 60ms
}

Accesibilidad y consideraciones semánticas

@media (prefers-reduced-motion: reduce){
  .stacked-testimonials .testimonial{
    transition: none
    transform: none !important
  }
}

Integración con Gutenberg — ejemplo de registro de bloque (PHP)

A continuación un ejemplo básico de cómo registrar un bloque que carga estilos front-end y editor. Ajusta rutas y nombres según tu plugin/tema.

 st-styles,
        style => st-styles,
        // render_callback => st_render_testimonials // si quieres render server-side
    ) )
}
add_action( init, st_register_block )
?>

Renderizado server-side (opcional)

Si prefieres generar el HTML desde PHP (útil para contenido dinámico o integrado con CPTs), puedes usar un render_callback.


    foreach ( items as item ) {
        quote = esc_html( item[quote] )
        author = esc_html( item[author] )
        role = isset(item[role]) ? esc_html(item[role]) : 
        printf(
            
%s
%s%s
, author, quote, author, role ) } echo
return ob_get_clean() } ?>

Encolar estilos desde el tema (ejemplo)


Personalización y variables CSS

Ofrece variables CSS personalizables para que el usuario final pueda adaptar colores, radio, sombras, etc. Si cargas CSS desde un bloque, proporciona opciones en el inspector de bloques que inyecten variables en línea o clases modificadoras.

/ Ejemplo: clase modificadora para tema oscuro /
.stacked-testimonials.theme-dark{
  --testi-bg: #0f1720
  --testi-text: #e6eef8
  --testi-muted: #9fb2cf
  --testi-shadow: 0 10px 28px rgba(2,6,23,0.6)
}

Optimización y buenas prácticas

  1. Minimiza y concatena CSS cuando sea posible para reducir peticiones.
  2. Usa variables para facilitar overrides desde el tema o customizer.
  3. Prueba en móviles y con lectores de pantalla para garantizar accesibilidad.
  4. Controla el número de elementos visibles inicialmente si la lista es larga (lazy load o paginación si procede).
  5. Evita dependencias pesadas el diseño mostrado usa solo CSS moderno.

Ejemplo completo resumido

Para facilitar su uso, aquí tienes una versión reducida del CSS y la estructura HTML que puedes copiar como base en tu bloque o plantilla:


Gran servicio.
Ana
Muy profesionales.
Carlos
Recomendado.
María
/ CSS reducido /
.stacked-testimonials{max-width:720pxmargin:0 autopadding:24px}
.stacked-testimonials .testimonial{background:#fffpadding:16pxborder-radius:12pxbox-shadow:0 8px 24px rgba(0,0,0,.12)transition:transform .32s,box-shadow .32sposition:relative}
.stacked-testimonials .testimonial:nth-child(2){transform:translateY(18px) scale(.985)z-index:20}
.stacked-testimonials .testimonial:nth-child(3){transform:translateY(36px) scale(.97)z-index:10}
.stacked-testimonials .testimonial:hover{transform:translateY(0) scale(1.006)z-index:60}
@media(max-width:640px){.stacked-testimonials .testimonial{transform:nonemargin-bottom:12px}}

Conclusión

Con CSS moderno puedes crear un bloque de testimonios apilados atractivo, responsivo y accesible sin depender de librerías externas. La clave es combinar variables CSS para personalización, transformaciones y z-index para el efecto apilado, y transiciones sutiles para mejorar la experiencia. Integra los estilos en tu bloque o tema mediante la API de WordPress y ofrece ajustes en el inspector del bloque para que los usuarios finales personalicen colores y espaciados.



Leave a Reply

Your email address will not be published. Required fields are marked *