Skip to content

Nueva Web: Maquetación completa con CSS ​

Introducción ​

En este curso práctico veremos cómo crear una página web completa HTML5 desde cero, utilizando CSS para maquetar todos los elementos típicos de una web profesional: menú de navegación, logotipo, barra lateral, contenido principal y pie de página.

El resultado final será una página con esta estructura:

text
┌──────────────────────────────────────────────────────┐
│  LOGO    |  Título de la Web                         │
├──────────────────────────────────────────────────────┤
│  Inicio | Servicios | Nosotros | Contacto            │
├────────────────────────┬─────────────────────────────┤
│                        │                             │
│   CONTENIDO            │   SIDEBAR                   │
│   PRINCIPAL            │   (barra lateral)           │
│                        │                             │
│                        │                             │
├────────────────────────┴─────────────────────────────┤
│              FOOTER (pie de página)                   │
└──────────────────────────────────────────────────────┘

Paso 1: Estructura HTML5 ​

Creamos el archivo index.html con la estructura semántica de HTML5:

html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mi Nueva Web</title>
    <link rel="stylesheet" href="estilos.css">
</head>
<body>

    <!-- CABECERA: Logo + Título -->
    <header id="cabecera">
        <img src="logo.png" alt="Logo de la empresa" id="logo">
        <h1>Mi Nueva Web</h1>
    </header>

    <!-- MENÚ DE NAVEGACIÓN -->
    <nav id="menu">
        <ul>
            <li><a href="#">Inicio</a></li>
            <li><a href="#">Servicios</a></li>
            <li><a href="#">Nosotros</a></li>
            <li><a href="#">Blog</a></li>
            <li><a href="#">Contacto</a></li>
        </ul>
    </nav>

    <!-- CONTENIDO PRINCIPAL + SIDEBAR -->
    <div id="contenedor">
        <section id="contenido">
            <h2>Bienvenidos a nuestra web</h2>
            <p>
                Este es el contenido principal de la página.
                Aquí iría la información más importante de nuestro
                sitio web, como artículos, noticias o descripción
                de servicios.
            </p>
            <p>
                Lorem ipsum dolor sit amet, consectetur adipiscing
                elit. Sed do eiusmod tempor incididunt ut labore et
                dolore magna aliqua. Ut enim ad minim veniam, quis
                nostrud exercitation ullamco laboris.
            </p>
            <img src="imagen.jpg" alt="Imagen de ejemplo" id="imagen-contenido">
            <p>
                Duis aute irure dolor in reprehenderit in voluptate
                velit esse cillum dolore eu fugiat nulla pariatur.
                Excepteur sint occaecat cupidatat non proident.
            </p>
        </section>

        <aside id="sidebar">
            <h3>Enlaces de interés</h3>
            <ul>
                <li><a href="#">Enlace 1</a></li>
                <li><a href="#">Enlace 2</a></li>
                <li><a href="#">Enlace 3</a></li>
            </ul>

            <h3>Últimas noticias</h3>
            <p>Noticia 1: lorem ipsum dolor sit amet...</p>
            <p>Noticia 2: consectetur adipiscing elit...</p>

            <h3>Contacto</h3>
            <p>Email: info@miweb.com</p>
            <p>Tel: 900 123 456</p>
        </aside>
    </div>

    <!-- PIE DE PÁGINA -->
    <footer id="pie">
        <p>&copy; 2024 Mi Nueva Web. Todos los derechos reservados.</p>
    </footer>

</body>
</html>

Etiquetas semánticas HTML5 utilizadas ​

EtiquetaFunción
<header>Cabecera de la página o sección
<nav>Bloque de navegación (menús)
<section>Sección de contenido
<aside>Contenido complementario (sidebar)
<footer>Pie de página
<ul> / <li>Listas de enlaces del menú
<a>Enlaces de navegación

Paso 2: CSS base — Reset y estilos generales ​

Creamos el archivo estilos.css y comenzamos con un reset básico para eliminar los estilos por defecto del navegador:

css
/* ===========================
   RESET Y ESTILOS GENERALES
   =========================== */

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: Arial, Helvetica, sans-serif;
    background-color: #f4f4f4;
    color: #333;
    line-height: 1.6;
}

WARNING

