En esta serie aprendimos HTML y CSS desde sus fundamentos hasta Flexbox, Grid, responsive design y posicionamiento. Ahora vamos a integrar todo en un proyecto completo.
El objetivo será construir una landing page responsive para una academia ficticia llamada CodeStart.
Importante: este proyecto utiliza solamente HTML y CSS. Todavía no hay lógica ni interacción programada con JavaScript.
Qué vamos a construir
La página tendrá:
- cabecera con navegación;
- sección principal o hero;
- tarjetas de cursos;
- sección de beneficios;
- llamada a la acción;
- pie de página;
- diseño responsive;
- Flexbox y CSS Grid;
- posicionamiento y elementos decorativos.
Estructura de archivos
Creá una carpeta para el proyecto y dentro guardá estos archivos:
codestart/ | |-- index.html |-- styles.css
Recordá que el archivo HTML debe guardarse realmente con extensión .html. Por ejemplo: index.html.
Paso 1: crear el HTML
Este será nuestro archivo index.html completo:
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CodeStart - Aprendé desarrollo web</title> <link rel="stylesheet" href="styles.css"> </head> <body> <header class="cabecera"> <div class="contenedor cabecera-interior"> <a href="#" class="logo"> CodeStart </a> <nav class="menu"> <a href="#cursos">Cursos</a> <a href="#beneficios">Beneficios</a> <a href="#contacto">Contacto</a> </nav> </div> </header> <main> <section class="hero"> <div class="contenedor hero-grid"> <div class="hero-contenido"> <span class="etiqueta"> Aprendé paso a paso </span> <h1> Empezá hoy tu camino en desarrollo web </h1> <p> Aprendé HTML, CSS y JavaScript con ejercicios, proyectos y explicaciones claras. </p> <a href="#cursos" class="boton"> Ver cursos </a> </div> <div class="hero-tarjeta"> <span class="badge"> Ruta recomendada </span> <h2>Desarrollo Web</h2> <ul> <li>HTML</li> <li>CSS</li> <li>JavaScript</li> </ul> </div> </div> </section> <section id="cursos" class="seccion"> <div class="contenedor"> <div class="titulo-seccion"> <span>Cursos</span> <h2>Empezá por los fundamentos</h2> <p> Una ruta progresiva para aprender desde cero. </p> </div> <div class="grid-cursos"> <article class="curso"> <span class="numero">01</span> <h3>HTML</h3> <p> Aprendé a estructurar correctamente una página web. </p> </article> <article class="curso"> <span class="numero">02</span> <h3>CSS</h3> <p> Diseñá interfaces, layouts y sitios responsive. </p> </article> <article class="curso"> <span class="numero">03</span> <h3>JavaScript</h3> <p> Incorporá comportamiento e interacción a tus páginas. </p> </article> </div> </div> </section> <section id="beneficios" class="seccion beneficios"> <div class="contenedor beneficios-grid"> <div> <span class="subtitulo">Por qué aprender acá</span> <h2>Aprender haciendo</h2> <p> La mejor forma de entender desarrollo web es escribir código, cometer errores y resolver problemas reales. </p> </div> <div class="lista-beneficios"> <article> <h3>Ejemplos claros</h3> <p>Código explicado paso a paso.</p> </article> <article> <h3>Práctica constante</h3> <p>Ejercicios para consolidar cada concepto.</p> </article> <article> <h3>Proyectos reales</h3> <p>Integración de conocimientos en proyectos completos.</p> </article> </div> </div> </section> <section class="cta"> <div class="contenedor cta-interior"> <div> <h2>¿Listo para empezar?</h2> <p> El mejor momento para practicar es ahora. </p> </div> <a href="#cursos" class="boton boton-claro"> Comenzar </a> </div> </section> </main> <footer id="contacto" class="footer"> <div class="contenedor footer-interior"> <p> © CodeStart </p> <p> Proyecto educativo HTML + CSS </p> </div> </footer> </body> </html>
Paso 2: crear los estilos base
Ahora abrí styles.css.
Empezamos normalizando el modelo de caja y definiendo estilos generales:
*, *::before, *::after { box-sizing: border-box; } html { scroll-behavior: smooth; } body { margin: 0; font-family: Arial, Helvetica, sans-serif; color: #1f2937; background-color: #ffffff; line-height: 1.6; } img { max-width: 100%; height: auto; } a { color: inherit; } .contenedor { width: 90%; max-width: 1180px; margin: 0 auto; }
Paso 3: cabecera y navegación
Usaremos Flexbox para distribuir el logo y el menú.
.cabecera { position: sticky; top: 0; z-index: 100; background-color: rgba(255, 255, 255, 0.96); border-bottom: 1px solid #e5e7eb; } .cabecera-interior { display: flex; flex-direction: column; gap: 1rem; padding: 1rem 0; } .logo { color: #007bff; font-size: 1.5rem; font-weight: 700; text-decoration: none; } .menu { display: flex; flex-wrap: wrap; gap: 1rem; } .menu a { text-decoration: none; font-weight: 600; }
Paso 4: sección principal
El hero combinará Grid, tipografía adaptable y un fondo degradado.
.hero { padding: clamp(4rem, 9vw, 8rem) 0; color: white; background: linear-gradient(135deg, #0b1220, #1e3a8a); } .hero-grid { display: grid; grid-template-columns: 1fr; gap: 3rem; align-items: center; } .hero h1 { max-width: 760px; margin: 1rem 0; font-size: clamp(2.5rem, 7vw, 4.8rem); line-height: 1.05; } .hero-contenido p { max-width: 650px; margin-bottom: 2rem; font-size: 1.1rem; color: #dbeafe; } .etiqueta, .subtitulo { display: inline-block; color: #93c5fd; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; } .boton { display: inline-block; padding: 0.9rem 1.4rem; color: white; background-color: #007bff; border-radius: 8px; text-decoration: none; font-weight: 700; }
Paso 5: tarjeta destacada y posicionamiento
Vamos a aprovechar position: relative y absolute para ubicar una etiqueta.
.hero-tarjeta { position: relative; padding: 2rem; color: #0b1220; background-color: white; border-radius: 16px; } .hero-tarjeta ul { margin: 1.5rem 0 0; padding-left: 1.2rem; } .badge { position: absolute; top: -14px; right: 20px; padding: 0.45rem 0.8rem; color: #0b1220; background-color: #fbbf24; border-radius: 999px; font-size: 0.85rem; font-weight: 700; }
Paso 6: sección de cursos con CSS Grid
.seccion { padding: clamp(4rem, 8vw, 7rem) 0; } .titulo-seccion { max-width: 680px; margin-bottom: 2.5rem; } .titulo-seccion > span { color: #007bff; font-weight: 700; text-transform: uppercase; } .titulo-seccion h2 { margin: 0.5rem 0; font-size: clamp(2rem, 4vw, 3rem); } .grid-cursos { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1.5rem; } .curso { position: relative; padding: 2rem; border: 1px solid #e5e7eb; border-radius: 14px; background-color: #ffffff; } .numero { display: inline-block; margin-bottom: 1rem; color: #007bff; font-weight: 700; } .curso h3 { margin: 0 0 0.7rem; font-size: 1.5rem; }
Paso 7: beneficios
.beneficios { background-color: #f8fafc; } .beneficios-grid { display: grid; grid-template-columns: 1fr; gap: 3rem; } .beneficios h2 { margin: 0.5rem 0 1rem; font-size: clamp(2rem, 4vw, 3rem); } .lista-beneficios { display: grid; gap: 1rem; } .lista-beneficios article { padding: 1.4rem; background-color: white; border-left: 4px solid #007bff; border-radius: 8px; } .lista-beneficios h3 { margin-top: 0; }
Paso 8: llamada a la acción
.cta { padding: 3rem 0; color: white; background-color: #007bff; } .cta-interior { display: flex; flex-direction: column; gap: 1.5rem; align-items: flex-start; } .cta h2, .cta p { margin-top: 0; } .boton-claro { color: #0b1220; background-color: white; }
Paso 9: footer
.footer { padding: 2rem 0; color: #cbd5e1; background-color: #0b1220; } .footer-interior { display: flex; flex-direction: column; gap: 0.5rem; } .footer p { margin: 0; }
Paso 10: hacerlo responsive
El diseño base fue pensado primero para pantallas pequeñas. Ahora ampliamos el layout cuando tenemos más espacio.
@media (min-width: 768px) { .cabecera-interior { flex-direction: row; align-items: center; justify-content: space-between; } .hero-grid { grid-template-columns: minmax(0, 1.5fr) minmax(280px, 0.8fr); } .beneficios-grid { grid-template-columns: 1fr 1fr; align-items: start; } .cta-interior { flex-direction: row; align-items: center; justify-content: space-between; } .footer-interior { flex-direction: row; justify-content: space-between; align-items: center; } }
CSS completo
Si preferís comparar el resultado final, este es el archivo styles.css completo:
*, *::before, *::after { box-sizing: border-box; } html { scroll-behavior: smooth; } body { margin: 0; font-family: Arial, Helvetica, sans-serif; color: #1f2937; background-color: #ffffff; line-height: 1.6; } img { max-width: 100%; height: auto; } a { color: inherit; } .contenedor { width: 90%; max-width: 1180px; margin: 0 auto; } .cabecera { position: sticky; top: 0; z-index: 100; background-color: rgba(255, 255, 255, 0.96); border-bottom: 1px solid #e5e7eb; } .cabecera-interior { display: flex; flex-direction: column; gap: 1rem; padding: 1rem 0; } .logo { color: #007bff; font-size: 1.5rem; font-weight: 700; text-decoration: none; } .menu { display: flex; flex-wrap: wrap; gap: 1rem; } .menu a { text-decoration: none; font-weight: 600; } .hero { padding: clamp(4rem, 9vw, 8rem) 0; color: white; background: linear-gradient(135deg, #0b1220, #1e3a8a); } .hero-grid { display: grid; grid-template-columns: 1fr; gap: 3rem; align-items: center; } .hero h1 { max-width: 760px; margin: 1rem 0; font-size: clamp(2.5rem, 7vw, 4.8rem); line-height: 1.05; } .hero-contenido p { max-width: 650px; margin-bottom: 2rem; font-size: 1.1rem; color: #dbeafe; } .etiqueta, .subtitulo { display: inline-block; color: #93c5fd; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; } .boton { display: inline-block; padding: 0.9rem 1.4rem; color: white; background-color: #007bff; border-radius: 8px; text-decoration: none; font-weight: 700; } .hero-tarjeta { position: relative; padding: 2rem; color: #0b1220; background-color: white; border-radius: 16px; } .hero-tarjeta ul { margin: 1.5rem 0 0; padding-left: 1.2rem; } .badge { position: absolute; top: -14px; right: 20px; padding: 0.45rem 0.8rem; color: #0b1220; background-color: #fbbf24; border-radius: 999px; font-size: 0.85rem; font-weight: 700; } .seccion { padding: clamp(4rem, 8vw, 7rem) 0; } .titulo-seccion { max-width: 680px; margin-bottom: 2.5rem; } .titulo-seccion > span { color: #007bff; font-weight: 700; text-transform: uppercase; } .titulo-seccion h2, .beneficios h2 { margin: 0.5rem 0 1rem; font-size: clamp(2rem, 4vw, 3rem); } .grid-cursos { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1.5rem; } .curso { position: relative; padding: 2rem; border: 1px solid #e5e7eb; border-radius: 14px; background-color: #ffffff; } .numero { display: inline-block; margin-bottom: 1rem; color: #007bff; font-weight: 700; } .curso h3 { margin: 0 0 0.7rem; font-size: 1.5rem; } .beneficios { background-color: #f8fafc; } .beneficios-grid { display: grid; grid-template-columns: 1fr; gap: 3rem; } .lista-beneficios { display: grid; gap: 1rem; } .lista-beneficios article { padding: 1.4rem; background-color: white; border-left: 4px solid #007bff; border-radius: 8px; } .lista-beneficios h3 { margin-top: 0; } .cta { padding: 3rem 0; color: white; background-color: #007bff; } .cta-interior { display: flex; flex-direction: column; gap: 1.5rem; align-items: flex-start; } .cta h2, .cta p { margin-top: 0; } .boton-claro { color: #0b1220; background-color: white; } .footer { padding: 2rem 0; color: #cbd5e1; background-color: #0b1220; } .footer-interior { display: flex; flex-direction: column; gap: 0.5rem; } .footer p { margin: 0; } @media (min-width: 768px) { .cabecera-interior { flex-direction: row; align-items: center; justify-content: space-between; } .hero-grid { grid-template-columns: minmax(0, 1.5fr) minmax(280px, 0.8fr); } .beneficios-grid { grid-template-columns: 1fr 1fr; align-items: start; } .cta-interior { flex-direction: row; align-items: center; justify-content: space-between; } .footer-interior { flex-direction: row; justify-content: space-between; align-items: center; } }
Qué conceptos estamos integrando
Este proyecto utiliza prácticamente toda la ruta de CSS:
- selectores;
- clases;
- modelo de caja;
- tipografías;
- colores y fondos;
- unidades relativas;
clamp();- Flexbox;
- CSS Grid;
gap;minmax();- responsive design;
- media queries;
- mobile-first;
position: sticky;position: absolute;z-index.
Cómo probar el proyecto
Guardá ambos archivos y abrí index.html con tu navegador.
Después:
- agrandá y achicá la ventana;
- probá el modo responsive de las herramientas de desarrollo;
- verificá que no aparezca scroll horizontal;
- observá cómo cambia el hero a partir de 768px;
- comprobá cómo las tarjetas se reorganizan automáticamente.
Mejoras para practicar por tu cuenta
Podés continuar el proyecto agregando:
- una imagen real en el hero;
- más tarjetas;
- una sección de testimonios;
- un formulario de contacto;
- estados
:hoverpara enlaces y botones; - transiciones CSS;
- un menú específico para pantallas pequeñas;
- una segunda página;
- una paleta de colores propia.
HTML, CSS y el siguiente paso
Con HTML ya podemos definir la estructura y el significado del contenido.
Con CSS podemos controlar la presentación, el layout y la adaptación visual.
Pero todavía nuestro sitio no puede reaccionar realmente a acciones del usuario, tomar decisiones o modificar dinámicamente el contenido.
Ahí entra JavaScript.
HTML → estructura y contenido CSS → estilos y presentación JavaScript → comportamiento e interacción
Ruta completada
Si llegaste hasta acá, ya recorriste una base muy sólida de HTML y CSS.
La guía anterior fue:
Posicionamiento en CSS: static, relative, absolute, fixed, sticky y z-index
El próximo gran paso de la ruta será:
Introducción a JavaScript: qué es, cómo funciona y para qué se utiliza.
¿Te sirvió este proyecto? ☕
Si este contenido te ayudó a aprender desarrollo web, podés apoyar a Club Programador.
🇦🇷 Apoyar desde Argentina
☕ Invitame un café con Mercado Pago