Retour au catalogue

Blog Hero Featured

Grande carte hero d'article avec overlay gradient, chips de tags, temps de lecture et auteur.

blogmedium Both Responsive a11y
boldeditorialuniversalagencysaasfullscreen
Theme

Cómo crear un hero de blog con artículo destacado en React

Un hero de blog con artículo destacado en React muestra una gran tarjeta con imagen a sangre completa, un overlay degradado anclado abajo y chips de metadatos, y luego lista los artículos secundarios en una cuadrícula responsive debajo. Las animaciones de entrada se ejecutan una vez al hacer scroll mediante el whileInView de Framer Motion.

  • Stack: React + Framer Motion 11 + Lucide React, ~135 líneas, cero dependencias adicionales.
  • El overlay degradado usa un linear-gradient CSS de var(--color-background) a transparent, así se adapta a cualquier tema.
  • Los artículos secundarios usan una cuadrícula CSS auto-fill (minmax 320px) para un comportamiento responsive totalmente fluido.
  • Accesible: las imágenes llevan un alt vacío (decorativas); el contenido de texto nunca queda oculto por el overlay.
  • Admite los temas claro y oscuro mediante CSS custom properties (themeMode: both).

Blog Hero Featured abre una página de blog o revista con una gran tarjeta de artículo que domina la vista, y luego cede el paso a una fila de artículos de apoyo debajo. La tarjeta destacada superpone una imagen a sangre completa, un degradado inferior que mantiene el texto legible sobre cualquier foto, y una franja de metadatos con autor, fecha, tiempo de lectura y chips de categoría, todo entrando una sola vez al hacer scroll.

Anatomía

El componente se estructura en dos bloques: una tarjeta destacada de ancho completo y una cuadrícula opcional de artículos secundarios. La tarjeta contiene un contenedor de imagen en ratio 2:1, un scrim degradado posicionado en absoluto que asciende desde el color de fondo, y una capa de contenido fijada abajo con chips en flex-wrap, un título escalado con clamp, un párrafo de extracto y una fila de autor. Los artículos secundarios son tarjetas flex horizontales con una miniatura de 120x80px, etiqueta de categoría, título y un icono ArrowRight empujado al extremo.

Cómo funciona

El whileInView + viewport once:true de Framer Motion gestiona todas las animaciones de entrada sin ningún listener de scroll manual. La tarjeta destacada asciende 24px con un fundido (opacity 0 a 1) y una curva personalizada de 0,7s [0.16, 1, 0.3, 1]. Cada artículo secundario se escalona con un retardo de 0,08s por índice sobre un offset base de 0,1s, creando una cascada. El overlay degradado es un único gradient CSS de var(--color-background) al 0% hacia transparent al 60%, por lo que se ve correctamente en cualquier tema sin una sola línea de JS.

Cómo crearlo en React

  1. Crear el armazón de la tarjeta destacada

    Envuelve la tarjeta en un motion.a con opacity:0 y:24 en initial y anímala hacia opacity:1 y:0 mediante whileInView. Dale position:relative, borderRadius desde tu design token, overflow:hidden y un contenedor de imagen en ratio 2:1.

    <motion.a
      initial={{ opacity: 0, y: 24 }}
      whileInView={{ opacity: 1, y: 0 }}
      viewport={{ once: true }}
      transition={{ duration: 0.7, ease: [0.16, 1, 0.3, 1] }}
      style={{ position: "relative", borderRadius: "var(--radius-xl)", overflow: "hidden" }}
    >
  2. Añadir el overlay degradado

    Coloca un div absoluto que cubra toda la tarjeta con un linear-gradient de var(--color-background) al 0% hacia transparent al 60%. Como usas el token de fondo del tema, el overlay funciona en modo claro y oscuro automáticamente.

    <div style={{
      position: "absolute",
      inset: 0,
      background: "linear-gradient(to top, var(--color-background) 0%, transparent 60%)"
    }} />
  3. Fijar los metadatos abajo

    Añade un div de contenido con position:absolute, bottom/left/right 0 y padding. Dentro, renderiza el chip de categoría con un fondo de acento, los chips de tags opcionales, el título con clamp(1.5rem, 3.5vw, 2.5rem) para un escalado fluido, el extracto y la fila de autor con los iconos Clock y User de Lucide React.

  4. Construir la cuadrícula secundaria escalonada

    Renderiza los artículos secundarios en una cuadrícula CSS con gridTemplateColumns: repeat(auto-fill, minmax(320px, 1fr)). Cada artículo es un motion.a con un retardo de escalonado: 0,1 + index * 0,08. El layout flex interior coloca una miniatura de tamaño fijo a la izquierda y el contenido de texto en el espacio restante.

    transition={{ duration: 0.5, delay: 0.1 + i * 0.08, ease: [0.16, 1, 0.3, 1] }}

Cuándo usarlo

Recurre a esta sección como bloque de apertura de cualquier blog, sitio de noticias o plataforma de contenido donde importa la jerarquía editorial. Funciona bien en blogs de producto SaaS, portfolios de agencias con casos de estudio y publicaciones de medios. Evítala en las homepages cuyo objetivo principal es la conversión de producto en lugar del descubrimiento de contenido, y prescinde de la cuadrícula secundaria si tienes menos de dos artículos de apoyo que mostrar.

Usado por

  • Vercel, Tarjeta de artículo destacado a sangre completa con overlay degradado y metadatos de autor en la parte superior del índice del blog.
  • Stripe, Gran post hero con imagen, chip de categoría y tiempo de lectura encima de una cuadrícula de artículos secundarios.
  • Linear, Tarjeta de artículo destacado con una tipografía marcada superpuesta a una imagen de portada, coherente con la estética del producto.
  • Loom, Post de blog hero con imagen de ancho completo y tarjetas de artículos secundarios escalonadas bajo la línea de flotación.

FAQ

¿Cómo se mantiene legible el overlay degradado en modo oscuro?

El degradado parte de var(--color-background), no de un color fijo. Cuando cambia el tema, ese token se actualiza automáticamente, así que el scrim siempre se funde con el fondo real de la página sin JavaScript adicional.

¿Puedo eliminar la cuadrícula de artículos secundarios?

La prop secondaryArticles toma un array vacío por defecto y la cuadrícula solo se renderiza cuando ese array tiene al menos un elemento, así que puedes omitir la prop sin riesgo y la tarjeta destacada se basta por sí sola.

¿Cómo evito que la animación se repita en cada scroll?

El flag viewport: { once: true } en cada elemento motion con whileInView garantiza que la animación de entrada se ejecute exactamente una vez cuando el elemento entra por primera vez en la vista, y luego se queda en su estado final.

¿El título de la tarjeta destacada se adapta en móvil?

El título usa clamp(1.5rem, 3.5vw, 2.5rem), por lo que se reduce de forma fluida hasta 24px en pantallas pequeñas sin media query. El extracto está limitado a 640px de ancho máximo para que nunca se estire de forma incómoda en vistas anchas.

"use client";

import { motion } from "framer-motion";
import { Clock, ArrowRight, User } from "lucide-react";

interface Author {
  name: string;
  avatar: string;
  role: string;
}

interface FeaturedArticle {
  title: string;
  excerpt: string;
  author: Author;
  date: string;
  category: string;
  readTime: string;
  image: string;
  tags: string[];
}

Code complet réservé à Pro

Code source intégral, export multi-framework et playground.

Passer en Pro, 9,99€/mois

Reseñas

Hero de blog React con artículo destacado, Tutorial