La propiedad box-sizing: border-box es fundamental. Hace que el width incluya el padding y el borde, evitando que las cajas se desborden cuando añadimos bordes o relleno.

Paso 3: Cabecera con logo y título ​

Estilizamos la parte superior con el logotipo y el título de la web:

css
/* ===========================
   CABECERA (Logo + Título)
   =========================== */

#cabecera {
    background-color: #2c3e50;
    color: white;
    padding: 20px;
    display: flex;
    align-items: center;
}

#logo {
    width: 80px;
    height: 80px;
    margin-right: 20px;
    border-radius: 50%;         /* Logo circular */
    border: 3px solid white;
}

#cabecera h1 {
    font-size: 2em;
    letter-spacing: 2px;
}

¿Qué hace display: flex? ​

Al poner display: flex en la cabecera, los elementos hijos (logo y título) se colocan en una misma fila automáticamente. Las propiedades align-items: center alinea verticalmente los elementos al centro.

Paso 4: Menú de navegación ​

Creamos una barra de menú horizontal con enlaces:

css
/* ===========================
   MENÚ DE NAVEGACIÓN
   =========================== */

#menu {
    background-color: #34495e;
}

#menu ul {
    list-style: none;           /* Quita los puntos de la lista */
    display: flex;              /* Coloca los elementos en fila */
}

#menu ul li a {
    display: block;
    color: white;
    text-decoration: none;      /* Quita el subrayado */
    padding: 15px 25px;
    transition: background-color 0.3s ease;
}

#menu ul li a:hover {
    background-color: #1abc9c;  /* Color al pasar el ratón */
}

Explicación detallada ​

  • list-style: none elimina las viñetas de las listas <ul>
  • display: flex convierte la lista en una fila horizontal
  • text-decoration: none quita el subrayado azul por defecto de los enlaces
  • transition crea una transición suave de 0.3 segundos cuando pasamos el ratón por encima

Paso 5: Contenido principal y sidebar ​

Utilizamos flexbox para crear un layout de dos columnas:

css
/* ===========================
   CONTENEDOR PRINCIPAL
   =========================== */

#contenedor {
    display: flex;
    margin: 20px auto;
    max-width: 1200px;
    gap: 20px;                  /* Espacio entre columnas */
    padding: 0 20px;
}

/* ===========================
   CONTENIDO PRINCIPAL
   =========================== */

#contenido {
    flex: 3;                    /* Ocupa 3 partes del espacio */
    background-color: white;
    padding: 25px;
    border-radius: 8px;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}

#contenido h2 {
    color: #2c3e50;
    margin-bottom: 15px;
    border-bottom: 2px solid #1abc9c;
    padding-bottom: 10px;
}

#contenido p {
    margin-bottom: 15px;
    text-align: justify;
}

#imagen-contenido {
    width: 100%;
    border-radius: 5px;
    margin: 15px 0;
}

/* ===========================
   SIDEBAR (Barra lateral)
   =========================== */

#sidebar {
    flex: 1;                    /* Ocupa 1 parte del espacio */
    background-color: white;
    padding: 25px;
    border-radius: 8px;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}

#sidebar h3 {
    color: #2c3e50;
    margin-bottom: 10px;
    margin-top: 20px;
    font-size: 1.1em;
}

#sidebar h3:first-child {
    margin-top: 0;
}

#sidebar ul {
    list-style: none;
}

#sidebar ul li {
    padding: 8px 0;
    border-bottom: 1px dotted #ccc;
}

#sidebar ul li a {
    color: #34495e;
    text-decoration: none;
}

#sidebar ul li a:hover {
    color: #1abc9c;
}

Proporciones con flex ​

La propiedad flex: 3 en el contenido y flex: 1 en el sidebar significan que el contenido ocupa 3 partes y el sidebar 1 parte. Esto equivale a un 75% y un 25% aproximadamente.

css
/* ===========================
   FOOTER (Pie de página)
   =========================== */

#pie {
    background-color: #2c3e50;
    color: white;
    text-align: center;
    padding: 20px;
    margin-top: 20px;
}

#pie p {
    font-size: 0.9em;
}

Paso 7: Versión responsive (adaptada a móviles) ​

Añadimos una media query para que la página se adapte a pantallas pequeñas. En dispositivos móviles, las dos columnas se apilarán verticalmente y el menú se mostrará en columna:

css
/* ===========================
   RESPONSIVE (Móviles)
   =========================== */

@media (max-width: 768px) {

    #contenedor {
        flex-direction: column;     /* Las columnas se apilan */
        padding: 0 10px;
    }

    #menu ul {
        flex-direction: column;     /* Menú en columna */
    }

    #menu ul li a {
        text-align: center;
        padding: 12px;
        border-bottom: 1px solid #2c3e50;
    }

    #cabecera {
        flex-direction: column;
        text-align: center;
        padding: 15px;
    }

    #logo {
        margin-right: 0;
        margin-bottom: 10px;
    }

    #cabecera h1 {
        font-size: 1.5em;
    }
}

¿Qué es una media query? ​

Una @media query permite aplicar estilos solo cuando se cumple una condición. En este caso, cuando la pantalla tiene 768px o menos (tablets y móviles), los estilos dentro del bloque se aplican y reemplazan los anteriores.

Código completo ​

A continuación se muestra el HTML y el CSS completo para copiar y pegar directamente.

HTML completo (index.html) ​

html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mi Nueva Web</title>
    <link rel="stylesheet" href="estilos.css">
</head>
<body>

    <header id="cabecera">
        <img src="logo.png" alt="Logo" id="logo">
        <h1>Mi Nueva Web</h1>
    </header>

    <nav id="menu">
        <ul>
            <li><a href="#">Inicio</a></li>
            <li><a href="#">Servicios</a></li>
            <li><a href="#">Nosotros</a></li>
            <li><a href="#">Blog</a></li>
            <li><a href="#">Contacto</a></li>
        </ul>
    </nav>

    <div id="contenedor">
        <section id="contenido">
            <h2>Bienvenidos a nuestra web</h2>
            <p>
                Este es el contenido principal de la página.
                Aquí iría la información más importante de nuestro
                sitio web.
            </p>
            <p>
                Lorem ipsum dolor sit amet, consectetur adipiscing
                elit. Sed do eiusmod tempor incididunt ut labore et
                dolore magna aliqua. Ut enim ad minim veniam, quis
                nostrud exercitation ullamco laboris.
            </p>
            <img src="imagen.jpg" alt="Imagen" id="imagen-contenido">
            <p>
                Duis aute irure dolor in reprehenderit in voluptate
                velit esse cillum dolore eu fugiat nulla pariatur.
                Excepteur sint occaecat cupidatat non proident.
            </p>
        </section>

        <aside id="sidebar">
            <h3>Enlaces de interés</h3>
            <ul>
                <li><a href="#">Enlace 1</a></li>
                <li><a href="#">Enlace 2</a></li>
                <li><a href="#">Enlace 3</a></li>
            </ul>
            <h3>Últimas noticias</h3>
            <p>Noticia 1: lorem ipsum dolor sit amet...</p>
            <p>Noticia 2: consectetur adipiscing elit...</p>
            <h3>Contacto</h3>
            <p>Email: info@miweb.com</p>
            <p>Tel: 900 123 456</p>
        </aside>
    </div>

    <footer id="pie">
        <p>&copy; 2024 Mi Nueva Web. Todos los derechos reservados.</p>
    </footer>

</body>
</html>

CSS completo (estilos.css) ​

css
/* RESET */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    font-family: Arial, Helvetica, sans-serif;
    background-color: #f4f4f4;
    color: #333;
    line-height: 1.6;
}

/* CABECERA */
#cabecera {
    background-color: #2c3e50;
    color: white;
    padding: 20px;
    display: flex;
    align-items: center;
}

#logo {
    width: 80px;
    height: 80px;
    margin-right: 20px;
    border-radius: 50%;
    border: 3px solid white;
}

#cabecera h1 {
    font-size: 2em;
    letter-spacing: 2px;
}

/* MENÚ */
#menu {
    background-color: #34495e;
}

#menu ul {
    list-style: none;
    display: flex;
}

#menu ul li a {
    display: block;
    color: white;
    text-decoration: none;
    padding: 15px 25px;
    transition: background-color 0.3s ease;
}

#menu ul li a:hover {
    background-color: #1abc9c;
}

/* CONTENEDOR */
#contenedor {
    display: flex;
    margin: 20px auto;
    max-width: 1200px;
    gap: 20px;
    padding: 0 20px;
}

/* CONTENIDO */
#contenido {
    flex: 3;
    background-color: white;
    padding: 25px;
    border-radius: 8px;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}

#contenido h2 {
    color: #2c3e50;
    margin-bottom: 15px;
    border-bottom: 2px solid #1abc9c;
    padding-bottom: 10px;
}

#contenido p {
    margin-bottom: 15px;
    text-align: justify;
}

#imagen-contenido {
    width: 100%;
    border-radius: 5px;
    margin: 15px 0;
}

/* SIDEBAR */
#sidebar {
    flex: 1;
    background-color: white;
    padding: 25px;
    border-radius: 8px;
    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}

#sidebar h3 {
    color: #2c3e50;
    margin-bottom: 10px;
    margin-top: 20px;
    font-size: 1.1em;
}

#sidebar h3:first-child {
    margin-top: 0;
}

#sidebar ul {
    list-style: none;
}

#sidebar ul li {
    padding: 8px 0;
    border-bottom: 1px dotted #ccc;
}

#sidebar ul li a {
    color: #34495e;
    text-decoration: none;
}

#sidebar ul li a:hover {
    color: #1abc9c;
}

/* FOOTER */
#pie {
    background-color: #2c3e50;
    color: white;
    text-align: center;
    padding: 20px;
    margin-top: 20px;
}

#pie p {
    font-size: 0.9em;
}

/* RESPONSIVE */
@media (max-width: 768px) {

    #contenedor {
        flex-direction: column;
        padding: 0 10px;
    }

    #menu ul {
        flex-direction: column;
    }

    #menu ul li a {
        text-align: center;
        padding: 12px;
        border-bottom: 1px solid #2c3e50;
    }

    #cabecera {
        flex-direction: column;
        text-align: center;
        padding: 15px;
    }

    #logo {
        margin-right: 0;
        margin-bottom: 10px;
    }

    #cabecera h1 {
        font-size: 1.5em;
    }
}

Resumen de conceptos CSS utilizados ​

ConceptoPropiedad CSSUso en la página
Flexboxdisplay: flexCabecera, menú, contenedor de columnas
Proporcionesflex: 3, flex: 1Contenido 75% / Sidebar 25%
Reset* { margin: 0; padding: 0 }Eliminar estilos por defecto
Box modelbox-sizing: border-boxIncluir padding y borde en el width
TransicionestransitionEfecto suave al pasar el ratón
Sombrasbox-shadowEfecto de elevación en cajas
Bordes redondeadosborder-radiusEsquinas suaves en cajas e imágenes
Media queries@media (max-width: 768px)Adaptar a móviles
Posicionamientomargin: autoCentrar el contenedor principal

Propiedades CSS adicionales para mejorar ​

Sombras de texto ​

css
#cabecera h1 {
    text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}

Degradados de fondo ​

css
#cabecera {
    background: linear-gradient(135deg, #2c3e50, #3498db);
}

Fuentes personalizadas (Google Fonts) ​

Añadir en el <head> del HTML:

html
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet">

Y en el CSS:

css
body {
    font-family: 'Roboto', sans-serif;
}

Ejercicios propuestos ​

Ejercicio 1 ​

Añadir un submenu desplegable al menú de navegación que aparezca al pasar el ratón sobre "Servicios". El submenú debe contener los enlaces: "Diseño Web", "Desarrollo" y "SEO".

Ejercicio 2 ​

Convertir el layout de dos columnas en tres columnas: contenido principal (50%), sidebar derecha (25%) y una columna de publicidad a la izquierda (25%).

Ejercicio 3 ​

Añadir un banner grande (hero image) entre el menú y el contenedor principal que ocupe el 100% del ancho y tenga un texto superpuesto con un botón de llamada a la acción.

Ejercicio 4 ​

Crear una versión oscura (dark mode) de la página usando la media query:

css
@media (prefers-color-scheme: dark) {
    body {
        background-color: #1a1a1a;
        color: #f0f0f0;
    }

    #contenido, #sidebar {
        background-color: #2d2d2d;
    }
}

Publicado bajo la licencia MIT.