Seleccionar página

Curso presencial y gratuito en el Cibernàrium de Barcelona ActivaCurs presencial i gratuït al Cibernàrium de Barcelona Activa

Front-End Developer Curso en Barcelona: HTML, CSS y Bootstrap desde ceroCurs a Barcelona: HTML, CSS i Bootstrap des de zero

El itinerario completo para empezar como Front-End Developer: HTML, CSS y Bootstrap en cuatro sesiones de cuatro horas en las que picamos el código en directo. Aquí tienes la teoría, todas las prácticas comentadas, los ejercicios extra y las descargas.L'itinerari complet per començar com a Front-End Developer: HTML, CSS i Bootstrap en quatre sessions de quatre hores en què piquem el codi en directe. Aquí tens la teoria, totes les pràctiques comentades, els exercicis extra i les descàrregues.

Empezar por la sesión 1Comença per la sessió 1

JavaScript se trabaja en un curso aparte de tres sesiones.El JavaScript es treballa en un curs a part de tres sessions.

  1. 1HTML: estructura y contenidoHTML: estructura i contingut4 h
  2. 2CSS I: selectores, color, texto y modelo de cajaCSS I: selectors, color, text i model de capsa4 h
  3. 3CSS II: maquetación con position, Flexbox y responsiveCSS II: maquetació amb position, Flexbox i responsive4 h
  4. 4Bootstrap 5: rejilla y componentesBootstrap 5: graella i components4 h

Datos del cursoDades del curs

Cada edición se imparte en una de las dos sedes del Cibernàrium. Consulta fechas, horario y sede en la ficha de inscripción de Barcelona Activa.Cada edició s'imparteix en una de les dues seus del Cibernàrium. Consulta dates, horari i seu a la fitxa d'inscripció de Barcelona Activa.

DuraciónDurada
16 horas: cuatro sesiones de cuatro horas16 hores: quatre sessions de quatre hores
Sede 22@Seu 22@
Cibernàrium 22@, edificio MediaTIC, Roc Boronat 117, 08018 BarcelonaCibernàrium 22@, edifici MediaTIC, Roc Boronat 117, 08018 Barcelona
Sede Nou BarrisSeu Nou Barris
Cibernàrium Nou Barris, Parc Tecnològic, Marie Curie 8-14, 08042 BarcelonaCibernàrium Nou Barris, Parc Tecnològic, Marie Curie 8-14, 08042 Barcelona
PrecioPreu
Gratuito, con inscripción previa en Barcelona ActivaGratuït, amb inscripció prèvia a Barcelona Activa
NivelNivell
Iniciación. No hace falta saber programarIniciació. No cal saber programar
ContenidosContinguts
HTML5, CSS, Flexbox, diseño responsive y Bootstrap 5HTML5, CSS, Flexbox, disseny responsive i Bootstrap 5

Ver cursos en el CibernàriumVeure cursos al Cibernàrium

Competencias adquiridasCompetències adquirides

  • Escribir páginas HTML5 válidas y semánticas, con textos, enlaces, imágenes, vídeo y formularios accesibles.Escriure pàgines HTML5 vàlides i semàntiques, amb textos, enllaços, imatges, vídeo i formularis accessibles.
  • Organizar un proyecto web en carpetas y enlazar archivos con rutas relativas sin errores.Organitzar un projecte web en carpetes i enllaçar fitxers amb rutes relatives sense errors.
  • Dar estilo a una web con CSS: selectores, color, tipografía, modelo de caja y medidas relativas.Donar estil a una web amb CSS: selectors, color, tipografia, model de capsa i mides relatives.
  • Maquetar secciones y páginas completas con Flexbox y adaptarlas al móvil con media queries.Maquetar seccions i pàgines completes amb Flexbox i adaptar-les al mòbil amb media queries.
  • Construir una landing responsive con la rejilla y los componentes de Bootstrap 5 y personalizarla con CSS propio.Construir una landing responsive amb la graella i els components de Bootstrap 5 i personalitzar-la amb CSS propi.
  • Diagnosticar y corregir problemas de diseño con el inspector del navegador.Diagnosticar i corregir problemes de disseny amb l'inspector del navegador.

SesiónSessió 1

HTML: estructura y contenidoHTML: estructura i contingut

Montamos el entorno de trabajo y escribimos nuestras primeras páginas: textos, enlaces, imágenes, vídeo, formularios y la estructura semántica que usa cualquier web profesional.Muntem l'entorn de treball i escrivim les primeres pàgines: textos, enllaços, imatges, vídeo, formularis i l'estructura semàntica que fa servir qualsevol web professional.

TeoríaTeoria

Cómo funciona la webCom funciona el web

Cuando escribes una dirección en el navegador, tu ordenador (el cliente) pide unos archivos a otro ordenador conectado a internet (el servidor). El servidor responde con archivos HTML, CSS, imágenes y JavaScript, y el navegador los interpreta y dibuja la página.

  • HTML define la estructura y el contenido: qué es un título, un párrafo, una imagen o un enlace.
  • CSS define el aspecto: colores, tipografías, tamaños y dónde va cada cosa.
  • JavaScript añade comportamiento: reaccionar a clics, cargar datos, animar. Se trabaja en un curso aparte.

Un buen símil: HTML es el esqueleto, CSS la ropa y JavaScript los músculos.

Quan escrius una adreça al navegador, el teu ordinador (el client) demana uns fitxers a un altre ordinador connectat a internet (el servidor). El servidor respon amb fitxers HTML, CSS, imatges i JavaScript, i el navegador els interpreta i dibuixa la pàgina.

  • HTML defineix l'estructura i el contingut: què és un títol, un paràgraf, una imatge o un enllaç.
  • CSS defineix l'aspecte: colors, tipografies, mides i on va cada cosa.
  • JavaScript afegeix comportament: reaccionar a clics, carregar dades, animar. Es treballa en un curs a part.

Un bon símil: l'HTML és l'esquelet, el CSS la roba i el JavaScript els músculs.

Breve historia de HTMLBreu història de l'HTML

Tim Berners-Lee creó HTML en 1991, en el CERN, para compartir documentos científicos enlazados entre sí. En los noventa llegaron las versiones 2, 3 y 4, con tablas, formularios y la primera separación entre contenido y diseño.

En 2014 se publicó HTML5, con etiquetas semánticas (header, nav, main…), vídeo y audio sin plugins y nuevos tipos de formulario. Hoy HTML es un estándar vivo que mantiene el WHATWG: se actualiza de forma continua y ya no recibe números de versión.

Tim Berners-Lee va crear l'HTML el 1991, al CERN, per compartir documents científics enllaçats entre ells. Als noranta van arribar les versions 2, 3 i 4, amb taules, formularis i la primera separació entre contingut i disseny.

El 2014 es va publicar l'HTML5, amb etiquetes semàntiques (header, nav, main…), vídeo i àudio sense connectors i nous tipus de formulari. Avui l'HTML és un estàndard viu que manté el WHATWG: s'actualitza de manera contínua i ja no rep números de versió.

Herramientas y carpetas de trabajoEines i carpetes de treball

Para todo el curso basta con un editor de código y un navegador.

  • Visual Studio Code (gratuito). Extensiones útiles: Live Server (recarga la página al guardar) y Prettier (ordena el código). Sublime Text también sirve y tiene versión portable.
  • Google Chrome o Firefox, con sus herramientas de desarrollo (tecla F12).

Reglas para nombrar archivos y carpetas: en minúsculas, sin espacios, sin tildes ni ñ. Usa guiones: mi-primera-web. La página principal de cada carpeta se llama siempre index.html.

mi-primera-web/
├── index.html
├── css/
│   └── style.css
└── img/
    └── portada.jpg

Atajos de VS Code: escribe ! y pulsa Tab para generar la estructura básica; Ctrl+S guarda; Alt+Shift+F da formato.

Per a tot el curs n'hi ha prou amb un editor de codi i un navegador.

  • Visual Studio Code (gratuït). Extensions útils: Live Server (recarrega la pàgina en desar) i Prettier (endreça el codi). Sublime Text també serveix i té versió portable.
  • Google Chrome o Firefox, amb les eines de desenvolupament (tecla F12).

Normes per anomenar fitxers i carpetes: en minúscules, sense espais, sense accents ni ç. Fes servir guions: la-meva-primera-web. La pàgina principal de cada carpeta es diu sempre index.html.

la-meva-primera-web/
├── index.html
├── css/
│   └── style.css
└── img/
    └── portada.jpg

Dreceres de VS Code: escriu ! i prem Tab per generar l'estructura bàsica; Ctrl+S desa; Alt+Shift+F dona format.

Anatomía de una etiquetaAnatomia d'una etiqueta

Un elemento HTML se escribe con una etiqueta de apertura, el contenido y una etiqueta de cierre con barra:

<a href="https://danimcasas.com" target="_blank">Mi web</a>
 │  └─ atributo ─────────┘ └─ atributo ──┘  │       │
 etiqueta                             contenido   cierre
  • Los atributos van en la etiqueta de apertura con la forma nombre="valor" y dan información extra.
  • Los elementos vacíos no tienen contenido ni cierre: <img>, <br>, <hr>, <input>, <meta>, <link>.
  • Los elementos se anidan como cajas dentro de cajas. La última que se abre es la primera que se cierra.
  • Los comentarios <!-- así --> no se ven en la página: sirven para explicar el código.

Un element HTML s'escriu amb una etiqueta d'obertura, el contingut i una etiqueta de tancament amb barra:

<a href="https://danimcasas.com" target="_blank">La meva web</a>
 │  └─ atribut ──────────┘ └─ atribut ───┘  │              │
 etiqueta                              contingut      tancament
  • Els atributs van a l'etiqueta d'obertura amb la forma nom="valor" i donen informació extra.
  • Els elements buits no tenen contingut ni tancament: <img>, <br>, <hr>, <input>, <meta>, <link>.
  • Els elements s'imbriquen com capses dins de capses. L'última que s'obre és la primera que es tanca.
  • Els comentaris <!-- així --> no es veuen a la pàgina: serveixen per explicar el codi.

Estructura mínima de un documentoEstructura mínima d'un document

<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Título de la pestaña</title>
  </head>
  <body>
    Lo que se ve en la página
  </body>
</html>
  • <!DOCTYPE html> avisa de que el documento es HTML5.
  • <head> guarda información sobre la página: codificación, título, descripción, hojas de estilo.
  • <body> contiene todo lo visible.
  • Atributos globales, válidos en cualquier etiqueta: id (nombre único), class (nombre reutilizable), title (texto al pasar el ratón), lang, style y hidden.
<!DOCTYPE html>
<html lang="ca">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Títol de la pestanya</title>
  </head>
  <body>
    El que es veu a la pàgina
  </body>
</html>
  • <!DOCTYPE html> avisa que el document és HTML5.
  • <head> guarda informació sobre la pàgina: codificació, títol, descripció, fulls d'estil.
  • <body> conté tot el que és visible.
  • Atributs globals, vàlids a qualsevol etiqueta: id (nom únic), class (nom reutilitzable), title (text en passar el ratolí), lang, style i hidden.

Texto, listas y citasText, llistes i cites

  • Encabezados h1 a h6: marcan la jerarquía. Un solo h1 por página y sin saltar niveles.
  • Párrafos p. El navegador ignora los saltos de línea y los espacios repetidos del código; para forzar un salto dentro del texto se usa br.
  • Formato con significado: strong (importante), em (énfasis), mark (resaltado). Con aspecto: u, s, small, sub, sup.
  • Listas: ul sin orden, ol numerada; cada elemento en un li. Se pueden anidar dentro de un li.
  • Citas: blockquote para un bloque, q para una frase dentro de un párrafo.
  • Entidades: © ©, < <, > >, & &,   espacio que no se parte.
  • Encapçalaments h1 a h6: marquen la jerarquia. Un sol h1 per pàgina i sense saltar nivells.
  • Paràgrafs p. El navegador ignora els salts de línia i els espais repetits del codi; per forçar un salt dins del text es fa servir br.
  • Format amb significat: strong (important), em (èmfasi), mark (ressaltat). Amb aspecte: u, s, small, sub, sup.
  • Llistes: ul sense ordre, ol numerada; cada element dins d'un li. Es poden imbricar dins d'un li.
  • Cites: blockquote per a un bloc, q per a una frase dins d'un paràgraf.
  • Entitats: © ©, < <, > >, & &,   espai que no es parteix.

Enlaces y rutasEnllaços i rutes

La etiqueta a crea un enlace y el destino va en href.

  • Ruta absoluta: la dirección completa, https://…. Para enlazar otras webs.
  • Ruta relativa: el camino desde el archivo actual. contacto.html (misma carpeta), paginas/contacto.html (entra en una carpeta), ../index.html (sube una carpeta).
  • Ancla: href="#precios" salta al elemento con id="precios".
  • mailto: abre el correo, tel: llama, download descarga el archivo.
  • target="_blank" abre en otra pestaña; añade siempre rel="noopener noreferrer" por seguridad. title da una descripción al pasar el ratón.

L'etiqueta a crea un enllaç i la destinació va a href.

  • Ruta absoluta: l'adreça completa, https://…. Per enllaçar altres webs.
  • Ruta relativa: el camí des del fitxer actual. contacte.html (mateixa carpeta), pagines/contacte.html (entra en una carpeta), ../index.html (puja una carpeta).
  • Àncora: href="#preus" salta a l'element amb id="preus".
  • mailto: obre el correu, tel: truca, download descarrega el fitxer.
  • target="_blank" obre en una altra pestanya; afegeix sempre rel="noopener noreferrer" per seguretat. title dona una descripció en passar el ratolí.

Imágenes y multimediaImatges i multimèdia

  • <img src="img/foto.jpg" alt="Descripción" width="600" height="400">. El alt es obligatorio: lo leen los lectores de pantalla, aparece si la imagen falla y lo usa Google.
  • Formatos: JPG para fotos, PNG para transparencias y capturas, WebP o AVIF para que pesen menos, SVG para iconos y logos, GIF para animaciones sencillas.
  • figure + figcaption agrupan una imagen con su pie de foto.
  • video y audio con el atributo controls y una o varias etiquetas source.
  • iframe inserta otra página: vídeos de YouTube, mapas. Lleva siempre title.
  • <img src="img/foto.jpg" alt="Descripció" width="600" height="400">. L'alt és obligatori: el llegeixen els lectors de pantalla, apareix si la imatge falla i el fa servir Google.
  • Formats: JPG per a fotos, PNG per a transparències i captures, WebP o AVIF perquè pesin menys, SVG per a icones i logotips, GIF per a animacions senzilles.
  • figure + figcaption agrupen una imatge amb el seu peu de foto.
  • video i audio amb l'atribut controls i una o diverses etiquetes source.
  • iframe insereix una altra pàgina: vídeos de YouTube, mapes. Porta sempre title.

FormulariosFormularis

  • form envuelve los campos. action indica adónde se envían los datos y method cómo (get en la URL, post ocultos).
  • Cada campo lleva su label: el for del label coincide con el id del campo.
  • input cambia según su type: text, email, tel, password, number, date, time, radio, checkbox, file, range, color, search.
  • textarea para texto largo, select + option para desplegables, fieldset + legend para agrupar.
  • Validación sin JavaScript: required, minlength, maxlength, min, max, pattern.
  • El atributo name es el nombre con el que viaja cada dato. Los radio de un mismo grupo comparten name.
  • form embolcalla els camps. action indica on s'envien les dades i method com (get a l'URL, post ocultes).
  • Cada camp porta el seu label: el for del label coincideix amb l'id del camp.
  • input canvia segons el type: text, email, tel, password, number, date, time, radio, checkbox, file, range, color, search.
  • textarea per a text llarg, select + option per a desplegables, fieldset + legend per agrupar.
  • Validació sense JavaScript: required, minlength, maxlength, min, max, pattern.
  • L'atribut name és el nom amb què viatja cada dada. Els radio d'un mateix grup comparteixen name.

Etiquetas semánticas y accesibilidadEtiquetes semàntiques i accessibilitat

Las etiquetas semánticas dicen qué papel tiene cada parte de la página. Se ven igual que un div, pero los buscadores y los lectores de pantalla las entienden.

┌───────────── header ─────────────┐
├────────────── nav ───────────────┤
│ ┌──────── main ───────┐ ┌ aside ┐│
│ │ section · article   │ │       ││
│ └─────────────────────┘ └───────┘│
└───────────── footer ─────────────┘
  • header cabecera · nav menú · main contenido principal (uno por página) · section bloque temático · article contenido independiente · aside contenido secundario · footer pie.
  • div y span no tienen significado: se usan solo para agrupar y dar estilos.
  • Accesibilidad básica: alt en imágenes, label en formularios, encabezados en orden, textos de enlace que se entienden solos (evita «haz clic aquí») y buen contraste de color.

Les etiquetes semàntiques diuen quin paper té cada part de la pàgina. Es veuen igual que un div, però els cercadors i els lectors de pantalla les entenen.

┌───────────── header ─────────────┐
├────────────── nav ───────────────┤
│ ┌──────── main ───────┐ ┌ aside ┐│
│ │ section · article   │ │       ││
│ └─────────────────────┘ └───────┘│
└───────────── footer ─────────────┘
  • header capçalera · nav menú · main contingut principal (un per pàgina) · section bloc temàtic · article contingut independent · aside contingut secundari · footer peu.
  • div i span no tenen significat: només serveixen per agrupar i donar estils.
  • Accessibilitat bàsica: alt a les imatges, label als formularis, encapçalaments en ordre, textos d'enllaç que s'entenen sols (evita «fes clic aquí») i bon contrast de color.

PrácticasPràctiques

1.1

Mi primer documento HTMLEl meu primer document HTML

En directoEn directe40 minmin

ObjetivoObjectiu. Escribir la estructura mínima de una página y practicar encabezados, párrafos, formato, listas, citas y entidades.Escriure l'estructura mínima d'una pàgina i practicar encapçalaments, paràgrafs, format, llistes, cites i entitats.

El código está comentado en castellano.El codi està comentat en castellà.

1.2

Enlaces, imágenes y multimediaEnllaços, imatges i multimèdia

En directoEn directe40 minmin

ObjetivoObjectiu. Crear todos los tipos de enlace, insertar imágenes con su texto alternativo y añadir vídeo, audio y un mapa.Crear tots els tipus d'enllaç, inserir imatges amb el text alternatiu i afegir vídeo, àudio i un mapa.

El código está comentado en castellano.El codi està comentat en castellà.

1.3

Formulario de inscripciónFormulari d'inscripció

En directoEn directe40 minmin

ObjetivoObjectiu. Construir un formulario completo con etiquetas accesibles, distintos tipos de campo y validación del navegador.Construir un formulari complet amb etiquetes accessibles, diferents tipus de camp i validació del navegador.

El código está comentado en castellano.El codi està comentat en castellà.

1.4

Página web básica y estructura semánticaPàgina web bàsica i estructura semàntica

En directoEn directe35 minmin

ObjetivoObjectiu. Montar la estructura header, nav, main, section, aside y footer, enlazar una hoja de estilos y ver el primer cambio de diseño.Muntar l'estructura header, nav, main, section, aside i footer, enllaçar un full d'estils i veure el primer canvi de disseny.

El código está comentado en castellano.El codi està comentat en castellà.

E1

Tu mini página de presentaciónLa teva mini pàgina de presentació

Ejercicio autónomoExercici autònom30 minmin

ObjetivoObjectiu. Crear por tu cuenta una página semántica con tus datos.Crear pel teu compte una pàgina semàntica amb les teves dades.

EnunciadoEnunciat

Cuando termines la teoría de HTML, intenta picar este ejercicio sin mirar la solución. Tómate el tiempo que necesites.

  1. Crea un archivo index.html con la estructura básica de HTML5.
  2. Añade un header con un h1 con tu nombre y una línea que diga a qué te dedicas.
  3. Añade un main con dos section: «Sobre mí», con un párrafo, y «Proyectos», con una lista de dos o tres proyectos reales o inventados.
  4. Termina con un footer con el texto «© 2026 · Tu nombre».
  5. Opcional: crea style.css y dale colores, una caja central blanca y sombra.

Quan acabis la teoria d'HTML, intenta picar aquest exercici sense mirar la solució. Pren-te el temps que necessitis.

  1. Crea un fitxer index.html amb l'estructura bàsica d'HTML5.
  2. Afegeix un header amb un h1 amb el teu nom i una línia que digui a què et dediques.
  3. Afegeix un main amb dues section: «Sobre mi», amb un paràgraf, i «Projectes», amb una llista de dos o tres projectes reals o inventats.
  4. Acaba amb un footer amb el text «© 2026 · El teu nom».
  5. Opcional: crea style.css i dona-li colors, una capsa central blanca i ombra.
Ver solución comentadaMostra la solució comentada

El código está comentado en castellano.El codi està comentat en castellà.

SesiónSessió 2

CSS I: selectores, color, texto y modelo de cajaCSS I: selectors, color, text i model de capsa

Damos estilo a las páginas: cómo se escribe una regla, cómo se elige a qué elementos afecta, quién gana cuando dos reglas chocan y cómo mide el navegador cada caja.Donem estil a les pàgines: com s'escriu una regla, com s'escull a quins elements afecta, qui guanya quan dues regles xoquen i com mesura el navegador cada capsa.

TeoríaTeoria

Qué es CSSQuè és el CSS

CSS (Cascading Style Sheets, hojas de estilo en cascada) es el lenguaje que describe cómo se presenta un documento HTML: colores, tipografías, tamaños, espacios, columnas, animaciones. Lo estandariza el W3C.

Habrás oído hablar de CSS1, CSS2.1 y CSS3. Desde CSS3 el lenguaje se divide en módulos que avanzan por separado (colores, Flexbox, Grid…), por eso nunca ha existido un «CSS4» oficial.

Separar el contenido (HTML) del diseño (CSS) permite cambiar el aspecto de toda una web tocando un solo archivo.

El CSS (Cascading Style Sheets, fulls d'estil en cascada) és el llenguatge que descriu com es presenta un document HTML: colors, tipografies, mides, espais, columnes, animacions. L'estandarditza el W3C.

Segur que has sentit parlar de CSS1, CSS2.1 i CSS3. Des del CSS3 el llenguatge es divideix en mòduls que avancen per separat (colors, Flexbox, Grid…), per això no ha existit mai un «CSS4» oficial.

Separar el contingut (HTML) del disseny (CSS) permet canviar l'aspecte de tota una web tocant un sol fitxer.

Tres formas de añadir CSSTres maneres d'afegir CSS

  1. En línea, con el atributo style: <p style="color: red">. Solo para pruebas rápidas.
  2. Interno, dentro de <style> en el head. Útil para una página suelta.
  3. Externo, en un archivo .css enlazado desde el head. Es la forma profesional: un archivo sirve para todas las páginas.
<link rel="stylesheet" href="css/style.css">
  1. En línia, amb l'atribut style: <p style="color: red">. Només per a proves ràpides.
  2. Intern, dins de <style> al head. Útil per a una pàgina solta.
  3. Extern, en un fitxer .css enllaçat des del head. És la manera professional: un fitxer serveix per a totes les pàgines.
<link rel="stylesheet" href="css/style.css">

Anatomía de una reglaAnatomia d'una regla

selector {
  propiedad: valor;   ← declaración
  propiedad: valor;
}

h1 {
  color: #2d3436;
  font-size: 2rem;
}

El selector elige los elementos; entre llaves van las declaraciones, cada una terminada en punto y coma. Los comentarios se escriben /* así */.

selector {
  propietat: valor;   ← declaració
  propietat: valor;
}

h1 {
  color: #2d3436;
  font-size: 2rem;
}

El selector escull els elements; entre claus van les declaracions, cadascuna acabada en punt i coma. Els comentaris s'escriuen /* així */.

SelectoresSelectors

  • p · por etiqueta: todos los párrafos.
  • .destacado · por clase: los elementos con class="destacado". Una clase se repite tantas veces como quieras.
  • #cabecera · por id: el elemento con id="cabecera", que es único.
  • nav a · descendiente: los enlaces que están dentro de nav.
  • h1, h2 · agrupación: la misma regla para varios selectores.
  • .btn.small · elementos que tienen las dos clases a la vez.
  • * · universal: todos los elementos.
  • p · per etiqueta: tots els paràgrafs.
  • .destacat · per classe: els elements amb class="destacat". Una classe es repeteix tantes vegades com vulguis.
  • #capcalera · per id: l'element amb id="capcalera", que és únic.
  • nav a · descendent: els enllaços que són dins de nav.
  • h1, h2 · agrupació: la mateixa regla per a diversos selectors.
  • .btn.small · elements que tenen les dues classes alhora.
  • * · universal: tots els elements.

Cascada, especificidad y herenciaCascada, especificitat i herència

Cuando varias reglas afectan al mismo elemento, el navegador decide así:

  1. Especificidad: gana el selector más concreto. De menos a más: etiqueta < clase < id < estilo en línea.
  2. Orden: con la misma especificidad, gana la regla escrita más abajo.
  3. !important se salta todo lo anterior. Úsalo como último recurso.

Herencia: las propiedades de texto (color, fuente, tamaño, interlineado) pasan de padres a hijos. Las de caja (borde, margen, relleno, fondo, ancho) no se heredan. Valores especiales: inherit (copia el del padre), initial (valor inicial de CSS) y unset (hereda si la propiedad es heredable y, si no, actúa como initial).

Quan diverses regles afecten el mateix element, el navegador decideix així:

  1. Especificitat: guanya el selector més concret. De menys a més: etiqueta < classe < id < estil en línia.
  2. Ordre: amb la mateixa especificitat, guanya la regla escrita més avall.
  3. !important se salta tot l'anterior. Fes-lo servir com a últim recurs.

Herència: les propietats de text (color, font, mida, interlineat) passen de pares a fills. Les de capsa (vora, marge, farciment, fons, amplada) no s'hereten. Valors especials: inherit (copia el del pare), initial (valor inicial del CSS) i unset (hereta si la propietat és heretable i, si no, actua com initial).

Color y tipografíaColor i tipografia

  • Colores: por nombre (tomato), hexadecimal (#e8622c), rgb(232 98 44), con transparencia rgba(0,0,0,.5) y hsl(18 80% 54%).
  • font-family con alternativas: 'Poppins', Arial, sans-serif. Las fuentes de Google Fonts se enlazan con su <link> en el head.
  • font-size, font-weight (400 normal, 700 negrita), font-style, line-height (1.5 a 1.7 para leer cómodo).
  • text-align, text-transform, text-decoration, letter-spacing.
  • Fondos: background-color, background-image: url(...), background-size: cover, background-position: center, degradados con linear-gradient().
  • Colors: per nom (tomato), hexadecimal (#e8622c), rgb(232 98 44), amb transparència rgba(0,0,0,.5) i hsl(18 80% 54%).
  • font-family amb alternatives: 'Poppins', Arial, sans-serif. Les fonts de Google Fonts s'enllacen amb el seu <link> al head.
  • font-size, font-weight (400 normal, 700 negreta), font-style, line-height (d'1.5 a 1.7 per llegir còmode).
  • text-align, text-transform, text-decoration, letter-spacing.
  • Fons: background-color, background-image: url(...), background-size: cover, background-position: center, degradats amb linear-gradient().

Pseudoclases y pseudoelementosPseudoclasses i pseudoelements

Las pseudoclases (un signo de dos puntos) dan estilo a un estado del elemento: :hover (ratón encima), :active (pulsado), :focus (activo con teclado o clic), :visited, :first-child, :last-child, :nth-child(2), :nth-child(odd).

Los pseudoelementos (dos signos) dan estilo a una parte del elemento: ::before y ::after (contenido antes o después; necesitan content), ::first-letter, ::first-line, ::selection, ::placeholder.

Les pseudoclasses (un signe de dos punts) donen estil a un estat de l'element: :hover (ratolí a sobre), :active (premut), :focus (actiu amb teclat o clic), :visited, :first-child, :last-child, :nth-child(2), :nth-child(odd).

Els pseudoelements (dos signes) donen estil a una part de l'element: ::before i ::after (contingut abans o després; necessiten content), ::first-letter, ::first-line, ::selection, ::placeholder.

El modelo de cajaEl model de capsa

┌──────────── margin ────────────┐
│ ┌────────── border ──────────┐ │
│ │ ┌──────── padding ───────┐ │ │
│ │ │       contenido        │ │ │
│ │ └────────────────────────┘ │ │
│ └────────────────────────────┘ │
└────────────────────────────────┘
  • padding: espacio interior, entre el contenido y el borde. Se pinta con el fondo.
  • border: grosor, estilo y color, por ejemplo 2px solid #333. border-radius redondea las esquinas.
  • margin: espacio exterior, separa la caja de las demás. margin: 0 auto centra una caja con ancho.
  • box-sizing: border-box hace que width incluya relleno y borde. Por eso casi todas las hojas empiezan con * { box-sizing: border-box; }.
  • display: block ocupa toda la línea; inline fluye con el texto y no acepta ancho ni alto; inline-block se pone en línea pero acepta medidas; none lo oculta.
┌──────────── margin ────────────┐
│ ┌────────── border ──────────┐ │
│ │ ┌──────── padding ───────┐ │ │
│ │ │       contingut        │ │ │
│ │ └────────────────────────┘ │ │
│ └────────────────────────────┘ │
└────────────────────────────────┘
  • padding: espai interior, entre el contingut i la vora. Es pinta amb el fons.
  • border: gruix, estil i color, per exemple 2px solid #333. border-radius arrodoneix les cantonades.
  • margin: espai exterior, separa la capsa de les altres. margin: 0 auto centra una capsa amb amplada.
  • box-sizing: border-box fa que width inclogui farciment i vora. Per això gairebé tots els fulls comencen amb * { box-sizing: border-box; }.
  • display: block ocupa tota la línia; inline flueix amb el text i no accepta amplada ni alçada; inline-block es posa en línia però accepta mides; none l'amaga.

Medidas absolutas y relativasMides absolutes i relatives

  • px: medida fija. Buena para bordes y sombras.
  • %: relativo al padre. En width, al ancho del contenedor; en font-size, a la letra del padre.
  • em: relativo al tamaño de letra del padre. 1.5em dentro de un padre a 20px son 30px.
  • rem: relativo al tamaño de letra del html (16px por defecto). La más predecible para textos.
  • vw / vh: 1% del ancho o del alto de la ventana. height: 100vh es una portada a pantalla completa.

Las medidas absolutas como mm, cm, in, pt o pc se usan sobre todo para imprimir.

  • px: mida fixa. Bona per a vores i ombres.
  • %: relatiu al pare. A width, a l'amplada del contenidor; a font-size, a la lletra del pare.
  • em: relatiu a la mida de lletra del pare. 1.5em dins d'un pare a 20px són 30px.
  • rem: relatiu a la mida de lletra de l'html (16px per defecte). La més previsible per als textos.
  • vw / vh: 1% de l'amplada o de l'alçada de la finestra. height: 100vh és una portada a pantalla completa.

Les mides absolutes com mm, cm, in, pt o pc es fan servir sobretot per imprimir.

El inspector del navegadorL'inspector del navegador

Las herramientas de desarrollo permiten ver y editar en vivo el HTML y el CSS de cualquier web. Se abren con F12, Ctrl+Shift+I (Windows), Cmd+Option+I (Mac) o con el botón derecho y «Inspeccionar».

  • Elementos: el árbol HTML de la página.
  • Estilos: las reglas CSS del elemento seleccionado. Puedes cambiar valores, desmarcar propiedades y ver qué regla gana.
  • Calculado: el diagrama del modelo de caja con las medidas reales.
  • El icono de móvil simula pantallas de distintos tamaños.

Los cambios del inspector son temporales: desaparecen al recargar.

Ejercicio «El periódico»: abre la portada de un diario digital, inspecciona cuatro noticias y cambia su titular y su color, y oculta un artículo o una imagen con display: none.

Les eines de desenvolupament permeten veure i editar en directe l'HTML i el CSS de qualsevol web. S'obren amb F12, Ctrl+Shift+I (Windows), Cmd+Option+I (Mac) o amb el botó dret i «Inspecciona».

  • Elements: l'arbre HTML de la pàgina.
  • Estils: les regles CSS de l'element seleccionat. Pots canviar valors, desmarcar propietats i veure quina regla guanya.
  • Calculat: el diagrama del model de capsa amb les mides reals.
  • La icona de mòbil simula pantalles de diferents mides.

Els canvis de l'inspector són temporals: desapareixen en recarregar.

Exercici «El diari»: obre la portada d'un diari digital, inspecciona quatre notícies i canvia'n el titular i el color, i amaga un article o una imatge amb display: none.

PrácticasPràctiques

2.1

Etiquetas, clases y atributo IDEtiquetes, classes i atribut ID

En directoEn directe25 minmin

ObjetivoObjectiu. Enlazar una hoja externa desde una carpeta css y comparar los selectores de etiqueta, clase e id.Enllaçar un full extern des d'una carpeta css i comparar els selectors d'etiqueta, classe i id.

El código está comentado en castellano.El codi està comentat en castellà.

2.2

HerenciaHerència

En directoEn directe15 minmin

ObjetivoObjectiu. Comprobar qué propiedades pasan de padres a hijos y usar inherit.Comprovar quines propietats passen de pares a fills i fer servir inherit.

El código está comentado en castellano.El codi està comentat en castellà.

2.3

Pseudoclases y pseudoelementosPseudoclasses i pseudoelements

En directoEn directe30 minmin

ObjetivoObjectiu. Dar estilo a estados (hover, active, focus) y a partes de un elemento (before, after, first-letter).Donar estil a estats (hover, active, focus) i a parts d'un element (before, after, first-letter).

El código está comentado en castellano.El codi està comentat en castellà.

2.4

El modelo de cajaEl model de capsa

En directoEn directe15 minmin

ObjetivoObjectiu. Ver la diferencia entre content-box y border-box y dominar los atajos de padding y margin.Veure la diferència entre content-box i border-box i dominar les dreceres de padding i margin.

El código está comentado en castellano.El codi està comentat en castellà.

2.5

Medidas en CSSMides en CSS

En directoEn directe15 minmin

ObjetivoObjectiu. Comparar px, %, em, rem, vw y vh en la misma página.Comparar px, %, em, rem, vw i vh a la mateixa pàgina.

El código está comentado en castellano.El codi està comentat en castellà.

2.6

Caja centrada y texto transformadoCapsa centrada i text transformat

En directoEn directe25 minmin

ObjetivoObjectiu. Centrar una caja en los dos ejes y transformar el texto solo con CSS.Centrar una capsa en els dos eixos i transformar el text només amb CSS.

EnunciadoEnunciat

Sin tocar el HTML:

  • Centra la caja en horizontal y en vertical.
  • Dale un color de fondo.
  • Muestra los textos en minúsculas, aunque estén escritos en mayúsculas.
  • Pon en mayúscula la primera letra de cada texto.

Sense tocar l'HTML:

  • Centra la capsa en horitzontal i en vertical.
  • Dona-li un color de fons.
  • Mostra els textos en minúscules, encara que estiguin escrits en majúscules.
  • Posa en majúscula la primera lletra de cada text.

El código está comentado en castellano.El codi està comentat en castellà.

2.7

Carta de cafeteríaCarta de cafeteria

En directoEn directe40 minmin

ObjetivoObjectiu. Maquetar una carta con imagen de fondo, caja centrada, platos y precios en la misma línea y estados de enlace.Maquetar una carta amb imatge de fons, capsa centrada, plats i preus a la mateixa línia i estats d'enllaç.

El código está comentado en castellano.El codi està comentat en castellà.

E2

Página web básica con CSSPàgina web bàsica amb CSS

Ejercicio autónomoExercici autònom30 minmin

ObjetivoObjectiu. Dar estilo por tu cuenta a una página con cabecera, menú, artículos y pie.Donar estil pel teu compte a una pàgina amb capçalera, menú, articles i peu.

EnunciadoEnunciat

Escribe el HTML de una página con header (título y subtítulo), un nav con tres enlaces, un main con dos article y un footer. Después crea styles.css y consigue que:

  • El fondo de la página sea gris claro y los artículos, cajas blancas con sombra suave.
  • Los enlaces del menú parezcan botones azules en fila, centrados y con un tono más oscuro al pasar el ratón.
  • El contenido no pase de 800px de ancho y quede centrado.
  • El pie sea oscuro con el texto blanco y centrado.

Escriu l'HTML d'una pàgina amb header (títol i subtítol), un nav amb tres enllaços, un main amb dos article i un footer. Després crea styles.css i aconsegueix que:

  • El fons de la pàgina sigui gris clar i els articles, capses blanques amb una ombra suau.
  • Els enllaços del menú semblin botons blaus en fila, centrats i amb un to més fosc en passar el ratolí.
  • El contingut no passi de 800px d'amplada i quedi centrat.
  • El peu sigui fosc amb el text blanc i centrat.
Ver solución comentadaMostra la solució comentada

El código está comentado en castellano.El codi està comentat en castellà.

SesiónSessió 3

CSS II: maquetación con position, Flexbox y responsiveCSS II: maquetació amb position, Flexbox i responsive

Colocamos las cajas donde queremos. Empezamos por position y float, pasamos a Flexbox, que es la herramienta del día a día, y terminamos con webs completas que se adaptan al móvil.Col·loquem les capses on volem. Comencem per position i float, passem a Flexbox, que és l'eina del dia a dia, i acabem amb webs completes que s'adapten al mòbil.

TeoríaTeoria

PositionPosition

  • static: el valor por defecto. Ignora top, right, bottom y left.
  • relative: se desplaza desde su sitio, que sigue reservado. También sirve de ancla para sus hijos absolute.
  • absolute: sale del flujo y se coloca respecto al antepasado más cercano que tenga un position distinto de static.
  • fixed: sale del flujo y se fija a la ventana; no se mueve con el scroll. Botones de WhatsApp, avisos de cookies.
  • sticky: actúa como relative hasta que el scroll lo alcanza y entonces se queda pegado. Menús.
  • z-index: decide qué capa queda encima cuando dos elementos se solapan. Solo funciona con un position distinto de static.
  • static: el valor per defecte. Ignora top, right, bottom i left.
  • relative: es desplaça des del seu lloc, que continua reservat. També fa d'àncora per als fills absolute.
  • absolute: surt del flux i es col·loca respecte a l'avantpassat més proper que tingui un position diferent de static.
  • fixed: surt del flux i es fixa a la finestra; no es mou amb el desplaçament. Botons de WhatsApp, avisos de galetes.
  • sticky: actua com relative fins que el desplaçament l'arriba i aleshores es queda enganxat. Menús.
  • z-index: decideix quina capa queda a sobre quan dos elements se solapen. Només funciona amb un position diferent de static.

Float y clearFloat i clear

float: left o right empuja una caja a un lado y deja que el contenido la rodee. Durante años se usó para maquetar columnas, con dos problemas: hay que calcular los anchos a mano y el contenedor deja de ver a sus hijos flotantes.

  • clear: both obliga a un elemento a bajar por debajo de los flotantes.
  • overflow: auto en el padre hace que vuelva a abrazar a sus hijos.

Hoy float se reserva para su uso original: una imagen con texto alrededor. Para columnas usamos Flexbox o Grid.

float: left o right empeny una capsa a un costat i deixa que el contingut l'envolti. Durant anys es va fer servir per maquetar columnes, amb dos problemes: cal calcular les amplades a mà i el contenidor deixa de veure els fills flotants.

  • clear: both obliga un element a baixar per sota dels flotants.
  • overflow: auto al pare fa que torni a abraçar els fills.

Avui el float es reserva per a l'ús original: una imatge amb text al voltant. Per a columnes fem servir Flexbox o Grid.

Flexbox: contenedor e ítemsFlexbox: contenidor i ítems

Flexbox organiza, alinea y reparte el espacio entre los hijos de un contenedor. Se activa en el padre con display: flex; sus hijos directos pasan a ser ítems flexibles.

eje principal (flex-direction: row) ──────────▶
┌───────────────────────────────────────────┐  ▲
│ ┌──────┐   ┌──────┐   ┌──────┐            │  │ eje
│ │ ítem │   │ ítem │   │ ítem │            │  │ cruzado
│ └──────┘   └──────┘   └──────┘            │  ▼
└───────────────────────────────────────────┘

Con flex-direction: column los ejes se intercambian: el principal pasa a ser vertical.

Flexbox organitza, alinea i reparteix l'espai entre els fills d'un contenidor. S'activa al pare amb display: flex; els fills directes passen a ser ítems flexibles.

eix principal (flex-direction: row) ──────────▶
┌───────────────────────────────────────────┐  ▲
│ ┌──────┐   ┌──────┐   ┌──────┐            │  │ eix
│ │ ítem │   │ ítem │   │ ítem │            │  │ transversal
│ └──────┘   └──────┘   └──────┘            │  ▼
└───────────────────────────────────────────┘

Amb flex-direction: column els eixos s'intercanvien: el principal passa a ser vertical.

Flexbox: propiedadesFlexbox: propietats

En el padre

  • flex-direction: row · column · row-reverse · column-reverse
  • justify-content (eje principal): flex-start · center · flex-end · space-between · space-around · space-evenly
  • align-items (eje cruzado): stretch · flex-start · center · flex-end · baseline
  • flex-wrap: nowrap · wrap. align-content alinea las filas cuando hay wrap.
  • gap: espacio entre ítems, sin cálculos de márgenes.

En los hijos

  • flex: 1 reparte el espacio libre a partes iguales. Atajo de flex-grow, flex-shrink y flex-basis: flex: 1 1 260px.
  • align-self alinea un solo ítem; order cambia su orden visual.

Con justify-content, align-items y flex-direction se resuelve la mayoría de las maquetaciones.

Al pare

  • flex-direction: row · column · row-reverse · column-reverse
  • justify-content (eix principal): flex-start · center · flex-end · space-between · space-around · space-evenly
  • align-items (eix transversal): stretch · flex-start · center · flex-end · baseline
  • flex-wrap: nowrap · wrap. align-content alinea les files quan hi ha wrap.
  • gap: espai entre ítems, sense càlculs de marges.

Als fills

  • flex: 1 reparteix l'espai lliure a parts iguals. Drecera de flex-grow, flex-shrink i flex-basis: flex: 1 1 260px.
  • align-self alinea un sol ítem; order en canvia l'ordre visual.

Amb justify-content, align-items i flex-direction es resol la majoria de maquetacions.

Errores comunes con FlexboxErrors habituals amb Flexbox

  • Poner display: flex en los hijos en lugar de en el padre.
  • Confundir justify-content (eje principal) con align-items (eje cruzado), sobre todo con flex-direction: column.
  • Esperar un centrado vertical en un contenedor que no tiene altura.
  • Separar ítems con márgenes cuando gap lo hace mejor.
  • Usar align-content sin flex-wrap: wrap.
  • Posar display: flex als fills en lloc del pare.
  • Confondre justify-content (eix principal) amb align-items (eix transversal), sobretot amb flex-direction: column.
  • Esperar un centrat vertical en un contenidor que no té alçada.
  • Separar ítems amb marges quan gap ho fa millor.
  • Fer servir align-content sense flex-wrap: wrap.

Una pincelada de CSS GridUna pinzellada de CSS Grid

Flexbox trabaja en una dimensión (una fila o una columna). Grid trabaja en dos: filas y columnas a la vez.

.contenedor {
  display: grid;
  grid-template-columns: repeat(3, 1fr);   /* tres columnas iguales */
  gap: 16px;
}
.centrar {
  display: grid;
  place-items: center;                     /* centra en los dos ejes */
}

fr es una fracción del espacio libre. Lo usamos en la práctica final y en el buscador; su estudio a fondo queda para un curso posterior.

Flexbox treballa en una dimensió (una fila o una columna). Grid treballa en dues: files i columnes alhora.

.contenidor {
  display: grid;
  grid-template-columns: repeat(3, 1fr);   /* tres columnes iguals */
  gap: 16px;
}
.centrar {
  display: grid;
  place-items: center;                     /* centra en els dos eixos */
}

fr és una fracció de l'espai lliure. El fem servir a la pràctica final i al cercador; l'estudi a fons queda per a un curs posterior.

Diseño responsive y media queriesDisseny responsive i media queries

Una web responsive se adapta al ancho de la pantalla. Necesita tres cosas:

  1. La metaetiqueta viewport en el head.
  2. Medidas flexibles: %, max-width, rem, imágenes con max-width: 100%.
  3. Media queries: reglas que solo se aplican a partir de cierto ancho.
/* Hasta 768px: apilamos las columnas */
@media (max-width: 768px) {
  .columnas { flex-direction: column; }
}

/* Mobile first: primero el móvil y luego, desde 768px, el escritorio */
@media (min-width: 768px) {
  .columnas { flex-direction: row; }
}

Puntos de corte habituales: 576px, 768px, 992px y 1200px. Comprueba siempre con el modo móvil del inspector.

Una web responsive s'adapta a l'amplada de la pantalla. Necessita tres coses:

  1. La metaetiqueta viewport al head.
  2. Mides flexibles: %, max-width, rem, imatges amb max-width: 100%.
  3. Media queries: regles que només s'apliquen a partir d'una amplada.
/* Fins a 768px: apilem les columnes */
@media (max-width: 768px) {
  .columnes { flex-direction: column; }
}

/* Mobile first: primer el mòbil i després, des de 768px, l'escriptori */
@media (min-width: 768px) {
  .columnes { flex-direction: row; }
}

Punts de tall habituals: 576px, 768px, 992px i 1200px. Comprova-ho sempre amb el mode mòbil de l'inspector.

Variables, transiciones y transformacionesVariables, transicions i transformacions

  • Variables CSS: se declaran en :root y se usan con var(). Cambiar un color en un solo sitio cambia toda la web.
    :root { --principal: #6c5ce7; } .btn { background: var(--principal); }
  • transition: background-color 0.2s hace que un cambio de estado sea suave.
  • transform mueve, gira o escala sin afectar al resto: translateY(-2px), scale(1.1), rotate(5deg).
  • object-fit: cover recorta una imagen para llenar su caja sin deformarla.
  • Variables CSS: es declaren a :root i es fan servir amb var(). Canviar un color en un sol lloc canvia tota la web.
    :root { --principal: #6c5ce7; } .btn { background: var(--principal); }
  • transition: background-color 0.2s fa que un canvi d'estat sigui suau.
  • transform mou, gira o escala sense afectar la resta: translateY(-2px), scale(1.1), rotate(5deg).
  • object-fit: cover retalla una imatge perquè ompli la capsa sense deformar-la.

PrácticasPràctiques

3.1

PositionPosition

En directoEn directe30 minmin

ObjetivoObjectiu. Ver en una misma página relative, absolute, fixed y sticky.Veure en una mateixa pàgina relative, absolute, fixed i sticky.

El código está comentado en castellano.El codi està comentat en castellà.

3.2

El mismo diseño con float y con FlexboxEl mateix disseny amb float i amb Flexbox

En directoEn directe20 minmin

ObjetivoObjectiu. Comparar las dos técnicas para entender por qué hoy se maqueta con Flexbox.Comparar les dues tècniques per entendre per què avui es maqueta amb Flexbox.

El código está comentado en castellano.El codi està comentat en castellà.

3.3

Flexbox en 5 ejerciciosFlexbox en 5 exercicis

En directoEn directe25 minmin

ObjetivoObjectiu. Centrar, repartir, apilar, alinear al final y distribuir de forma proporcional.Centrar, repartir, apilar, alinear al final i distribuir de manera proporcional.

El código está comentado en castellano.El codi està comentat en castellà.

3.4

Laboratorio de FlexboxLaboratori de Flexbox

En directoEn directe15 minmin

ObjetivoObjectiu. Descomentar las propiedades de una en una y observar qué hace cada una.Descomentar les propietats d'una en una i observar què fa cadascuna.

El código está comentado en castellano.El codi està comentat en castellà.

3.5

Galería de fotos con FlexboxGaleria de fotos amb Flexbox

En directoEn directe15 minmin

ObjetivoObjectiu. Hacer una galería que salta de línea sola y recorta las fotos sin deformarlas.Fer una galeria que salta de línia sola i retalla les fotos sense deformar-les.

El código está comentado en castellano.El codi està comentat en castellà.

3.6

Sección con tarjetas en columnasSecció amb targetes en columnes

En directoEn directe20 minmin

ObjetivoObjectiu. Repartir tarjetas en columnas con el botón siempre alineado abajo.Repartir targetes en columnes amb el botó sempre alineat a baix.

El código está comentado en castellano.El codi està comentat en castellà.

3.8

Maqueta de un artículo largoMaqueta d'un article llarg

En directoEn directeAmpliaciónAmpliació25 minmin

ObjetivoObjectiu. Maquetar un texto largo legible, con imágenes, pie de foto y una imagen flotante.Maquetar un text llarg llegible, amb imatges, peu de foto i una imatge flotant.

El código está comentado en castellano.El codi està comentat en castellà.

3.9

Landing page completa: MascotaliaLanding page completa: Mascotalia

En directoEn directe45 minmin

ObjetivoObjectiu. Construir una landing con portada a pantalla completa, columnas de servicios, sección de equipo y versión móvil.Construir una landing amb portada a pantalla completa, columnes de serveis, secció d'equip i versió mòbil.

El código está comentado en castellano.El codi està comentat en castellà.

3.10

Web completa con Flexbox: Macintosh 1984Web completa amb Flexbox: Macintosh 1984

En directoEn directeAmpliaciónAmpliació50 minmin

ObjetivoObjectiu. Repasar Flexbox de principio a fin en una web de seis secciones.Repassar Flexbox de principi a fi en una web de sis seccions.

El código está comentado en castellano.El codi està comentat en castellà.

3.12

Avanzada: portada de un buscadorAvançada: portada d'un cercador

En directoEn directeAmpliaciónAmpliació45 minmin

ObjetivoObjectiu. Reproducir la portada de un buscador clásico con un logo propio, iconos SVG de fondo y un footer con Grid.Reproduir la portada d'un cercador clàssic amb un logotip propi, icones SVG de fons i un footer amb Grid.

El código está comentado en castellano.El codi està comentat en castellà.

SesiónSessió 4

Bootstrap 5: rejilla y componentesBootstrap 5: graella i components

Pasamos a trabajar con un framework: la rejilla de 12 columnas, las clases utilitarias y los componentes listos para usar. Terminamos con un proyecto final completo.Passem a treballar amb un framework: la graella de 12 columnes, les classes utilitàries i els components a punt per fer servir. Acabem amb un projecte final complet.

TeoríaTeoria

Qué es un framework de CSSQuè és un framework de CSS

Un framework de front-end es una base de código ya escrito para empezar un proyecto: una rejilla para organizar el contenido, estilos para textos y formularios y componentes visuales listos para usar. Bootstrap, Foundation, Bulma y Tailwind son los más conocidos.

  • Ahorra tiempo: el menú, el carrusel o las tarjetas ya están hechos.
  • La web es responsive desde el principio.
  • El diseño es coherente y funciona igual en todos los navegadores.
  • Tiene una comunidad enorme y documentación excelente.

Bootstrap funciona como una caja de piezas de construcción: eliges las que necesitas, las encajas y después las personalizas con tu CSS.

Un framework de front-end és una base de codi ja escrit per començar un projecte: una graella per organitzar el contingut, estils per a textos i formularis i components visuals a punt per fer servir. Bootstrap, Foundation, Bulma i Tailwind són els més coneguts.

  • Estalvia temps: el menú, el carrusel o les targetes ja estan fets.
  • La web és responsive des del principi.
  • El disseny és coherent i funciona igual a tots els navegadors.
  • Té una comunitat enorme i una documentació excel·lent.

Bootstrap funciona com una capsa de peces de construcció: tries les que necessites, les encaixes i després les personalitzes amb el teu CSS.

Bootstrap 4 y Bootstrap 5Bootstrap 4 i Bootstrap 5

En clase usamos Bootstrap 5.3. Si encuentras tutoriales o código de Bootstrap 4, estas son las diferencias que más se notan:

  • Bootstrap 5 ya no necesita jQuery: basta con un solo archivo bootstrap.bundle.min.js.
  • Los atributos de los componentes llevan bs: data-bs-toggle, data-bs-target.
  • Izquierda y derecha pasan a ser inicio y fin: ml-auto → ms-auto, mr-3 → me-3, text-left → text-start.
  • btn-block se sustituye por w-100 o d-grid; form-group y form-row desaparecen.
  • Nuevo punto de corte xxl, clases g-* para los huecos de la rejilla y modo oscuro con data-bs-theme="dark".

A classe fem servir Bootstrap 5.3. Si trobes tutorials o codi de Bootstrap 4, aquestes són les diferències que més es noten:

  • Bootstrap 5 ja no necessita jQuery: n'hi ha prou amb un sol fitxer bootstrap.bundle.min.js.
  • Els atributs dels components porten bs: data-bs-toggle, data-bs-target.
  • Esquerra i dreta passen a ser inici i final: ml-auto → ms-auto, mr-3 → me-3, text-left → text-start.
  • btn-block se substitueix per w-100 o d-grid; form-group i form-row desapareixen.
  • Nou punt de tall xxl, classes g-* per als espais de la graella i mode fosc amb data-bs-theme="dark".

Instalación con CDNInstal·lació amb CDN

<head>
  …
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <link rel="stylesheet" href="css/style.css">   ← el tuyo, siempre después
</head>
<body>
  …
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>

El CSS va en el head; el JavaScript, al final del body. El JavaScript hace funcionar el menú hamburguesa, los desplegables, el carrusel, el acordeón y los modales: no hace falta escribir ni una línea.

<head>
  …
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  <link rel="stylesheet" href="css/style.css">   ← el teu, sempre després
</head>
<body>
  …
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>

El CSS va al head; el JavaScript, al final del body. El JavaScript fa funcionar el menú hamburguesa, els desplegables, el carrusel, l'acordió i els modals: no cal escriure'n ni una línia.

La rejilla de 12 columnasLa graella de 12 columnes

Imagina una hoja cuadriculada: el container es el borde de la hoja, cada row una fila y cada col una columna. Las columnas de una fila suman 12.

<div class="container">
  <div class="row">
    <div class="col-12 col-md-6 col-lg-4">…</div>
  </div>
</div>
PrefijoDesdePantalla
col-0Móvil
col-sm-576pxMóvil grande
col-md-768pxTableta
col-lg-992pxPortátil
col-xl-1200pxEscritorio
col-xxl-1400pxPantalla grande

Las clases se leen de pequeño a grande y cada una vale desde su punto de corte hacia arriba. container-fluid ocupa todo el ancho; g-3 añade huecos; row-cols-md-3 fija tres columnas por fila; offset-md-2 deja dos columnas vacías.

Imagina un full quadriculat: el container és la vora del full, cada row una fila i cada col una columna. Les columnes d'una fila sumen 12.

<div class="container">
  <div class="row">
    <div class="col-12 col-md-6 col-lg-4">…</div>
  </div>
</div>
PrefixDes dePantalla
col-0Mòbil
col-sm-576pxMòbil gran
col-md-768pxTauleta
col-lg-992pxPortàtil
col-xl-1200pxEscriptori
col-xxl-1400pxPantalla gran

Les classes es llegeixen de petit a gran i cadascuna val des del seu punt de tall cap amunt. container-fluid ocupa tota l'amplada; g-3 afegeix espais; row-cols-md-3 fixa tres columnes per fila; offset-md-2 deixa dues columnes buides.

Clases utilitariasClasses utilitàries

  • Espaciado: m (margin) o p (padding) + lado (t arriba, b abajo, s inicio, e fin, x horizontal, y vertical) + tamaño de 0 a 5. Ejemplos: mt-4, px-3, mx-auto.
  • Texto: text-center, fw-bold, fs-4, display-4, lead, small, text-uppercase.
  • Color: text-primary, bg-dark, text-white, bg-body-tertiary, border-info.
  • Display y Flexbox: d-none, d-md-block, d-flex, justify-content-between, align-items-center, gap-3, flex-wrap.
  • Otros: shadow, rounded-4, rounded-circle, border, w-100, min-vh-100, img-fluid.
  • Espaiat: m (margin) o p (padding) + costat (t a dalt, b a baix, s inici, e final, x horitzontal, y vertical) + mida de 0 a 5. Exemples: mt-4, px-3, mx-auto.
  • Text: text-center, fw-bold, fs-4, display-4, lead, small, text-uppercase.
  • Color: text-primary, bg-dark, text-white, bg-body-tertiary, border-info.
  • Display i Flexbox: d-none, d-md-block, d-flex, justify-content-between, align-items-center, gap-3, flex-wrap.
  • Altres: shadow, rounded-4, rounded-circle, border, w-100, min-vh-100, img-fluid.

ComponentesComponents

Los componentes se copian de la documentación oficial y se adaptan. Los que usamos en clase:

  • Navbar: menú responsive con botón hamburguesa y desplegables.
  • Carousel: pase de imágenes con flechas e indicadores.
  • Card: tarjeta con imagen, título, texto y botón.
  • Buttons: btn btn-primary, btn-outline-*, tamaños btn-lg y btn-sm.
  • Forms: form-control, form-label, form-check, form-select, input-group.
  • Accordion: preguntas que se abren y se cierran.
  • Badge, Alert, List group y Modal para el resto de necesidades.

Para los iconos usamos Bootstrap Icons: <i class="bi bi-instagram"></i>.

Els components es copien de la documentació oficial i s'adapten. Els que fem servir a classe:

  • Navbar: menú responsive amb botó hamburguesa i desplegables.
  • Carousel: passi d'imatges amb fletxes i indicadors.
  • Card: targeta amb imatge, títol, text i botó.
  • Buttons: btn btn-primary, btn-outline-*, mides btn-lg i btn-sm.
  • Forms: form-control, form-label, form-check, form-select, input-group.
  • Accordion: preguntes que s'obren i es tanquen.
  • Badge, Alert, List group i Modal per a la resta de necessitats.

Per a les icones fem servir Bootstrap Icons: <i class="bi bi-instagram"></i>.

Personalizar BootstrapPersonalitzar Bootstrap

  1. Enlaza tu style.css después del de Bootstrap: con la misma especificidad, gana tu regla.
  2. Cambia sus variables: .btn-primary { --bs-btn-bg: #7a5cf5; } o :root { --bs-body-font-family: 'Inter'; }.
  3. Si no basta, usa un selector más específico: #footer a.
  4. !important solo cuando Bootstrap también lo usa, como en sus clases utilitarias.

Bootstrap da la estructura; tu CSS da la personalidad.

  1. Enllaça el teu style.css després del de Bootstrap: amb la mateixa especificitat, guanya la teva regla.
  2. Canvia les seves variables: .btn-primary { --bs-btn-bg: #7a5cf5; } o :root { --bs-body-font-family: 'Inter'; }.
  3. Si no n'hi ha prou, fes servir un selector més específic: #footer a.
  4. !important només quan Bootstrap també el fa servir, com a les classes utilitàries.

Bootstrap dona l'estructura; el teu CSS dona la personalitat.

PrácticasPràctiques

4.1

Primera página con BootstrapPrimera pàgina amb Bootstrap

En directoEn directe20 minmin

ObjetivoObjectiu. Cargar Bootstrap 5.3 desde el CDN y probar las primeras clases y componentes.Carregar Bootstrap 5.3 des del CDN i provar les primeres classes i components.

El código está comentado en castellano.El codi està comentat en castellà.

4.2

La rejilla de 12 columnasLa graella de 12 columnes

En directoEn directe20 minmin

ObjetivoObjectiu. Ver la rejilla completa: 12 columnas, 3 columnas, columnas responsive y una columna entera.Veure la graella completa: 12 columnes, 3 columnes, columnes responsive i una columna sencera.

El código está comentado en castellano.El codi està comentat en castellà.

4.3

Cinco ejercicios de rejillaCinc exercicis de graella

Ejercicio autónomoExercici autònom25 minmin

ObjetivoObjectiu. Resolver cinco maquetaciones con container, row y col.Resoldre cinc maquetacions amb container, row i col.

EnunciadoEnunciat

  1. Layout básico: un contenedor con una fila de dos columnas, col-8 y col-4.
  2. Varias filas: en el mismo contenedor, una fila con tres col-4, otra con cuatro col-3 y otra con una col-12.
  3. Responsive: una fila con tres columnas col-12 col-sm-6 col-md-4. Cambia el ancho de la ventana y observa.
  4. Anidar: una columna col-12 que contiene otra fila con dos col-6.
  5. Centrar: una fila alta con una columna centrada en horizontal y en vertical.
  1. Layout bàsic: un contenidor amb una fila de dues columnes, col-8 i col-4.
  2. Diverses files: al mateix contenidor, una fila amb tres col-4, una altra amb quatre col-3 i una altra amb una col-12.
  3. Responsive: una fila amb tres columnes col-12 col-sm-6 col-md-4. Canvia l'amplada de la finestra i observa.
  4. Imbricar: una columna col-12 que conté una altra fila amb dues col-6.
  5. Centrar: una fila alta amb una columna centrada en horitzontal i en vertical.
Ver solución comentadaMostra la solució comentada

El código está comentado en castellano.El codi està comentat en castellà.

4.4

Mascotalia con BootstrapMascotalia amb Bootstrap

En directoEn directe90 minmin

ObjetivoObjectiu. Rehacer la landing de la sesión 3 con navbar, carrusel, tarjetas, formulario y footer de Bootstrap, en seis pasos.Refer la landing de la sessió 3 amb navbar, carrusel, targetes, formulari i footer de Bootstrap, en sis passos.

PasosPassos

  1. Plantilla: CSS de Bootstrap, Bootstrap Icons y nuestro css/style.css, en este orden.
  2. Navbar oscura con logo, botón hamburguesa, desplegable de servicios y enlace de contacto destacado.
  3. Carrusel de tres imágenes con indicadores, flechas y un texto sobre la primera.
  4. Sección de tarjetas: tres cards de la misma altura en una rejilla col-md-4.
  5. Formulario de contacto con rejilla de formulario, casilla de privacidad y botón a todo el ancho.
  6. Footer con tres enlaces que se apilan en el móvil y se ponen en fila desde 992px.
  1. Plantilla: CSS de Bootstrap, Bootstrap Icons i el nostre css/style.css, en aquest ordre.
  2. Navbar fosca amb logotip, botó hamburguesa, desplegable de serveis i enllaç de contacte destacat.
  3. Carrusel de tres imatges amb indicadors, fletxes i un text sobre la primera.
  4. Secció de targetes: tres cards de la mateixa alçada en una graella col-md-4.
  5. Formulari de contacte amb graella de formulari, casella de privacitat i botó a tota l'amplada.
  6. Footer amb tres enllaços que s'apilen al mòbil i es posen en fila des de 992px.

El código está comentado en castellano.El codi està comentat en castellà.

4.6

Proyecto final: landing de un videojuegoProjecte final: landing d'un videojoc

Ejercicio autónomoExercici autònom120 minmin

ObjetivoObjectiu. Construir con Bootstrap una landing completa a partir de un briefing con textos.Construir amb Bootstrap una landing completa a partir d'un briefing amb textos.

EnunciadoEnunciat

Construye la web de lanzamiento de Nova Frontera, un videojuego inventado del estudio barcelonés Estudio Astrolabio. Usa estos textos y estas secciones:

  • Barra superior: «Contáctanos: 600 200 300».
  • Menú: logo, Inicio, Características, un desplegable con Equipo y Preguntas frecuentes, y un campo de correo con el botón «Suscríbete».
  • Carrusel de tres imágenes espaciales.
  • Introducción. Título: «Nova Frontera, la última frontera del gaming». Texto: «Explora el cosmos como nunca en Nova Frontera, el nuevo título de Estudio Astrolabio. Prepárate para un viaje por el espacio que redefine el género del rol».
  • Características, tres bloques con imagen, h3 y párrafo: Mundo abierto («Descubre planetas, sistemas solares y civilizaciones nunca vistos. El límite lo pones tú»), Personalización («Personaliza tu nave, tu equipo y tu personaje para afrontar los retos de la galaxia») y Gráficos y tecnología («Un nivel de detalle sin precedentes gracias a un motor gráfico creado para este juego»).
  • Botones de acción: Reservar ahora, Descubrir más y Ver tráiler.
  • Equipo: cuatro tarjetas (directora del proyecto, productor general, directora de arte y director de sonido) con nombres inventados.
  • Preguntas frecuentes en un acordeón: qué es el juego, plataformas, si necesita internet, personalización, duración de la campaña e idiomas.
  • Footer con el copyright y tres iconos de redes sociales.

Personaliza el color principal con variables y una fuente de Google Fonts. Entrega la carpeta comprimida en la carpeta de entregas del curso.

Construeix la web de llançament de Nova Frontera, un videojoc inventat de l'estudi barceloní Estudio Astrolabio. Fes servir aquests textos i aquestes seccions:

  • Barra superior: «Contacta'ns: 600 200 300».
  • Menú: logotip, Inici, Característiques, un desplegable amb Equip i Preguntes freqüents, i un camp de correu amb el botó «Subscriu-te».
  • Carrusel de tres imatges espacials.
  • Introducció. Títol: «Nova Frontera, l'última frontera del gaming». Text: «Explora el cosmos com mai a Nova Frontera, el nou títol d'Estudio Astrolabio. Prepara't per a un viatge per l'espai que redefineix el gènere del rol».
  • Característiques, tres blocs amb imatge, h3 i paràgraf: Món obert, Personalització i Gràfics i tecnologia (els textos de la solució són en castellà; pots traduir-los).
  • Botons d'acció: Reserva ara, Descobreix-ne més i Mira el tràiler.
  • Equip: quatre targetes (directora del projecte, productor general, directora d'art i director de so) amb noms inventats.
  • Preguntes freqüents en un acordió: què és el joc, plataformes, si necessita internet, personalització, durada de la campanya i idiomes.
  • Footer amb el copyright i tres icones de xarxes socials.

Personalitza el color principal amb variables i una font de Google Fonts. Lliura la carpeta comprimida a la carpeta de lliuraments del curs.

Ver solución comentadaMostra la solució comentada

El código está comentado en castellano.El codi està comentat en castellà.

Anexo de ejercicios extraAnnex d'exercicis extra

Seis ejercicios por bloque para practicar en casa o terminar antes en clase. Los dos primeros de cada bloque son guiados, con pasos y código comentado línea a línea; los dos siguientes, de nivel intermedio, traen pistas; los dos últimos son retos completos. Intenta resolverlos antes de abrir la solución.Sis exercicis per bloc per practicar a casa o per a qui acabi abans a classe. Els dos primers de cada bloc són guiats, amb passos i codi comentat línia a línia; els dos següents, de nivell intermedi, porten pistes; els dos últims són reptes complets. Intenta resoldre'ls abans d'obrir la solució.

HTMLHTML

NivelNivell 1

Receta de pan con tomateRecepta de pa amb tomàquet

GuiadoGuiat20 min

ObjetivoObjectiu. Estructurar una receta completa con títulos, párrafos, listas ordenadas y sin orden, y marcar el texto importante con strong y em.Estructurar una recepta completa amb títols, paràgrafs, llistes ordenades i sense ordre, i marcar el text important amb strong i em.

EnunciadoEnunciat

Vas a escribir en HTML la receta del pan con tomate, tal como aparecería en un blog de cocina. Todavía no usamos CSS: el objetivo es que el contenido esté bien organizado con las etiquetas correctas.

La página debe tener:

  • Un título principal con el nombre de la receta.
  • Una introducción y una línea con raciones, tiempo y dificultad.
  • Una sección de ingredientes y otra de utensilios, cada una con su lista.
  • Una sección de preparación con los pasos numerados.
  • Una sección de consejos con una lista anidada.

Cuando termines, abre el archivo en el navegador y comprueba que los pasos salen numerados y los ingredientes con puntos.

Escriuràs en HTML la recepta del pa amb tomàquet, tal com sortiria en un blog de cuina. Encara no fem servir CSS: l'objectiu és que el contingut estigui ben organitzat amb les etiquetes correctes.

La pàgina ha de tenir:

  • Un títol principal amb el nom de la recepta.
  • Una introducció i una línia amb racions, temps i dificultat.
  • Una secció d'ingredients i una altra d'estris, cadascuna amb la seva llista.
  • Una secció de preparació amb els passos numerats.
  • Una secció de consells amb una llista niada.

Quan acabis, obre el fitxer al navegador i comprova que els passos surten numerats i els ingredients amb punts.

PasosPassos

  1. Crea una carpeta para el ejercicio y, dentro, un archivo llamado index.html.
  2. Escribe la estructura básica: <!DOCTYPE html>, <html lang="es">, <head> y <body>. En VS Code puedes teclear ! y pulsar Tab.
  3. Dentro de <head> comprueba que están <meta charset="UTF-8"> y la etiqueta viewport, y cambia el <title> por «Pan con tomate · Receta».
  4. En el <body>, escribe un <h1> con el nombre de la receta. Solo habrá un h1 en toda la página.
  5. Añade un <p> de introducción y marca *pa amb tomàquet* con <em>, porque es una expresión en otro idioma que queremos destacar con la voz.
  6. Escribe otro <p> con raciones, tiempo y dificultad. Pon cada etiqueta (Raciones:, Tiempo:, Dificultad:) dentro de <strong>.
  7. Crea un <h2>Ingredientes</h2> y debajo una lista <ul> con un <li> por ingrediente. Usamos ul porque el orden da igual.
  8. Repite lo mismo con un <h2>Utensilios</h2> y su <ul>.
  9. Crea un <h2>Preparación</h2> y debajo una lista <ol> con los pasos. Usamos ol porque el orden importa y así el navegador los numera solo.
  10. En la sección <h2>Consejos</h2>, crea un <ul> y, dentro del primer <li>, abre otro <ul> con los acompañamientos. Ciérralo antes de cerrar ese </li>.
  11. Añade un párrafo final que combine <strong> y <em> uno dentro del otro, cerrándolos en orden inverso al de apertura.
  12. Guarda, abre el archivo en el navegador y revisa la indentación: cada etiqueta interior debe estar desplazada hacia la derecha respecto a su contenedora.
  1. Crea una carpeta per a l'exercici i, a dins, un fitxer anomenat index.html.
  2. Escriu l'estructura bàsica: <!DOCTYPE html>, <html lang="es">, <head> i <body>. Al VS Code pots teclejar ! i prémer Tab.
  3. Dins de <head> comprova que hi ha <meta charset="UTF-8"> i l'etiqueta viewport, i canvia el <title> per «Pan con tomate · Receta».
  4. Al <body>, escriu un <h1> amb el nom de la recepta. Només hi haurà un h1 a tota la pàgina.
  5. Afegeix un <p> d'introducció i marca *pa amb tomàquet* amb <em>, perquè és una expressió en una altra llengua que volem destacar amb la veu.
  6. Escriu un altre <p> amb racions, temps i dificultat. Posa cada etiqueta (Raciones:, Tiempo:, Dificultad:) dins de <strong>.
  7. Crea un <h2>Ingredientes</h2> i a sota una llista <ul> amb un <li> per ingredient. Fem servir ul perquè l'ordre no importa.
  8. Repeteix el mateix amb un <h2>Utensilios</h2> i la seva <ul>.
  9. Crea un <h2>Preparación</h2> i a sota una llista <ol> amb els passos. Fem servir ol perquè l'ordre sí que importa i així el navegador els numera sol.
  10. A la secció <h2>Consejos</h2>, crea una <ul> i, dins del primer <li>, obre una altra <ul> amb els acompanyaments. Tanca-la abans de tancar aquest </li>.
  11. Afegeix un paràgraf final que combini <strong> i <em> l'un dins de l'altre, tancant-los en ordre invers al d'obertura.
  12. Desa, obre el fitxer al navegador i revisa la indentació: cada etiqueta interior ha d'estar desplaçada cap a la dreta respecte a la que la conté.

<!DOCTYPE html><h1><h2><p><ul><ol><li>listas anidadas<strong><em>

Ver solución comentadaMostra la solució comentada
NivelNivell 2

Ficha de un libro inventadoFitxa d'un llibre inventat

GuiadoGuiat30 min

ObjetivoObjectiu. Maquetar la ficha de una novela con su portada en figure y figcaption, una cita en blockquote y enlaces de los tres tipos: anclas internas, externos y de correo.Maquetar la fitxa d'una novel·la amb la portada dins de figure i figcaption, una cita en blockquote i enllaços dels tres tipus: àncores internes, externs i de correu.

EnunciadoEnunciat

Una editorial pequeña de Gràcia te pide la página de su última novela, «El reloj de la plaza del Sol». Tienes que preparar la ficha en HTML, sin CSS.

La ficha debe incluir:

  • Título del libro, autora y editorial.
  • Un menú de anclas que lleve a cada sección de la página.
  • La portada con su pie de foto.
  • La sinopsis en dos párrafos.
  • Una lista con los datos del libro.
  • Dos enlaces externos que se abran en una pestaña nueva.
  • Dos citas de la crítica con su autor.
  • Un enlace de correo con el asunto ya escrito.
  • Un enlace final para volver arriba.

Una editorial petita de Gràcia et demana la pàgina de la seva darrera novel·la, «El reloj de la plaza del Sol». Has de preparar la fitxa en HTML, sense CSS.

La fitxa ha d'incloure:

  • Títol del llibre, autora i editorial.
  • Un menú d'àncores que porti a cada secció de la pàgina.
  • La portada amb el seu peu de foto.
  • La sinopsi en dos paràgrafs.
  • Una llista amb les dades del llibre.
  • Dos enllaços externs que s'obrin en una pestanya nova.
  • Dues cites de la crítica amb el seu autor.
  • Un enllaç de correu amb l'assumpte ja escrit.
  • Un enllaç final per tornar a dalt.

PasosPassos

  1. Crea index.html con la estructura básica, lang="es", charset y viewport. Pon como <title> el nombre del libro.
  2. Escribe el <h1> con el título del libro y dale id="arriba". Debajo, un <p> con la autora en <strong> y la editorial.
  3. Crea un párrafo con cuatro enlaces de ancla: <a href="#sinopsis">, #datos, #critica y #contacto. Todavía no funcionan porque los destinos no existen.
  4. Añade la portada: abre <figure>, dentro pon <img> con src de picsum.photos, un alt que describa la imagen, width y height. Cierra con un <figcaption> y </figure>.
  5. Escribe <h2 id="sinopsis">Sinopsis</h2> y dos párrafos. Comprueba en el navegador que el enlace «Sinopsis» del menú ya salta hasta aquí.
  6. Crea <h2 id="datos"> y una lista <ul> con autora, editorial, año, páginas, género y formatos. Pon el nombre de cada dato en <strong>.
  7. Debajo, un <h3> y otra lista con dos enlaces externos. Cada <a> lleva href con una URL completa (https://...), target="_blank" y rel="noopener noreferrer".
  8. Escribe <h2 id="critica"> y dos <blockquote>, cada uno con su texto dentro de un <p>. Debajo de cada cita, un párrafo con quién la firma. Usa <cite> para el nombre de la publicación.
  9. Crea <h2 id="contacto"> y un párrafo con un enlace mailto:. Añade ?subject= y escribe los espacios del asunto como %20.
  10. Termina con <a href="#arriba">Volver arriba</a> y prueba todos los enlaces en el navegador uno por uno.
  1. Crea index.html amb l'estructura bàsica, lang="es", charset i viewport. Posa com a <title> el nom del llibre.
  2. Escriu l'<h1> amb el títol del llibre i dona-li id="arriba". A sota, un <p> amb l'autora dins de <strong> i l'editorial.
  3. Crea un paràgraf amb quatre enllaços d'àncora: <a href="#sinopsis">, #datos, #critica i #contacto. Encara no funcionen perquè les destinacions no existeixen.
  4. Afegeix la portada: obre <figure>, a dins posa <img> amb src de picsum.photos, un alt que descrigui la imatge, width i height. Tanca amb un <figcaption> i </figure>.
  5. Escriu <h2 id="sinopsis">Sinopsis</h2> i dos paràgrafs. Comprova al navegador que l'enllaç «Sinopsis» del menú ja salta fins aquí.
  6. Crea <h2 id="datos"> i una llista <ul> amb autora, editorial, any, pàgines, gènere i formats. Posa el nom de cada dada dins de <strong>.
  7. A sota, un <h3> i una altra llista amb dos enllaços externs. Cada <a> porta href amb una URL completa (https://...), target="_blank" i rel="noopener noreferrer".
  8. Escriu <h2 id="critica"> i dos <blockquote>, cadascun amb el text dins d'un <p>. A sota de cada cita, un paràgraf amb qui la signa. Fes servir <cite> per al nom de la publicació.
  9. Crea <h2 id="contacto"> i un paràgraf amb un enllaç mailto:. Afegeix ?subject= i escriu els espais de l'assumpte com a %20.
  10. Acaba amb <a href="#arriba">Volver arriba</a> i prova tots els enllaços al navegador un per un.

<figure><figcaption><img>altidanclas #target="_blank"rel="noopener noreferrer"mailto:<blockquote><cite>

Ver solución comentadaMostra la solució comentada
NivelNivell 3

Horario de un polideportivo de barrioHorari d'un poliesportiu de barri

IntermedioIntermedi40 min

ObjetivoObjectiu. Construir una tabla accesible con caption, thead, tbody, tfoot y encabezados con scope, y unir celdas con colspan y rowspan sin que se descuadre.Construir una taula accessible amb caption, thead, tbody, tfoot i encapçalaments amb scope, i unir cel·les amb colspan i rowspan sense que es descuadri.

EnunciadoEnunciat

El Poliesportiu de la Bordeta, en Sants, quiere publicar en su web el horario semanal de actividades y los precios del abono. Te pasan esta información:

  • Columnas: Hora, y de lunes a sábado.
  • Mañanas: natación libre de lunes a viernes de 7 a 8; pilates (lunes, miércoles, viernes) y ciclo indoor (martes, jueves) de 8 a 9; gimnasia suave +65 (lunes, miércoles, viernes) y yoga (martes, jueves) de 9 a 10; aquagym de lunes a viernes de 10 a 11; sala de musculación con monitor de lunes a viernes de 11 a 12.
  • Sábado por la mañana: cerrado hasta las 9, natación infantil de 9 a 11 y liga de pádel de 11 a 12.
  • Tardes: multideporte infantil (lunes, miércoles) y judo infantil (martes, jueves) de 17 a 18; baile fitness (lunes, miércoles) y ciclo indoor (martes, jueves) de 18 a 19; tonificación (lunes, miércoles) y yoga (martes, jueves) de 19 a 20; natación libre de lunes a jueves de 20 a 21.
  • Viernes por la tarde: baile urbano juvenil de 17 a 19, natación libre de 19 a 20 y voleibol mixto de 20 a 21.
  • Sábado por la tarde: cerrado.
  • Una nota al pie sobre inscripciones y la última entrada a la piscina.

Además, prepara una segunda tabla con las tarifas: cuatro tipos de abono (adulto, joven, mayores de 65, familiar) y tres duraciones (mensual, trimestral, anual), con una nota sobre la matrícula.

Cuando una actividad se repite varios días seguidos a la misma hora, o dura más de una hora, usa una sola celda que ocupe todo ese espacio.

El Poliesportiu de la Bordeta, a Sants, vol publicar al seu web l'horari setmanal d'activitats i els preus de l'abonament. Et passen aquesta informació:

  • Columnes: Hora, i de dilluns a dissabte.
  • Matins: natació lliure de dilluns a divendres de 7 a 8; pilates (dilluns, dimecres, divendres) i cicle indoor (dimarts, dijous) de 8 a 9; gimnàstica suau +65 (dilluns, dimecres, divendres) i ioga (dimarts, dijous) de 9 a 10; aquagym de dilluns a divendres de 10 a 11; sala de musculació amb monitor de dilluns a divendres d'11 a 12.
  • Dissabte al matí: tancat fins a les 9, natació infantil de 9 a 11 i lliga de pàdel d'11 a 12.
  • Tardes: multiesport infantil (dilluns, dimecres) i judo infantil (dimarts, dijous) de 17 a 18; ball fitness (dilluns, dimecres) i cicle indoor (dimarts, dijous) de 18 a 19; tonificació (dilluns, dimecres) i ioga (dimarts, dijous) de 19 a 20; natació lliure de dilluns a dijous de 20 a 21.
  • Divendres a la tarda: ball urbà juvenil de 17 a 19, natació lliure de 19 a 20 i voleibol mixt de 20 a 21.
  • Dissabte a la tarda: tancat.
  • Una nota al peu sobre inscripcions i l'última entrada a la piscina.

A més, prepara una segona taula amb les tarifes: quatre tipus d'abonament (adult, jove, més grans de 65, familiar) i tres durades (mensual, trimestral, anual), amb una nota sobre la matrícula.

Quan una activitat es repeteix diversos dies seguits a la mateixa hora, o dura més d'una hora, fes servir una sola cel·la que ocupi tot aquest espai.

PasosPassos

  1. Dibuja primero la tabla en papel: 7 columnas y una fila por franja horaria. Marca las celdas que se unen.
  2. Escribe la estructura vacía: table, caption, thead con la fila de días, dos tbody (mañanas y tardes) y tfoot.
  3. Rellena las filas una a una, contando que cada fila sume 7 columnas.
  4. Construye la tabla de tarifas con encabezados arriba y a la izquierda.
  5. Revisa en el navegador que ninguna fila se sale por la derecha.
  1. Dibuixa primer la taula en paper: 7 columnes i una fila per franja horària. Marca les cel·les que s'uneixen.
  2. Escriu l'estructura buida: table, caption, thead amb la fila de dies, dos tbody (matins i tardes) i tfoot.
  3. Omple les files una a una, comptant que cada fila sumi 7 columnes.
  4. Construeix la taula de tarifes amb encapçalaments a dalt i a l'esquerra.
  5. Revisa al navegador que cap fila no surti per la dreta.

PistasPistes

  • Sin CSS la tabla no tiene bordes. Añade en el <head> un <style> con th, td { border: 1px solid #555; } y table { border-collapse: collapse; } para ver las celdas.
  • colspan une celdas hacia la derecha; rowspan hacia abajo. En la fila siguiente a un rowspan hay que escribir una celda menos.
  • Las horas de la primera columna son encabezados de fila: usa <th scope="row">. Los días son encabezados de columna: <th scope="col">.
  • Para separar mañanas y tardes puedes poner una fila con <th colspan="7" scope="rowgroup"> al principio de cada tbody.
  • El sábado por la tarde está cerrado durante cuatro franjas: una sola celda con rowspan="4".
  • Sense CSS la taula no té vores. Afegeix al <head> un <style> amb th, td { border: 1px solid #555; } i table { border-collapse: collapse; } per veure les cel·les.
  • colspan uneix cel·les cap a la dreta; rowspan, cap avall. A la fila següent a un rowspan cal escriure una cel·la menys.
  • Les hores de la primera columna són encapçalaments de fila: fes servir <th scope="row">. Els dies són encapçalaments de columna: <th scope="col">.
  • Per separar matins i tardes pots posar una fila amb <th colspan="7" scope="rowgroup"> al principi de cada tbody.
  • El dissabte a la tarda està tancat durant quatre franges: una sola cel·la amb rowspan="4".

<table><caption><thead><tbody><tfoot><tr><th><td>scopecolspanrowspan<br>

Ver solución comentadaMostra la solució comentada
NivelNivell 4

Formulario de reserva de mesaFormulari de reserva de taula

IntermedioIntermedi45 min

ObjetivoObjectiu. Construir un formulario completo con los tipos de campo más habituales, agrupados con fieldset y legend, y validado por el propio navegador.Construir un formulari complet amb els tipus de camp més habituals, agrupats amb fieldset i legend, i validat pel mateix navegador.

EnunciadoEnunciat

Can Gaspar, un restaurante de cocina de mercado en Gràcia, quiere dejar de tomar reservas por teléfono. Necesita un formulario en su web que recoja estos datos:

  • Tus datos: nombre y apellidos (obligatorio, entre 3 y 60 caracteres), correo electrónico (obligatorio) y móvil (obligatorio, 9 cifras empezando por 6 o 7).
  • Tu reserva: día (solo fechas de 2026), hora (entre las 13:00 y las 22:30, de media en media hora), número de personas (de 1 a 12, por defecto 2) y zona del restaurante en un desplegable: me da igual, sala interior, terraza o barra.
  • Tipo de menú, eligiendo solo uno: a la carta, menú de mediodía o menú degustación.
  • Necesidades especiales, pudiendo marcar varias: trona, mesa accesible, celíaco, opciones vegetarianas.
  • Un campo de comentarios de varias líneas, de 500 caracteres como máximo.
  • Una casilla obligatoria para aceptar la política de cancelación.
  • Un botón para enviar y otro para borrar.

Cada bloque debe ir agrupado y con su título. Todos los campos necesitan un texto asociado que se pueda pulsar.

Can Gaspar, un restaurant de cuina de mercat a Gràcia, vol deixar de prendre reserves per telèfon. Necessita un formulari al seu web que reculli aquestes dades:

  • Les teves dades: nom i cognoms (obligatori, entre 3 i 60 caràcters), correu electrònic (obligatori) i mòbil (obligatori, 9 xifres començant per 6 o 7).
  • La teva reserva: dia (només dates del 2026), hora (entre les 13:00 i les 22:30, de mitja en mitja hora), nombre de persones (d'1 a 12, per defecte 2) i zona del restaurant en un desplegable: m'és igual, sala interior, terrassa o barra.
  • Tipus de menú, triant-ne només un: a la carta, menú de migdia o menú degustació.
  • Necessitats especials, amb la possibilitat de marcar-ne diverses: trona, taula accessible, celíac, opcions vegetarianes.
  • Un camp de comentaris de diverses línies, de 500 caràcters com a màxim.
  • Una casella obligatòria per acceptar la política de cancel·lació.
  • Un botó per enviar i un altre per esborrar.

Cada bloc ha d'anar agrupat i amb el seu títol. Tots els camps necessiten un text associat que es pugui clicar.

PasosPassos

  1. Escribe el <form> con action y method y crea los cinco fieldset vacíos, cada uno con su legend.
  2. Rellena el bloque de datos de contacto con su validación.
  3. Añade los campos de la reserva: fecha, hora, personas y desplegable.
  4. Crea el grupo de radio y el grupo de checkbox.
  5. Termina con el textarea, la casilla de condiciones y los botones, y prueba a enviar con campos vacíos o mal escritos.
  1. Escriu el <form> amb action i method i crea els cinc fieldset buits, cadascun amb la seva legend.
  2. Omple el bloc de dades de contacte amb la seva validació.
  3. Afegeix els camps de la reserva: data, hora, persones i desplegable.
  4. Crea el grup de radio i el grup de checkbox.
  5. Acaba amb el textarea, la casella de condicions i els botons, i prova d'enviar amb camps buits o mal escrits.

PistasPistes

  • El for de cada <label> tiene que ser idéntico al id de su campo. Comprueba que al pulsar el texto se activa la casilla.
  • Los radio de un mismo grupo comparten name y se diferencian por value. Si les pones names distintos, se podrán marcar todos.
  • Las fechas en min y max se escriben como AAAA-MM-DD. Para la hora, step="1800" son 30 minutos expresados en segundos.
  • Para el móvil usa type="tel" con pattern="[6-7][0-9]{8}" y explica el formato en el atributo title.
  • <textarea> y <select> llevan etiqueta de cierre; <input> no.
  • El for de cada <label> ha de ser idèntic a l'id del seu camp. Comprova que en clicar el text s'activa la casella.
  • Els radio d'un mateix grup comparteixen name i es diferencien per value. Si els poses names diferents, es podran marcar tots.
  • Les dates a min i max s'escriuen com a AAAA-MM-DD. Per a l'hora, step="1800" són 30 minuts expressats en segons.
  • Per al mòbil fes servir type="tel" amb pattern="[6-7][0-9]{8}" i explica el format a l'atribut title.
  • <textarea> i <select> porten etiqueta de tancament; <input>, no.

<form>actionmethod<fieldset><legend><label for>type="email"type="tel"type="date"type="time"type="number"min / max<select><option>type="radio"type="checkbox"<textarea>requiredpattern<button>

Ver solución comentadaMostra la solució comentada
NivelNivell 5

Artículo de blog semánticoArticle de blog semàntic

RetoRepte50 min

ObjetivoObjectiu. Organizar una página de blog completa con las etiquetas semánticas de HTML5, de forma que cada parte del contenido use la etiqueta que le corresponde.Organitzar una pàgina de blog completa amb les etiquetes semàntiques d'HTML5, de manera que cada part del contingut faci servir l'etiqueta que li correspon.

EnunciadoEnunciat

Ruta Lenta BCN es un blog sobre paseos por los barrios de Barcelona. Te encargan maquetar en HTML su artículo «Cinco mercados de barrio para comprar sin prisa». El texto lo escribes tú: cinco mercados municipales reales o inventados, con un párrafo o dos de cada uno.

Requisitos:

  • Cabecera del sitio con el nombre del blog, un lema y un menú principal de cuatro enlaces.
  • Un único contenido principal que contenga el artículo y una zona lateral.
  • El artículo tiene su propia cabecera con título, autora (enlazada a su ficha al final) y fecha de publicación legible por máquinas.
  • Un índice con anclas internas a cada sección del artículo, separado del menú principal.
  • Una imagen principal con pie de foto y, al menos, otra imagen dentro de una de las secciones.
  • Cinco secciones, una por mercado, y una sección final de consejos en lista numerada. Al menos una sección con un subtítulo de tercer nivel.
  • Un pie del artículo con los datos de contacto de la autora y la fecha de la última actualización.
  • Una zona lateral con tres artículos relacionados y una invitación al boletín.
  • Un pie de la web con el copyright y tres enlaces legales.
  • Una meta description en el head.

La página no lleva CSS. Comprueba que el esquema de títulos tiene sentido leyéndolo solo de h1 a h3.

Ruta Lenta BCN és un blog sobre passejades pels barris de Barcelona. T'encarreguen maquetar en HTML el seu article «Cinco mercados de barrio para comprar sin prisa». El text l'escrius tu: cinc mercats municipals reals o inventats, amb un paràgraf o dos de cadascun.

Requisits:

  • Capçalera del lloc amb el nom del blog, un lema i un menú principal de quatre enllaços.
  • Un únic contingut principal que contingui l'article i una zona lateral.
  • L'article té la seva pròpia capçalera amb títol, autora (enllaçada a la seva fitxa al final) i data de publicació llegible per màquines.
  • Un índex amb àncores internes a cada secció de l'article, separat del menú principal.
  • Una imatge principal amb peu de foto i, com a mínim, una altra imatge dins d'una de les seccions.
  • Cinc seccions, una per mercat, i una secció final de consells en llista numerada. Com a mínim una secció amb un subtítol de tercer nivell.
  • Un peu de l'article amb les dades de contacte de l'autora i la data de l'última actualització.
  • Una zona lateral amb tres articles relacionats i una invitació al butlletí.
  • Un peu del web amb el copyright i tres enllaços legals.
  • Una meta description al head.

La pàgina no porta CSS. Comprova que l'esquema de títols té sentit llegint-lo només d'h1 a h3.

PasosPassos

  1. Dibuja el esqueleto con cajas: header, main (article + aside) y footer.
  2. Escribe el esqueleto semántico vacío y comprueba que cada etiqueta se cierra donde toca.
  3. Rellena el artículo sección a sección, con su índice de anclas.
  4. Añade aside y footer, y revisa el orden de los títulos.
  1. Dibuixa l'esquelet amb caixes: header, main (article + aside) i footer.
  2. Escriu l'esquelet semàntic buit i comprova que cada etiqueta es tanca on toca.
  3. Omple l'article secció a secció, amb el seu índex d'àncores.
  4. Afegeix aside i footer, i revisa l'ordre dels títols.

PistasPistes

  • header y footer pueden aparecer varias veces: los de body son de la web y los de article, del artículo.
  • Si hay dos nav en la página, distínguelos con aria-label (por ejemplo «Menú principal» e «Índice del artículo»).
  • <time datetime="2026-03-14"> guarda la fecha en formato máquina; el texto de dentro puede ser «14 de marzo de 2026».
  • <address> solo sirve para el contacto de quien firma el artículo o la web, no para cualquier dirección postal.
  • header i footer poden aparèixer diverses vegades: els de body són del web i els d'article, de l'article.
  • Si hi ha dos nav a la pàgina, distingeix-los amb aria-label (per exemple «Menú principal» i «Índice del artículo»).
  • <time datetime="2026-03-14"> desa la data en format màquina; el text de dins pot ser «14 de marzo de 2026».
  • <address> només serveix per al contacte de qui signa l'article o el web, no per a qualsevol adreça postal.

<header><nav>aria-label<main><article><section><aside><figure><time datetime><address><footer><meta name="description">©

Ver solución comentadaMostra la solució comentada
NivelNivell 6

Mini sitio de tres páginas para un taller de bicisMinilloc de tres pàgines per a un taller de bicis

RetoRepte90 min

ObjetivoObjectiu. Construir una web de tres páginas enlazadas con la misma cabecera, menú y pie, organizada en carpetas y navegable con rutas relativas.Construir un web de tres pàgines enllaçades amb la mateixa capçalera, menú i peu, organitzat en carpetes i navegable amb rutes relatives.

EnunciadoEnunciat

La Cadena es un taller de bicicletas de barrio en el Poblenou. Quieren una web sencilla de tres páginas que puedan ampliar más adelante. Te piden que la estructura de carpetas sea esta:

  • index.html en la raíz, con la portada.
  • Una carpeta paginas/ con servicios.html y contacto.html.

Requisitos comunes a las tres páginas:

  • Estructura semántica completa: header, nav, main y footer.
  • La misma cabecera con el nombre del taller (enlazado a la portada) y un menú con las tres páginas. El enlace de la página actual lleva aria-current="page".
  • El mismo pie con dirección, teléfono, correo, horario resumido, los tres enlaces y el copyright.
  • Un title y una meta description propios en cada página.
  • Todos los enlaces internos con rutas relativas. Ninguno puede empezar por / ni por C:.

Contenido de cada página:

  • Portada: título principal, presentación del taller, una imagen con pie, tres bloques con los servicios estrella (cada uno con su h2) y dos opiniones de clientes.
  • Servicios: un índice interno con anclas, una tabla de precios de reparaciones, dos niveles de revisión con lo que incluye cada uno, una sección sobre bicis eléctricas y otra de servicios extra.
  • Contacto: dirección y transporte público, una imagen de la fachada, el horario en una tabla (los días cerrados en una celda que ocupe mañana y tarde) y un formulario para pedir cita con datos personales, tipo de bici, servicio, día preferido, mensaje y aceptación de privacidad.

Prueba la navegación completa: desde cualquier página tienes que poder llegar a las otras dos sin ningún enlace roto.

La Cadena és un taller de bicicletes de barri al Poblenou. Volen un web senzill de tres pàgines que puguin ampliar més endavant. Et demanen que l'estructura de carpetes sigui aquesta:

  • index.html a l'arrel, amb la portada.
  • Una carpeta paginas/ amb servicios.html i contacto.html.

Requisits comuns a les tres pàgines:

  • Estructura semàntica completa: header, nav, main i footer.
  • La mateixa capçalera amb el nom del taller (enllaçat a la portada) i un menú amb les tres pàgines. L'enllaç de la pàgina actual porta aria-current="page".
  • El mateix peu amb adreça, telèfon, correu, horari resumit, els tres enllaços i el copyright.
  • Un title i una meta description propis a cada pàgina.
  • Tots els enllaços interns amb rutes relatives. Cap no pot començar per / ni per C:.

Contingut de cada pàgina:

  • Portada: títol principal, presentació del taller, una imatge amb peu, tres blocs amb els serveis estrella (cadascun amb el seu h2) i dues opinions de clients.
  • Serveis: un índex intern amb àncores, una taula de preus de reparacions, dos nivells de revisió amb el que inclou cadascun, una secció sobre bicis elèctriques i una altra de serveis extra.
  • Contacte: adreça i transport públic, una imatge de la façana, l'horari en una taula (els dies tancats en una cel·la que ocupi matí i tarda) i un formulari per demanar cita amb dades personals, tipus de bici, servei, dia preferit, missatge i acceptació de privacitat.

Prova la navegació completa: des de qualsevol pàgina has de poder arribar a les altres dues sense cap enllaç trencat.

PasosPassos

  1. Crea las carpetas y los tres archivos vacíos antes de escribir nada.
  2. Escribe la portada completa, con cabecera y pie incluidos.
  3. Copia cabecera y pie en las otras dos páginas y adapta todas las rutas.
  4. Rellena el contenido propio de servicios y de contacto.
  5. Recorre todos los enlaces del sitio desde el navegador y corrige los que fallen.
  1. Crea les carpetes i els tres fitxers buits abans d'escriure res.
  2. Escriu la portada completa, amb capçalera i peu inclosos.
  3. Copia capçalera i peu a les altres dues pàgines i adapta totes les rutes.
  4. Omple el contingut propi de serveis i de contacte.
  5. Recorre tots els enllaços del lloc des del navegador i corregeix els que fallin.

PistasPistes

  • Desde index.html se entra en la carpeta con paginas/servicios.html. Desde dentro de paginas/ se vuelve a la portada con ../index.html.
  • Entre servicios.html y contacto.html, que están en la misma carpeta, basta con el nombre del archivo.
  • En un <select> obligatorio, una primera opción con value="" obliga a elegir una de verdad.
  • Si pasas el ratón por encima de un enlace, el navegador muestra abajo a la izquierda la ruta completa a la que apunta: útil para cazar errores.
  • Des d'index.html s'entra a la carpeta amb paginas/servicios.html. Des de dins de paginas/ es torna a la portada amb ../index.html.
  • Entre servicios.html i contacto.html, que són a la mateixa carpeta, n'hi ha prou amb el nom del fitxer.
  • En un <select> obligatori, una primera opció amb value="" obliga a triar-ne una de debò.
  • Si passes el ratolí per sobre d'un enllaç, el navegador mostra a baix a l'esquerra la ruta completa a la qual apunta: útil per caçar errors.

rutas relativas../estructura de carpetasindex.htmlaria-current<header><nav><main><footer><address><table>colspan<form><select><meta name="description">

Ver solución comentadaMostra la solució comentada

CSS I · fundamentosCSS I · fonaments

NivelNivell 1

Tarjeta de visita de una libreríaTargeta de visita d'una llibreria

GuiadoGuiat25 min

ObjetivoObjectiu. Enlazar una hoja de estilos externa y una fuente de Google Fonts, y dar estilo a una tarjeta con colores, relleno, borde y centrado con margin: auto.Enllaçar un full d'estils extern i una font de Google Fonts, i donar estil a una targeta amb colors, farciment, vora i centrat amb margin: auto.

EnunciadoEnunciat

La Lluna de Paper es una librería de barrio de Barcelona que quiere una tarjeta de visita para su web. El HTML ya tiene el contenido: nombre, lema, datos de contacto y horario. Tu trabajo es crear el archivo style.css y conseguir este resultado:

  • Fondo de página crema (#f4efe6) y tarjeta de color blanco roto (#fffdf8).
  • Tarjeta de 420px de ancho máximo, centrada en la página, con borde granate (#8c2f39) de 2px y esquinas redondeadas.
  • Nombre de la librería con la fuente Playfair Display y el resto del texto con Lato.
  • Todo el texto centrado.
  • Horario destacado como una franja granate con texto claro en mayúsculas.

La Lluna de Paper és una llibreria de barri de Barcelona que vol una targeta de visita per al seu web. L'HTML ja té el contingut: nom, lema, dades de contacte i horari. La teva feina és crear el fitxer style.css i aconseguir aquest resultat:

  • Fons de pàgina crema (#f4efe6) i targeta de color blanc trencat (#fffdf8).
  • Targeta de 420px d'amplada màxima, centrada a la pàgina, amb una vora granat (#8c2f39) de 2px i cantonades arrodonides.
  • Nom de la llibreria amb la font Playfair Display i la resta del text amb Lato.
  • Tot el text centrat.
  • Horari destacat com una franja granat amb text clar en majúscules.

PasosPassos

  1. Crea un archivo vacío llamado style.css en la misma carpeta que index.html.
  2. En el <head> del HTML, añade <link rel="stylesheet" href="style.css">. Escribe en style.css body { background-color: red; } y recarga: si el fondo sale rojo, el enlace funciona. Después cambia red por #f4efe6.
  3. Ve a fonts.google.com, busca Playfair Display (peso 700) y Lato (pesos 400 y 700), y copia las etiquetas <link> que te da Google en el <head>, ANTES del link a style.css.
  4. En body, añade color: #2f3e46, font-family: 'Lato', Arial, sans-serif, font-size: 16px, line-height: 1.5, margin: 0 y padding: 40px 16px.
  5. Crea la regla .tarjeta con max-width: 420px y margin: 0 auto. Comprueba que la tarjeta queda centrada al estrechar la ventana.
  6. Completa .tarjeta con background-color: #fffdf8, padding: 32px 28px, border: 2px solid #8c2f39, border-radius: 12px y text-align: center.
  7. Crea .tarjeta-nombre con font-family: 'Playfair Display', Georgia, serif, font-size: 32px, color: #8c2f39 y margin: 0 0 4px.
  8. Pon el lema en cursiva con .tarjeta-lema { font-style: italic; margin: 0; }.
  9. Da estilo a la línea con el selector .tarjeta hr: border: none, border-top: 1px solid #8c2f39, width: 60px y margin: 20px auto.
  10. En .tarjeta-datos pon font-style: normal (address sale en cursiva por defecto) y reduce el margen de sus párrafos con .tarjeta-datos p { margin: 0 0 4px; }.
  11. Crea .tarjeta-horario con fondo #8c2f39, color #fffdf8, padding: 8px 12px, font-weight: 700, font-size: 14px, text-transform: uppercase, letter-spacing: 1px y border-radius: 6px.
  12. Abre el inspector (F12), selecciona la tarjeta y localiza en el diagrama del modelo de caja el padding, el borde y el margen que has definido.
  1. Crea un fitxer buit anomenat style.css a la mateixa carpeta que index.html.
  2. Al <head> de l'HTML, afegeix <link rel="stylesheet" href="style.css">. Escriu a style.css body { background-color: red; } i recarrega: si el fons surt vermell, l'enllaç funciona. Després canvia red per #f4efe6.
  3. Ves a fonts.google.com, cerca Playfair Display (pes 700) i Lato (pesos 400 i 700), i copia les etiquetes <link> que et dona Google al <head>, ABANS de l'enllaç a style.css.
  4. Al body, afegeix color: #2f3e46, font-family: 'Lato', Arial, sans-serif, font-size: 16px, line-height: 1.5, margin: 0 i padding: 40px 16px.
  5. Crea la regla .tarjeta amb max-width: 420px i margin: 0 auto. Comprova que la targeta queda centrada quan estretes la finestra.
  6. Completa .tarjeta amb background-color: #fffdf8, padding: 32px 28px, border: 2px solid #8c2f39, border-radius: 12px i text-align: center.
  7. Crea .tarjeta-nombre amb font-family: 'Playfair Display', Georgia, serif, font-size: 32px, color: #8c2f39 i margin: 0 0 4px.
  8. Posa el lema en cursiva amb .tarjeta-lema { font-style: italic; margin: 0; }.
  9. Dona estil a la línia amb el selector .tarjeta hr: border: none, border-top: 1px solid #8c2f39, width: 60px i margin: 20px auto.
  10. A .tarjeta-datos posa font-style: normal (address surt en cursiva per defecte) i redueix el marge dels seus paràgrafs amb .tarjeta-datos p { margin: 0 0 4px; }.
  11. Crea .tarjeta-horario amb fons #8c2f39, color #fffdf8, padding: 8px 12px, font-weight: 700, font-size: 14px, text-transform: uppercase, letter-spacing: 1px i border-radius: 6px.
  12. Obre l'inspector (F12), selecciona la targeta i localitza al diagrama del model de caixa el padding, la vora i el marge que has definit.

<link rel="stylesheet">Google Fontsfont-familycolor hexadecimalbackground-colorpaddingborderborder-radiusmargin: 0 autotext-aligntext-transformselector descendienteherencia

Ver solución comentadaMostra la solució comentada
NivelNivell 2

Colección de botonesCol·lecció de botons

GuiadoGuiat30 min

ObjetivoObjectiu. Construir una clase base .btn con variantes de color y tamaño que se combinan en el HTML, y dar respuesta visual a los estados :hover, :focus-visible y :active con transiciones suaves.Construir una classe base .btn amb variants de color i mida que es combinen a l'HTML, i donar resposta visual als estats :hover, :focus-visible i :active amb transicions suaus.

EnunciadoEnunciat

El Taller Fang i Foc, un taller de cerámica de Gràcia, quiere que todos los botones de su web compartan el mismo estilo. El HTML ya está preparado: cada botón tiene la clase btn y una o dos clases más que indican su variante y su tamaño.

Escribe style.css para conseguir:

  • Una clase .btn con la forma común: relleno, fuente, negrita, esquinas redondeadas, cursor de mano y sin subrayado.
  • Cuatro variantes de color: .btn-principal (terracota #c8553d), .btn-secundario (verde azulado #2d6a6a), .btn-contorno (solo borde) y .btn-peligro (rojo #b3261e).
  • Cada variante se oscurece al pasar el ratón por encima.
  • Al pulsar, el botón baja 2px. Al llegar con el teclado, aparece un contorno naranja (#f2a541).
  • Dos tamaños extra: .btn-pequeno y .btn-grande.
  • El botón con el atributo disabled se ve gris y con el cursor de prohibido.

El Taller Fang i Foc, un taller de ceràmica de Gràcia, vol que tots els botons del seu web comparteixin el mateix estil. L'HTML ja està preparat: cada botó té la classe btn i una o dues classes més que indiquen la variant i la mida.

Escriu style.css per aconseguir:

  • Una classe .btn amb la forma comuna: farciment, font, negreta, cantonades arrodonides, cursor de mà i sense subratllat.
  • Quatre variants de color: .btn-principal (terracota #c8553d), .btn-secundario (verd blavós #2d6a6a), .btn-contorno (només vora) i .btn-peligro (vermell #b3261e).
  • Cada variant s'enfosqueix quan hi passes el ratolí per sobre.
  • En prémer-lo, el botó baixa 2px. Quan hi arribes amb el teclat, apareix un contorn taronja (#f2a541).
  • Dues mides extra: .btn-pequeno i .btn-grande.
  • El botó amb l'atribut disabled es veu gris i amb el cursor de prohibit.

PasosPassos

  1. Crea style.css, enlázalo en el <head> y da al body margin: 0, background-color: #faf6f1, color: #2b2b2b y font-family: 'Nunito', Arial, sans-serif.
  2. Centra el contenido con .muestrario { max-width: 760px; margin: 0 auto; padding: 32px 16px; }.
  3. Crea la regla .btn con display: inline-block, padding: 12px 22px, margin: 0 8px 10px 0, font-size: 16px, font-weight: 700 y border-radius: 8px.
  4. Añade a .btn font-family: inherit (los botones no heredan la fuente por sí solos), text-decoration: none (para el enlace) y border: 2px solid transparent.
  5. Añade cursor: pointer a .btn y comprueba que aparece la manita al pasar por encima.
  6. Escribe .btn-principal con background-color: #c8553d y color: #ffffff, y su estado .btn-principal:hover con background-color: #a3432f.
  7. Repite el patrón para .btn-secundario (#2d6a6a, hover #1f4d4d) y .btn-peligro (#b3261e, hover #8c1d17).
  8. Para .btn-contorno usa background-color: transparent, color: #2d6a6a y border-color: #2d6a6a. En :hover, rellena el fondo con #2d6a6a y pon el texto en blanco.
  9. Añade a .btn la propiedad transition: background-color 0.2s ease, color 0.2s ease, transform 0.1s ease. Pasa el ratón por los botones y nota la diferencia.
  10. Escribe .btn:active { transform: translateY(2px); } y .btn:focus-visible { outline: 3px solid #f2a541; outline-offset: 3px; }. Prueba el foco recorriendo la página con el Tabulador.
  11. Crea .btn-pequeno (padding: 6px 14px; font-size: 14px) y .btn-grande (padding: 16px 32px; font-size: 20px) debajo de las variantes.
  12. Al final del archivo, escribe .btn[disabled] con fondo #cfc8c0, color #6b6b6b, cursor: not-allowed y transform: none.
  1. Crea style.css, enllaça'l al <head> i dona al body margin: 0, background-color: #faf6f1, color: #2b2b2b i font-family: 'Nunito', Arial, sans-serif.
  2. Centra el contingut amb .muestrario { max-width: 760px; margin: 0 auto; padding: 32px 16px; }.
  3. Crea la regla .btn amb display: inline-block, padding: 12px 22px, margin: 0 8px 10px 0, font-size: 16px, font-weight: 700 i border-radius: 8px.
  4. Afegeix a .btn font-family: inherit (els botons no hereten la font per si sols), text-decoration: none (per a l'enllaç) i border: 2px solid transparent.
  5. Afegeix cursor: pointer a .btn i comprova que apareix la maneta quan hi passes per sobre.
  6. Escriu .btn-principal amb background-color: #c8553d i color: #ffffff, i el seu estat .btn-principal:hover amb background-color: #a3432f.
  7. Repeteix el patró per a .btn-secundario (#2d6a6a, hover #1f4d4d) i .btn-peligro (#b3261e, hover #8c1d17).
  8. Per a .btn-contorno fes servir background-color: transparent, color: #2d6a6a i border-color: #2d6a6a. A :hover, omple el fons amb #2d6a6a i posa el text en blanc.
  9. Afegeix a .btn la propietat transition: background-color 0.2s ease, color 0.2s ease, transform 0.1s ease. Passa el ratolí pels botons i nota la diferència.
  10. Escriu .btn:active { transform: translateY(2px); } i .btn:focus-visible { outline: 3px solid #f2a541; outline-offset: 3px; }. Prova el focus recorrent la pàgina amb el tabulador.
  11. Crea .btn-pequeno (padding: 6px 14px; font-size: 14px) i .btn-grande (padding: 16px 32px; font-size: 20px) a sota de les variants.
  12. Al final del fitxer, escriu .btn[disabled] amb fons #cfc8c0, color #6b6b6b, cursor: not-allowed i transform: none.

clases múltiples:hover:focus-visible:activetransitiontransformcursoroutlinedisplay: inline-blockfont-family: inheritselector de atributocascadaespecificidad

Ver solución comentadaMostra la solució comentada
NivelNivell 3

Menú horizontal con separadoresMenú horitzontal amb separadors

IntermedioIntermedi35 min

ObjetivoObjectiu. Convertir una lista de enlaces en un menú horizontal con display: inline-block, generar separadores con ::after sin tocar el HTML y marcar la página actual con una clase.Convertir una llista d'enllaços en un menú horitzontal amb display: inline-block, generar separadors amb ::after sense tocar l'HTML i marcar la pàgina actual amb una classe.

EnunciadoEnunciat

Forn Can Roure, una panadería de Sant Andreu, tiene una cabecera con el nombre del obrador y un menú de cinco enlaces escrito como lista <ul>. Ahora mismo se ve como una lista vertical con viñetas. Hay que convertirlo en un menú horizontal y centrado, sin usar Flexbox.

Requisitos:

  • Cabecera con fondo marrón (#6b3e26), texto claro (#fbf7f0) y contenido centrado.
  • Menú sin viñetas ni sangría, con los enlaces en una sola línea.
  • Entre enlace y enlace, un punto medio (·) de color dorado (#e0b77a) generado con CSS. Después del último enlace no debe aparecer.
  • Enlaces en mayúsculas, sin subrayado. Al pasar el ratón cambian a dorado y aparece una línea inferior.
  • El enlace de la página actual (clase activo) va en negrita y con una línea inferior clara fija.
  • Los enlaces muestran un contorno visible al recorrerlos con el teclado.

No cambies el HTML salvo para enlazar tu hoja de estilos.

Forn Can Roure, un forn de pa de Sant Andreu, té una capçalera amb el nom de l'obrador i un menú de cinc enllaços escrit com a llista <ul>. Ara mateix es veu com una llista vertical amb pics. Cal convertir-lo en un menú horitzontal i centrat, sense fer servir Flexbox.

Requisits:

  • Capçalera amb fons marró (#6b3e26), text clar (#fbf7f0) i contingut centrat.
  • Menú sense pics ni sagnat, amb els enllaços en una sola línia.
  • Entre enllaç i enllaç, un punt volat (·) de color daurat (#e0b77a) generat amb CSS. Després de l'últim enllaç no hi ha d'aparèixer.
  • Enllaços en majúscules, sense subratllat. Quan hi passes el ratolí, canvien a daurat i apareix una línia inferior.
  • L'enllaç de la pàgina actual (classe activo) va en negreta i amb una línia inferior clara fixa.
  • Els enllaços mostren un contorn visible quan els recorres amb el teclat.

No canviïs l'HTML, excepte per enllaçar el teu full d'estils.

PasosPassos

  1. Estilos de página y cabecera: colores, fuentes y centrado.
  2. Lista sin aspecto de lista y elementos en horizontal.
  3. Separadores con ::after y eliminación del último.
  4. Estados de los enlaces: :hover, :focus-visible y clase activo.
  1. Estils de pàgina i capçalera: colors, fonts i centrat.
  2. Llista sense aspecte de llista i elements en horitzontal.
  3. Separadors amb ::after i eliminació de l'últim.
  4. Estats dels enllaços: :hover, :focus-visible i classe activo.

PistasPistes

  • Para quitar viñetas y sangría necesitas tres propiedades en el <ul>: list-style, margin y padding.
  • Si los <li> son inline-block, un text-align: center en la cabecera los centra igual que centraría una palabra.
  • En ::after la propiedad content es obligatoria. Para el punto medio escribe content: "·". Para hacerlo desaparecer en el último elemento, content: none.
  • Pon el ::after en el <li> en lugar del <a>: así el separador no forma parte del enlace ni se subraya.
  • Si reservas la línea inferior desde el principio con border-bottom: 2px solid transparent, el texto no salta al aparecer la línea en :hover.
  • Per treure els pics i el sagnat necessites tres propietats a l'<ul>: list-style, margin i padding.
  • Si els <li> són inline-block, un text-align: center a la capçalera els centra igual que centraria una paraula.
  • A ::after la propietat content és obligatòria. Per al punt volat escriu content: "·". Per fer-lo desaparèixer a l'últim element, content: none.
  • Posa el ::after al <li> en lloc de l'<a>: així el separador no forma part de l'enllaç ni se subratlla.
  • Si reserves la línia inferior des del principi amb border-bottom: 2px solid transparent, el text no salta quan apareix la línia a :hover.

display: inline-blocklist-style::aftercontent:last-child:hover:focus-visibleselector descendienteespecificidadtext-transformletter-spacingtransition

Ver solución comentadaMostra la solució comentada
NivelNivell 4

Entrada de concierto: el modelo de caja a fondoEntrada de concert: el model de caixa a fons

IntermedioIntermedi45 min

ObjetivoObjectiu. Comprobar con el inspector cómo cambian las medidas con content-box y border-box, observar el colapso de márgenes y maquetar una entrada de concierto con atajos de padding y margin y unidades rem y em.Comprovar amb l'inspector com canvien les mides amb content-box i border-box, observar el col·lapse de marges i maquetar una entrada de concert amb dreceres de padding i margin i unitats rem i em.

EnunciadoEnunciat

La Sala Gavina, una sala de conciertos del Poblenou, vende entradas para el Trio Mistral y quiere una versión web de la entrada. El HTML ya está escrito y la hoja de estilos va en css/style.css.

La página tiene dos partes.

Parte 1, laboratorio:

  • Dos cajas con width: 300px, padding: 24px y border: 6px. Una con box-sizing: content-box y otra con border-box. Mide las dos con el inspector y anota su ancho real.
  • Dos cajas seguidas: la primera con margin-bottom: 32px y la segunda con margin-top: 16px. Mide la separación real y explica por qué no suma 48px.

Parte 2, la entrada:

  • Tarjeta centrada de 26rem de ancho máximo, fondo claro (#fdfbf7) y esquinas de 1rem.
  • Cabecera morada (#5b2a86) con una etiqueta amarilla (#f2c14e) en forma de píldora, el nombre del grupo en Oswald a 2.5rem y el subtítulo.
  • Lista de datos (fecha, apertura, lugar, zona) con una línea fina entre ellos, excepto debajo del último.
  • Precio grande con el símbolo de euro a la mitad de su tamaño, medido en em.
  • Talón final con borde superior discontinuo, como la línea por donde se arranca.

Todas las medidas de la entrada deben estar en rem o em. Usa px solo en el laboratorio.

La Sala Gavina, una sala de concerts del Poblenou, ven entrades per al Trio Mistral i vol una versió web de l'entrada. L'HTML ja està escrit i el full d'estils va a css/style.css.

La pàgina té dues parts.

Part 1, laboratori:

  • Dues caixes amb width: 300px, padding: 24px i border: 6px. Una amb box-sizing: content-box i l'altra amb border-box. Mesura-les totes dues amb l'inspector i anota'n l'amplada real.
  • Dues caixes seguides: la primera amb margin-bottom: 32px i la segona amb margin-top: 16px. Mesura la separació real i explica per què no suma 48px.

Part 2, l'entrada:

  • Targeta centrada de 26rem d'amplada màxima, fons clar (#fdfbf7) i cantonades d'1rem.
  • Capçalera morada (#5b2a86) amb una etiqueta groga (#f2c14e) en forma de càpsula, el nom del grup en Oswald a 2.5rem i el subtítol.
  • Llista de dades (data, obertura, lloc, zona) amb una línia fina entre elles, excepte a sota de l'última.
  • Preu gran amb el símbol d'euro a la meitat de la seva mida, mesurat en em.
  • Taló final amb vora superior discontínua, com la línia per on s'arrenca.

Totes les mides de l'entrada han d'estar en rem o em. Fes servir px només al laboratori.

PasosPassos

  1. Regla universal con box-sizing: border-box y estilos de body.
  2. Laboratorio: cajas de prueba medidas con el inspector y colapso de márgenes comprobado.
  3. Tarjeta centrada y cabecera con la etiqueta en em.
  4. Datos, precio y talón con atajos de padding y margin.
  1. Regla universal amb box-sizing: border-box i estils del body.
  2. Laboratori: caixes de prova mesurades amb l'inspector i col·lapse de marges comprovat.
  3. Targeta centrada i capçalera amb l'etiqueta en em.
  4. Dades, preu i taló amb dreceres de padding i margin.

PistasPistes

  • Empieza con *, *::before, *::after { box-sizing: border-box; } y luego, solo en la caja de prueba que debe comportarse distinto, escribe box-sizing: content-box.
  • Cuando dos márgenes verticales se tocan, el navegador se queda con el mayor. Los márgenes horizontales nunca colapsan.
  • rem depende del tamaño de letra de <html> (16px por defecto); em depende del tamaño de letra del propio elemento. Para el euro, font-size: 0.5em es la mitad del tamaño del precio.
  • <dd> trae margin-left de 40px y <dl> trae margen vertical: anúlalos antes de colocar tus propios espacios.
  • Para quitar la línea del último dato, combina la clase del dato con :last-child.
  • Comença amb *, *::before, *::after { box-sizing: border-box; } i després, només a la caixa de prova que s'ha de comportar diferent, escriu box-sizing: content-box.
  • Quan dos marges verticals es toquen, el navegador es queda amb el més gran. Els marges horitzontals no col·lapsen mai.
  • rem depèn de la mida de lletra de <html> (16px per defecte); em depèn de la mida de lletra del mateix element. Per a l'euro, font-size: 0.5em és la meitat de la mida del preu.
  • <dd> porta margin-left de 40px i <dl> porta marge vertical: anul·la'ls abans de col·locar els teus espais.
  • Per treure la línia de l'última dada, combina la classe de la dada amb :last-child.

modelo de cajabox-sizingcontent-boxborder-boxcolapso de márgenesatajos de padding y marginrememmax-widthborder-styledisplay: blockdisplay: inline-block:last-childselector universal

Ver solución comentadaMostra la solució comentada
NivelNivell 5

Reto: receta con tipografía cuidadaRepte: recepta amb tipografia acurada

RetoRepte60 min

ObjetivoObjectiu. Maquetar un artículo largo de lectura cómoda combinando pseudoelementos, pseudoclases estructurales, fondos con imagen y medidas relativas.Maquetar un article llarg de lectura còmoda combinant pseudoelements, pseudoclasses estructurals, fons amb imatge i mides relatives.

EnunciadoEnunciat

El blog Cuaderno de Remei publica recetas de cocina casera del Camp de Tarragona. Tienes el HTML completo de la receta de la coca de recapte y debes escribir css/style.css desde cero para que se lea como una revista de cocina.

Requisitos:

  • Portada a 60vh de alto como mínimo, con una foto de fondo (https://picsum.photos/seed/cocarecapte/1600/900) que la cubra entera y un degradado oscuro encima para que el título blanco se lea bien.
  • Texto de lectura en una fuente con serifa de Google Fonts, a 1.125rem y con interlineado amplio. Títulos en otra fuente con más carácter.
  • Columna de texto centrada de unos 40rem de ancho máximo.
  • Ficha rápida (raciones, tiempo, dificultad) en una sola línea, sin viñetas, entre dos líneas finas.
  • Primer párrafo con letra capitular grande y de color, que ocupe unas tres líneas.
  • Tabla de ingredientes a todo el ancho, con cabecera de color, filas pares de otro color y cantidades alineadas a la derecha.
  • Lista de consejos con una viñeta propia generada con CSS (sin imágenes) y el texto bien alineado cuando ocupa varias líneas.
  • Imagen de la receta que nunca se salga de la columna.

Usa rem, em, % o vh en todas las medidas. No uses Flexbox ni Grid.

El blog Cuaderno de Remei publica receptes de cuina casolana del Camp de Tarragona. Tens l'HTML complet de la recepta de la coca de recapte i has d'escriure css/style.css des de zero perquè es llegeixi com una revista de cuina.

Requisits:

  • Portada a 60vh d'alçada com a mínim, amb una foto de fons (https://picsum.photos/seed/cocarecapte/1600/900) que la cobreixi sencera i un degradat fosc a sobre perquè el títol blanc es llegeixi bé.
  • Text de lectura amb una font amb serif de Google Fonts, a 1.125rem i amb interlineat ampli. Títols amb una altra font amb més caràcter.
  • Columna de text centrada d'uns 40rem d'amplada màxima.
  • Fitxa ràpida (racions, temps, dificultat) en una sola línia, sense pics, entre dues línies fines.
  • Primer paràgraf amb lletra capital gran i de color, que ocupi unes tres línies.
  • Taula d'ingredients a tota l'amplada, amb capçalera de color, files parells d'un altre color i quantitats alineades a la dreta.
  • Llista de consells amb un pic propi generat amb CSS (sense imatges) i el text ben alineat quan ocupa diverses línies.
  • Imatge de la recepta que mai no surti de la columna.

Fes servir rem, em, % o vh en totes les mides. No facis servir Flexbox ni Grid.

PasosPassos

  1. Base tipográfica: fuentes, tamaños, interlineado y columna centrada.
  2. Portada con imagen de fondo y degradado.
  3. Capitular, ficha rápida y tabla cebreada.
  4. Viñetas propias, imagen, pasos y nota final.
  1. Base tipogràfica: fonts, mides, interlineat i columna centrada.
  2. Portada amb imatge de fons i degradat.
  3. Lletra capital, fitxa ràpida i taula zebrada.
  4. Pics propis, imatge, passos i nota final.

PistasPistes

  • background-image admite varias capas separadas por comas: pon primero un linear-gradient con colores rgba semitransparentes y después la url() de la foto.
  • Para la capitular, ::first-letter con float: left, un font-size de unas 4em y line-height por debajo de 1.
  • Para filas alternas: tbody tr:nth-child(even). Para la segunda columna: td:nth-child(2).
  • Viñeta propia: quita list-style, deja un padding-left en el <li> y en ::before usa content, display: inline-block, un width igual a ese padding y un margin-left negativo del mismo valor.
  • background-image admet diverses capes separades per comes: posa primer un linear-gradient amb colors rgba semitransparents i després la url() de la foto.
  • Per a la lletra capital, ::first-letter amb float: left, un font-size d'unes 4em i line-height per sota d'1.
  • Per a files alternes: tbody tr:nth-child(even). Per a la segona columna: td:nth-child(2).
  • Pic propi: treu list-style, deixa un padding-left al <li> i a ::before fes servir content, display: inline-block, un width igual a aquest padding i un margin-left negatiu del mateix valor.

::first-letter::first-line::before::marker:nth-child:hoverbackground-imagebackground-size: coverlinear-gradientrgbarememvhline-heightborder-collapsemax-width

Ver solución comentadaMostra la solució comentada
NivelNivell 6

Reto: ficha de producto a partir de una especificaciónRepte: fitxa de producte a partir d'una especificació

RetoRepte75 min

ObjetivoObjectiu. Reproducir con precisión un diseño descrito por escrito, organizando colores, fuentes y espacios en variables CSS dentro de :root.Reproduir amb precisió un disseny descrit per escrit, organitzant colors, fonts i espais en variables CSS dins de :root.

EnunciadoEnunciat

Espardenyes Mar Blava es un taller de alpargatas hechas a mano en El Born. Su diseñadora te ha pasado la especificación de la ficha de producto de la tienda online. El HTML ya está terminado: escribe css/style.css siguiendo la especificación al píxel. Declara la paleta, las fuentes, el espacio principal y los radios como variables en :root y úsalas con var().

Paleta:

  • Fondo de página y pie de la tarjeta: #f6f1ea
  • Fondo de la tarjeta: #ffffff
  • Texto principal: #1f2a36
  • Texto secundario: #5c6670
  • Acento (azul mar): #1d5c8c; en hover, #134468
  • Etiqueta Novedad: #d1495b
  • Bordes y separadores: #e3dcd2
  • Talla agotada (texto): #b0b6bc
  • Contorno de foco con teclado: #f2b134

Tipografía (Google Fonts):

  • Títulos y precio: DM Serif Display, peso 400
  • Resto: DM Sans, pesos 400, 500 y 700
  • Texto base: 16px con line-height 1.6

Página:

  • box-sizing: border-box en todos los elementos.
  • body sin margen, con padding de 48px arriba y abajo y 16px a los lados.

Tarjeta (.producto):

  • Ancho máximo 420px, centrada, borde de 1px del color de bordes, radio de 16px. La foto no debe sobresalir de las esquinas redondeadas.
  • Foto a todo el ancho, sin hueco debajo.
  • Zona de contenido (.producto-cuerpo) con 24px de relleno en los cuatro lados.

Textos:

  • Etiqueta Novedad: en forma de píldora, fondo coral, texto blanco, 12px, negrita, mayúsculas, letter-spacing 0.08em, relleno de 4px por 10px, 12px de margen inferior.
  • Categoría: 13px, peso 500, mayúsculas, letter-spacing 0.1em, color secundario, 4px de margen inferior.
  • Nombre del producto: DM Serif Display a 30px, line-height 1.15, 12px de margen inferior.
  • Precio: DM Serif Display a 28px en color acento. El precio anterior, en DM Sans a 18px, color secundario, tachado y separado 8px a la izquierda.
  • Descripción: 16px de margen arriba y abajo.

Características:

  • Lista sin viñetas ni sangría, 24px de margen inferior.
  • Cada elemento a 15px, con 8px de relleno arriba y abajo y una línea discontinua de 1px del color de bordes debajo, excepto el último.
  • Delante de cada elemento, una marca ✓ en negrita y color acento, separada 10px del texto, generada con CSS.

Tallas:

  • Título Talla: 14px, negrita, 8px de margen inferior.
  • Cada talla es un cuadrado de 44 por 44px, fondo blanco, borde de 1px del color de bordes, radio de 8px, texto a 15px, separación de 6px a la derecha y abajo.
  • Hover: el borde pasa a color acento.
  • Seleccionada (clase seleccionada): fondo y borde en color acento, texto blanco y negrita.
  • Agotada (atributo disabled): texto gris de tallas agotadas, tachado, cursor de prohibido y sin cambio de borde al pasar el ratón.
  • Del bloque de tallas al botón de compra hay 24px.

Botón Añadir a la cesta:

  • Ocupa todo el ancho, relleno de 14px, fondo acento, texto blanco a 16px, negrita, mayúsculas, letter-spacing 0.05em, sin borde, radio de 10px.
  • Hover: fondo acento oscuro con transición de 0.2s. Al pulsar baja 1px.
  • Debajo, el texto de envío centrado, a 14px, color secundario, con 12px de margen superior.

Foco con teclado en tallas y botón: contorno de 3px del color de foco, separado 2px de las tallas y 3px del botón.

Pie de la tarjeta: fondo arena, borde superior de 1px del color de bordes, relleno de 16px arriba y abajo y 24px a los lados, texto centrado a 14px en color secundario.

Espardenyes Mar Blava és un taller d'espardenyes fetes a mà al Born. La seva dissenyadora t'ha passat l'especificació de la fitxa de producte de la botiga en línia. L'HTML ja està acabat: escriu css/style.css seguint l'especificació al píxel. Declara la paleta, les fonts, l'espai principal i els radis com a variables a :root i fes-les servir amb var().

Paleta:

  • Fons de pàgina i peu de la targeta: #f6f1ea
  • Fons de la targeta: #ffffff
  • Text principal: #1f2a36
  • Text secundari: #5c6670
  • Accent (blau mar): #1d5c8c; en hover, #134468
  • Etiqueta Novedad: #d1495b
  • Vores i separadors: #e3dcd2
  • Talla esgotada (text): #b0b6bc
  • Contorn de focus amb teclat: #f2b134

Tipografia (Google Fonts):

  • Títols i preu: DM Serif Display, pes 400
  • La resta: DM Sans, pesos 400, 500 i 700
  • Text base: 16px amb line-height 1.6

Pàgina:

  • box-sizing: border-box a tots els elements.
  • body sense marge, amb padding de 48px a dalt i a baix i 16px als costats.

Targeta (.producto):

  • Amplada màxima 420px, centrada, vora d'1px del color de vores, radi de 16px. La foto no ha de sobresortir de les cantonades arrodonides.
  • Foto a tota l'amplada, sense espai a sota.
  • Zona de contingut (.producto-cuerpo) amb 24px de farciment als quatre costats.

Textos:

  • Etiqueta Novedad: en forma de càpsula, fons corall, text blanc, 12px, negreta, majúscules, letter-spacing 0.08em, farciment de 4px per 10px, 12px de marge inferior.
  • Categoria: 13px, pes 500, majúscules, letter-spacing 0.1em, color secundari, 4px de marge inferior.
  • Nom del producte: DM Serif Display a 30px, line-height 1.15, 12px de marge inferior.
  • Preu: DM Serif Display a 28px en color accent. El preu anterior, en DM Sans a 18px, color secundari, ratllat i separat 8px a l'esquerra.
  • Descripció: 16px de marge a dalt i a baix.

Característiques:

  • Llista sense pics ni sagnat, 24px de marge inferior.
  • Cada element a 15px, amb 8px de farciment a dalt i a baix i una línia discontínua d'1px del color de vores a sota, excepte l'últim.
  • Davant de cada element, una marca ✓ en negreta i color accent, separada 10px del text, generada amb CSS.

Talles:

  • Títol Talla: 14px, negreta, 8px de marge inferior.
  • Cada talla és un quadrat de 44 per 44px, fons blanc, vora d'1px del color de vores, radi de 8px, text a 15px, separació de 6px a la dreta i a baix.
  • Hover: la vora passa a color accent.
  • Seleccionada (classe seleccionada): fons i vora en color accent, text blanc i negreta.
  • Esgotada (atribut disabled): text gris de talles esgotades, ratllat, cursor de prohibit i sense canvi de vora quan hi passes el ratolí.
  • Del bloc de talles al botó de compra hi ha 24px.

Botó Añadir a la cesta:

  • Ocupa tota l'amplada, farciment de 14px, fons accent, text blanc a 16px, negreta, majúscules, letter-spacing 0.05em, sense vora, radi de 10px.
  • Hover: fons accent fosc amb transició de 0.2s. En prémer-lo baixa 1px.
  • A sota, el text d'enviament centrat, a 14px, color secundari, amb 12px de marge superior.

Focus amb teclat a les talles i al botó: contorn de 3px del color de focus, separat 2px de les talles i 3px del botó.

Peu de la targeta: fons sorra, vora superior d'1px del color de vores, farciment de 16px a dalt i a baix i 24px als costats, text centrat a 14px en color secundari.

PasosPassos

  1. Variables en :root a partir de la paleta, las fuentes, el espacio y los radios.
  2. Página, tarjeta y foto.
  3. Textos de cabecera, precio y lista de características.
  4. Selector de tallas con sus cuatro estados.
  5. Botón de compra, texto de envío y pie.
  1. Variables a :root a partir de la paleta, les fonts, l'espai i els radis.
  2. Pàgina, targeta i foto.
  3. Textos de capçalera, preu i llista de característiques.
  4. Selector de talles amb els seus quatre estats.
  5. Botó de compra, text d'enviament i peu.

PistasPistes

  • Una variable se declara como --color-acento: #1d5c8c; dentro de :root y se usa como color: var(--color-acento);.
  • Para que la foto respete las esquinas redondeadas de la tarjeta, pon overflow: hidden en la tarjeta. Para quitar el hueco bajo la imagen, display: block en la imagen.
  • Los botones no heredan la fuente de la página: añade font-family: inherit.
  • La talla agotada debe escribirse después de :hover. Las dos reglas tienen la misma especificidad, así que gana la que va más abajo.
  • Una variable es declara com --color-acento: #1d5c8c; dins de :root i es fa servir com color: var(--color-acento);.
  • Perquè la foto respecti les cantonades arrodonides de la targeta, posa overflow: hidden a la targeta. Per treure l'espai sota la imatge, display: block a la imatge.
  • Els botons no hereten la font de la pàgina: afegeix font-family: inherit.
  • La talla esgotada s'ha d'escriure després de :hover. Les dues regles tenen la mateixa especificitat, així que guanya la que va més avall.

variables CSS:rootvar()box-sizingoverflowborder-radius::before:last-child:hover:focus-visible:activeselector de atributoespecificidadcascadaGoogle Fontstext-decoration

Ver solución comentadaMostra la solució comentada

CSS II · maquetaciónCSS II · maquetació

NivelNivell 1

Barra de navegación con FlexboxBarra de navegació amb Flexbox

GuiadoGuiat25 min

ObjetivoObjectiu. Colocar un logo a la izquierda y un menú a la derecha con display: flex, justify-content y align-items, y conseguir que la barra se quede pegada arriba al hacer scroll con position: sticky.Col·locar un logotip a l'esquerra i un menú a la dreta amb display: flex, justify-content i align-items, i aconseguir que la barra es quedi enganxada a dalt en fer scroll amb position: sticky.

EnunciadoEnunciat

La Llibreria La Tortuga, una tienda de libros de segunda mano en Gràcia, necesita una barra de navegación para su web. Ya tienes el contenido de la página; falta maquetar la cabecera.

La barra debe cumplir estas condiciones:

  • El logo (un círculo con las letras LT y el texto «La Tortuga») queda a la izquierda.
  • El menú con cuatro enlaces queda a la derecha, en una sola fila.
  • Logo y menú están centrados verticalmente entre sí.
  • Al bajar por la página, la barra se queda fija en la parte superior y no queda tapada por las imágenes.
  • Los enlaces muestran una línea dorada debajo al pasar el ratón y en la página activa.

Trabaja con un archivo index.html y una hoja de estilos style.css en la misma carpeta.

La Llibreria La Tortuga, una botiga de llibres de segona mà a Gràcia, necessita una barra de navegació per al seu web. Ja tens el contingut de la pàgina; falta maquetar la capçalera.

La barra ha de complir aquestes condicions:

  • El logotip (un cercle amb les lletres LT i el text «La Tortuga») queda a l'esquerra.
  • El menú amb quatre enllaços queda a la dreta, en una sola fila.
  • El logotip i el menú estan centrats verticalment entre ells.
  • En baixar per la pàgina, la barra es queda fixa a la part superior i les imatges no la tapen.
  • Els enllaços mostren una línia daurada a sota quan hi passes el ratolí i a la pàgina activa.

Treballa amb un fitxer index.html i un full d'estils style.css a la mateixa carpeta.

PasosPassos

  1. Crea index.html con la estructura básica (lang="es", meta charset, meta viewport) y enlaza style.css con <link rel="stylesheet" href="style.css">.
  2. Dentro del <body> crea un <header class="barra"> con dos hijos: un <a class="logo"> (con un <span class="logo-icono">LT</span> y un <span class="logo-texto">La Tortuga</span>) y un <nav> que contenga una <ul class="menu"> con cuatro <li> y sus enlaces.
  3. Debajo del header, añade un <main> con cuatro <section> (Inicio, Novedades, Club de lectura y Contacto) con texto suficiente para que la página tenga scroll. Incluye una imagen de https://picsum.photos/seed/libreria/900/400 con su alt.
  4. En style.css, aplica box-sizing: border-box a todo con el selector * y quita el margen del body con margin: 0.
  5. Escribe display: flex en .barra. Comprueba en el navegador que el logo y el menú ya aparecen en la misma fila.
  6. Añade justify-content: space-between a .barra para enviar el logo a la izquierda y el menú a la derecha.
  7. Añade align-items: center a .barra para centrarlos verticalmente. Ponle padding: 12px 24px y un color de fondo.
  8. Convierte .menu en contenedor flex con display: flex y gap: 24px. Quita las viñetas con list-style: none y pon margin y padding a 0.
  9. Haz lo mismo con .logo: display: flex, align-items: center y gap: 10px. Da a .logo-icono un tamaño de 40x40 px, border-radius: 50% y centra las letras con flex.
  10. Da estilo a .menu a (color, sin subrayado, border-bottom transparente de 2px) y crea .menu a:hover y .menu a.activo con el borde inferior dorado.
  11. Añade a .barra position: sticky y top: 0. Haz scroll y comprueba que la barra se queda arriba.
  12. Si la imagen pasa por encima de la barra al hacer scroll, añade z-index: 10 a .barra y vuelve a comprobarlo.
  1. Crea index.html amb l'estructura bàsica (lang="es", meta charset, meta viewport) i enllaça style.css amb <link rel="stylesheet" href="style.css">.
  2. Dins del <body> crea un <header class="barra"> amb dos fills: un <a class="logo"> (amb un <span class="logo-icono">LT</span> i un <span class="logo-texto">La Tortuga</span>) i un <nav> que contingui una <ul class="menu"> amb quatre <li> i els seus enllaços.
  3. Sota el header, afegeix un <main> amb quatre <section> (Inici, Novetats, Club de lectura i Contacte) amb prou text perquè la pàgina tingui scroll. Inclou una imatge de https://picsum.photos/seed/libreria/900/400 amb el seu alt.
  4. A style.css, aplica box-sizing: border-box a tot amb el selector * i treu el marge del body amb margin: 0.
  5. Escriu display: flex a .barra. Comprova al navegador que el logotip i el menú ja apareixen a la mateixa fila.
  6. Afegeix justify-content: space-between a .barra per enviar el logotip a l'esquerra i el menú a la dreta.
  7. Afegeix align-items: center a .barra per centrar-los verticalment. Posa-hi padding: 12px 24px i un color de fons.
  8. Converteix .menu en contenidor flex amb display: flex i gap: 24px. Treu les vinyetes amb list-style: none i posa margin i padding a 0.
  9. Fes el mateix amb .logo: display: flex, align-items: center i gap: 10px. Dona a .logo-icono una mida de 40x40 px, border-radius: 50% i centra les lletres amb flex.
  10. Dona estil a .menu a (color, sense subratllat, border-bottom transparent de 2px) i crea .menu a:hover i .menu a.activo amb la vora inferior daurada.
  11. Afegeix a .barra position: sticky i top: 0. Fes scroll i comprova que la barra es queda a dalt.
  12. Si la imatge passa per sobre de la barra en fer scroll, afegeix z-index: 10 a .barra i torna-ho a comprovar.

display: flexjustify-content: space-betweenalign-items: centergapflex anidadoposition: stickytopz-index:hover

Ver solución comentadaMostra la solució comentada
NivelNivell 2

Tres maneras de centrar y una etiqueta posicionadaTres maneres de centrar i una etiqueta posicionada

GuiadoGuiat30 min

ObjetivoObjectiu. Centrar una caja dentro de otra con Flexbox, con Grid y con position: absolute + transform, y colocar una etiqueta en la esquina de una tarjeta usando position: relative en el padre y absolute en el hijo.Centrar una caixa dins d'una altra amb Flexbox, amb Grid i amb position: absolute + transform, i col·locar una etiqueta a la cantonada d'una targeta fent servir position: relative al pare i absolute al fill.

EnunciadoEnunciat

El Taller Fang, un estudio de cerámica de Sant Andreu, quiere una página de pruebas para su web. Tiene dos partes.

Parte 1. Tres cajas grises de 180 px de alto, una al lado de otra. Dentro de cada una hay una pieza verde (Taza, Cuenco, Jarra) que debe quedar perfectamente centrada en horizontal y en vertical. Cada caja usa una técnica distinta:

  • Caja 1: Flexbox.
  • Caja 2: Grid con place-items.
  • Caja 3: position: absolute con top, left y transform.

Bajo cada caja, muestra en un bloque <pre><code> las propiedades que has usado.

Parte 2. Una tarjeta del taller «Torno para principiantes» con imagen, título, descripción y precio. En la esquina superior derecha, por encima de la imagen, aparece una etiqueta amarilla en forma de píldora con el texto «Nuevo».

El Taller Fang, un estudi de ceràmica de Sant Andreu, vol una pàgina de proves per al seu web. Té dues parts.

Part 1. Tres caixes grises de 180 px d'alçada, una al costat de l'altra. Dins de cadascuna hi ha una peça verda (Tassa, Bol, Gerra) que ha de quedar perfectament centrada en horitzontal i en vertical. Cada caixa fa servir una tècnica diferent:

  • Caixa 1: Flexbox.
  • Caixa 2: Grid amb place-items.
  • Caixa 3: position: absolute amb top, left i transform.

Sota cada caixa, mostra en un bloc <pre><code> les propietats que has fet servir.

Part 2. Una targeta del taller «Torn per a principiants» amb imatge, títol, descripció i preu. A la cantonada superior dreta, per sobre de la imatge, apareix una etiqueta groga en forma de píndola amb el text «Nou».

PasosPassos

  1. Crea index.html y style.css. En el HTML, añade una cabecera y un <main> con dos <section class="bloque">.
  2. En la primera sección, crea un <div class="demos"> con tres <article class="demo-tarjeta">. Cada uno lleva un <h3>, un <div class="demo"> con un <div class="pieza"> dentro y un <pre><code> con el código.
  3. Añade a cada <div class="demo"> una segunda clase: centrar-flex, centrar-grid y centrar-absolute.
  4. En el CSS, pon .demos en fila con display: flex, flex-wrap: wrap y gap: 24px. Da a .demo-tarjeta flex: 1 1 260px.
  5. Da a .demo una altura de 180px, un fondo gris y un borde discontinuo. Da a .pieza un ancho de 110px, un alto de 70px y un color de fondo.
  6. Centra la primera: en .centrar-flex escribe display: flex, justify-content: center y align-items: center.
  7. Centra la segunda: en .centrar-grid escribe display: grid y place-items: center.
  8. Centra la tercera: pon position: relative en .centrar-absolute. En .centrar-absolute .pieza escribe position: absolute, top: 50% y left: 50%. Observa que la pieza queda desplazada hacia abajo a la derecha.
  9. Corrige el desplazamiento añadiendo transform: translate(-50%, -50%) a la pieza de la tercera caja.
  10. En la segunda sección, crea un <article class="tarjeta"> con un <span class="badge">Nuevo</span>, una imagen de https://picsum.photos/seed/ceramica/600/360 y un <div class="tarjeta-cuerpo"> con título, texto y precio.
  11. Escribe en .badge position: absolute, top: 12px y right: 12px. Comprueba dónde aparece: si no hay padre posicionado, irá a la esquina de la página.
  12. Añade position: relative a .tarjeta para que el badge se coloque respecto a la tarjeta. Termina con z-index: 2 en el badge y overflow: hidden en la tarjeta para respetar las esquinas redondeadas.
  1. Crea index.html i style.css. A l'HTML, afegeix una capçalera i un <main> amb dues <section class="bloque">.
  2. A la primera secció, crea un <div class="demos"> amb tres <article class="demo-tarjeta">. Cadascun porta un <h3>, un <div class="demo"> amb un <div class="pieza"> a dins i un <pre><code> amb el codi.
  3. Afegeix a cada <div class="demo"> una segona classe: centrar-flex, centrar-grid i centrar-absolute.
  4. Al CSS, posa .demos en fila amb display: flex, flex-wrap: wrap i gap: 24px. Dona a .demo-tarjeta flex: 1 1 260px.
  5. Dona a .demo una alçada de 180px, un fons gris i una vora discontínua. Dona a .pieza una amplada de 110px, una alçada de 70px i un color de fons.
  6. Centra la primera: a .centrar-flex escriu display: flex, justify-content: center i align-items: center.
  7. Centra la segona: a .centrar-grid escriu display: grid i place-items: center.
  8. Centra la tercera: posa position: relative a .centrar-absolute. A .centrar-absolute .pieza escriu position: absolute, top: 50% i left: 50%. Observa que la peça queda desplaçada cap avall a la dreta.
  9. Corregeix el desplaçament afegint transform: translate(-50%, -50%) a la peça de la tercera caixa.
  10. A la segona secció, crea un <article class="tarjeta"> amb un <span class="badge">Nou</span>, una imatge de https://picsum.photos/seed/ceramica/600/360 i un <div class="tarjeta-cuerpo"> amb títol, text i preu.
  11. Escriu a .badge position: absolute, top: 12px i right: 12px. Comprova on apareix: si no hi ha cap pare posicionat, anirà a la cantonada de la pàgina.
  12. Afegeix position: relative a .tarjeta perquè el badge es col·loqui respecte a la targeta. Acaba amb z-index: 2 al badge i overflow: hidden a la targeta per respectar les cantonades arrodonides.

justify-content: centeralign-items: centerdisplay: gridplace-itemsposition: relativeposition: absolutetop / left / righttransform: translate()z-indexoverflow: hiddenflex: 1 1 260px

Ver solución comentadaMostra la solució comentada
NivelNivell 3

Catálogo de productos con flex-wrapCatàleg de productes amb flex-wrap

IntermedioIntermedi40 min

ObjetivoObjectiu. Repartir tarjetas de producto en filas que se adaptan solas al ancho con flex-wrap y flex: 1 1 250px, y alinear el botón de compra al final de cada tarjeta aunque los textos tengan longitudes distintas.Repartir targetes de producte en files que s'adapten soles a l'amplada amb flex-wrap i flex: 1 1 250px, i alinear el botó de compra al final de cada targeta encara que els textos tinguin longituds diferents.

EnunciadoEnunciat

Verd de Balcó es una tienda online de plantas para pisos pequeños. Necesita la página de catálogo con seis productos.

Cada tarjeta tiene imagen, categoría, nombre, descripción, precio y botón «Añadir a la cesta». Las descripciones tienen longitudes muy distintas a propósito: una tiene una sola frase y otra ocupa cuatro líneas.

Requisitos:

  • Las tarjetas se colocan en filas y bajan de línea cuando no caben. Ninguna mide menos de 250 px de ancho.
  • En pantalla grande caben tres o cuatro por fila; en móvil, una. Sin media queries.
  • Todas las tarjetas de una misma fila tienen la misma altura.
  • El precio y el botón quedan siempre pegados al final de la tarjeta, alineados entre tarjetas vecinas.
  • Dos productos están en oferta: muestran una etiqueta roja «Oferta» en la esquina superior izquierda de la foto y el precio anterior tachado.
  • Todas las fotos miden lo mismo de alto sin deformarse.
  • Al pasar el ratón, la tarjeta sube unos píxeles con una transición suave.

Verd de Balcó és una botiga en línia de plantes per a pisos petits. Necessita la pàgina de catàleg amb sis productes.

Cada targeta té imatge, categoria, nom, descripció, preu i botó «Afegeix a la cistella». Les descripcions tenen longituds molt diferents a propòsit: una té una sola frase i una altra ocupa quatre línies.

Requisits:

  • Les targetes es col·loquen en files i baixen de línia quan no hi caben. Cap no fa menys de 250 px d'amplada.
  • En pantalla gran n'hi caben tres o quatre per fila; en mòbil, una. Sense media queries.
  • Totes les targetes d'una mateixa fila tenen la mateixa alçada.
  • El preu i el botó queden sempre enganxats al final de la targeta, alineats entre targetes veïnes.
  • Dos productes estan en oferta: mostren una etiqueta vermella «Oferta» a la cantonada superior esquerra de la foto i el preu anterior ratllat.
  • Totes les fotos fan la mateixa alçada sense deformar-se.
  • En passar-hi el ratolí, la targeta puja uns quants píxels amb una transició suau.

PasosPassos

  1. Maqueta el HTML: un contenedor .catalogo con seis <article class="producto">, cada uno con un bloque de imagen y un bloque de cuerpo.
  2. Haz que las tarjetas se repartan en filas con flex-wrap y tamaño base de 250 px.
  3. Convierte cada tarjeta en una columna flexible y lleva el precio y el botón al final.
  4. Coloca la etiqueta «Oferta» sobre la imagen y unifica la altura de las fotos.
  5. Añade el efecto hover con transition y transform.
  1. Maqueta l'HTML: un contenidor .catalogo amb sis <article class="producto">, cadascun amb un bloc d'imatge i un bloc de cos.
  2. Fes que les targetes es reparteixin en files amb flex-wrap i una mida base de 250 px.
  3. Converteix cada targeta en una columna flexible i porta el preu i el botó al final.
  4. Col·loca l'etiqueta «Oferta» sobre la imatge i unifica l'alçada de les fotos.
  5. Afegeix l'efecte hover amb transition i transform.

PistasPistes

  • flex: 1 1 250px es el atajo de flex-grow, flex-shrink y flex-basis. Pruébalo en .producto y cambia el ancho de la ventana para ver cómo se recolocan.
  • Una tarjeta puede ser hijo flex del catálogo y, a la vez, contenedor flex con flex-direction: column para sus propios hijos.
  • En un flex en columna, margin-top: auto en un hijo lo empuja hasta el final, porque absorbe todo el espacio libre de encima.
  • Para que todas las fotos tengan la misma altura sin deformarse, combina height fijo con object-fit: cover.
  • La etiqueta necesita un padre con position: relative; si no, se colocará respecto a la página.
  • flex: 1 1 250px és la drecera de flex-grow, flex-shrink i flex-basis. Prova-ho a .producto i canvia l'amplada de la finestra per veure com es recol·loquen.
  • Una targeta pot ser fill flex del catàleg i, alhora, contenidor flex amb flex-direction: column per als seus propis fills.
  • En un flex en columna, margin-top: auto en un fill l'empeny fins al final, perquè absorbeix tot l'espai lliure de sobre.
  • Perquè totes les fotos tinguin la mateixa alçada sense deformar-se, combina un height fix amb object-fit: cover.
  • L'etiqueta necessita un pare amb position: relative; si no, es col·locarà respecte a la pàgina.

flex-wrap: wrapflex: 1 1 250pxflex-basisflex-direction: columnmargin-top: autoalign-items: stretchobject-fit: coverposition: absolutetransitiontransform: translateY()Google Fonts

Ver solución comentadaMostra la solució comentada
NivelNivell 4

Layout clásico de página con Flexbox y versión móvilLayout clàssic de pàgina amb Flexbox i versió mòbil

IntermedioIntermedi45 min

ObjetivoObjectiu. Montar la estructura header, nav, main, aside y footer solo con Flexbox, con el footer siempre al fondo de la ventana, y adaptarla al móvil con una media query siguiendo el enfoque mobile first.Muntar l'estructura header, nav, main, aside i footer només amb Flexbox, amb el footer sempre al fons de la finestra, i adaptar-la al mòbil amb una media query seguint l'enfocament mobile first.

EnunciadoEnunciat

La Cooperativa L'Espiga, un grupo de consumo ecológico del Poble-sec, quiere renovar la página donde publica los pedidos de cada semana.

La página tiene cinco zonas: cabecera con el nombre, barra de navegación, contenido principal con la información del pedido, barra lateral con el turno, el horario y la próxima asamblea, y pie de página.

Requisitos:

  • Usa los elementos semánticos header, nav, main, aside y footer.
  • El footer queda siempre al fondo de la ventana, también cuando hay muy poco contenido. Pruébalo borrando temporalmente casi todo el texto del main.
  • En móvil todo va en una sola columna y el aside aparece debajo del main.
  • A partir de 768 px, el main y el aside se colocan uno al lado del otro: el aside con 280 px fijos y el main ocupando el resto.
  • Escribe primero los estilos de móvil y después una sola media query con min-width.
  • Define los colores y el ancho máximo como variables CSS en :root.
  • La hoja de estilos va en una carpeta css.

La Cooperativa L'Espiga, un grup de consum ecològic del Poble-sec, vol renovar la pàgina on publica les comandes de cada setmana.

La pàgina té cinc zones: capçalera amb el nom, barra de navegació, contingut principal amb la informació de la comanda, barra lateral amb el torn, l'horari i la propera assemblea, i peu de pàgina.

Requisits:

  • Fes servir els elements semàntics header, nav, main, aside i footer.
  • El footer queda sempre al fons de la finestra, també quan hi ha molt poc contingut. Prova-ho esborrant temporalment gairebé tot el text del main.
  • En mòbil tot va en una sola columna i l'aside apareix sota el main.
  • A partir de 768 px, el main i l'aside es col·loquen l'un al costat de l'altre: l'aside amb 280 px fixos i el main ocupant la resta.
  • Escriu primer els estils de mòbil i després una sola media query amb min-width.
  • Defineix els colors i l'amplada màxima com a variables CSS a :root.
  • El full d'estils va dins d'una carpeta css.

PasosPassos

  1. Escribe el HTML semántico y envuelve main y aside en un <div class="contenido">.
  2. Declara las variables en :root y consigue el footer siempre abajo con Flexbox en el body.
  3. Da estilo a la versión móvil con todo apilado.
  4. Añade la media query de 768 px para poner main y aside en fila.
  1. Escriu l'HTML semàntic i embolcalla main i aside en un <div class="contenido">.
  2. Declara les variables a :root i aconsegueix el footer sempre a baix amb Flexbox al body.
  3. Dona estil a la versió mòbil amb tot apilat.
  4. Afegeix la media query de 768 px per posar main i aside en fila.

PistasPistes

  • Para el footer siempre abajo: body con display: flex, flex-direction: column y min-height: 100vh; el bloque central con flex: 1.
  • El div que envuelve main y aside puede ser flex en columna en móvil y cambiar a flex-direction: row dentro de la media query.
  • flex: 0 0 280px significa: no crecer, no encoger y medir 280 px. Para el main, flex: 1.
  • Si el aside se estira hasta la altura del main y no te gusta, usa align-items: flex-start en el contenedor.
  • Sin <meta name="viewport"> el móvil simula una pantalla ancha y la media query no se comporta como esperas.
  • Per al footer sempre a baix: body amb display: flex, flex-direction: column i min-height: 100vh; el bloc central amb flex: 1.
  • El div que embolcalla main i aside pot ser flex en columna en mòbil i canviar a flex-direction: row dins de la media query.
  • flex: 0 0 280px vol dir: no créixer, no encongir-se i fer 280 px. Per al main, flex: 1.
  • Si l'aside s'estira fins a l'alçada del main i no t'agrada, fes servir align-items: flex-start al contenidor.
  • Sense <meta name="viewport"> el mòbil simula una pantalla ampla i la media query no es comporta com esperes.

header / nav / main / aside / footerflex-direction: columnmin-height: 100vhflex: 1flex: 0 0 280pxsticky footermobile first@media (min-width: 768px)meta viewportvariables CSSvar()position: sticky

Ver solución comentadaMostra la solució comentada
NivelNivell 5

Reto: portada de revista y galería con CSS GridRepte: portada de revista i galeria amb CSS Grid

RetoRepte60 min

ObjetivoObjectiu. Diseñar una portada que cambia de distribución en móvil, tablet y escritorio con grid-template-areas, y una galería cuyas columnas se calculan solas con repeat(auto-fit, minmax()), con fotos que ocupan varias celdas.Dissenyar una portada que canvia de distribució en mòbil, tauleta i escriptori amb grid-template-areas, i una galeria les columnes de la qual es calculen soles amb repeat(auto-fit, minmax()), amb fotos que ocupen diverses cel·les.

EnunciadoEnunciat

Quadern de Barri es una revista cultural gratuita sobre la vida de los barrios de Barcelona. Te encargan la portada web del número 27.

Parte 1. Portada. Contiene cinco piezas: un reportaje principal con foto grande y el texto superpuesto sobre un degradado oscuro, dos noticias secundarias con foto, una columna de opinión firmada y una agenda con tres citas. La distribución debe cambiar según el ancho:

  • Móvil: una columna, en este orden: principal, secundaria 1, secundaria 2, opinión, agenda.
  • Desde 768 px: dos columnas. El principal ocupa toda la primera fila; debajo, las dos secundarias; al final, opinión y agenda.
  • Desde 1024 px: tres columnas (2fr 1fr 1fr). El principal ocupa dos filas a la izquierda, las secundarias se apilan en el centro, la opinión ocupa dos filas a la derecha y la agenda es una franja de ancho completo con sus tres citas en columnas.

Parte 2. Galería de siete fotos del barrio en otoño:

  • Las columnas se crean solas: como mínimo 200 px cada una, sin media queries para decidir cuántas hay.
  • Todas las filas miden 200 px de alto.
  • Una foto ocupa dos columnas y otra ocupa dos filas, sin dejar huecos vacíos.
  • Al pasar el ratón, la foto se amplía ligeramente y aparece el pie de foto desde abajo.

Usa variables CSS para colores, tipografías y separaciones, y dos fuentes de Google Fonts.

Quadern de Barri és una revista cultural gratuïta sobre la vida dels barris de Barcelona. T'encarreguen la portada web del número 27.

Part 1. Portada. Conté cinc peces: un reportatge principal amb foto gran i el text superposat sobre un degradat fosc, dues notícies secundàries amb foto, una columna d'opinió signada i una agenda amb tres cites. La distribució ha de canviar segons l'amplada:

  • Mòbil: una columna, en aquest ordre: principal, secundària 1, secundària 2, opinió, agenda.
  • Des de 768 px: dues columnes. El principal ocupa tota la primera fila; a sota, les dues secundàries; al final, opinió i agenda.
  • Des de 1024 px: tres columnes (2fr 1fr 1fr). El principal ocupa dues files a l'esquerra, les secundàries s'apilen al centre, l'opinió ocupa dues files a la dreta i l'agenda és una franja d'amplada completa amb les tres cites en columnes.

Part 2. Galeria de set fotos del barri a la tardor:

  • Les columnes es creen soles: com a mínim 200 px cadascuna, sense media queries per decidir quantes n'hi ha.
  • Totes les files fan 200 px d'alçada.
  • Una foto ocupa dues columnes i una altra ocupa dues files, sense deixar forats buits.
  • En passar-hi el ratolí, la foto s'amplia lleugerament i apareix el peu de foto des de baix.

Fes servir variables CSS per als colors, les tipografies i les separacions, i dues fonts de Google Fonts.

PasosPassos

  1. Estructura el HTML de la portada y la galería con elementos semánticos (article, aside, figure, figcaption).
  2. Resuelve la portada en móvil con grid-template-areas y asigna cada pieza a su área.
  3. Redefine solo grid-template-columns y grid-template-areas en las media queries de 768 px y 1024 px.
  4. Monta la galería con auto-fit, minmax y las fotos que ocupan dos celdas.
  5. Añade los efectos hover y revisa el resultado a 375, 768 y 1280 px de ancho.
  1. Estructura l'HTML de la portada i la galeria amb elements semàntics (article, aside, figure, figcaption).
  2. Resol la portada en mòbil amb grid-template-areas i assigna cada peça a la seva àrea.
  3. Redefineix només grid-template-columns i grid-template-areas a les media queries de 768 px i 1024 px.
  4. Munta la galeria amb auto-fit, minmax i les fotos que ocupen dues cel·les.
  5. Afegeix els efectes hover i revisa el resultat a 375, 768 i 1280 px d'amplada.

PistasPistes

  • En grid-template-areas cada cadena entre comillas es una fila. Repetir un nombre en celdas contiguas hace que el área se extienda, pero cada área debe formar un rectángulo.
  • Con grid-area: principal en un hijo lo enlazas al área con ese nombre. Así, en las media queries solo cambias el «mapa» del contenedor.
  • grid-column: span 2 y grid-row: span 2 hacen que un elemento ocupe dos celdas. Con grid-auto-flow: dense el grid rellena los huecos que quedan.
  • Si en móvil solo cabe una columna, un span 2 fuerza una columna extra y la página desborda: activa ese span a partir de un ancho mínimo.
  • A grid-template-areas cada cadena entre cometes és una fila. Repetir un nom en cel·les contigües fa que l'àrea s'estengui, però cada àrea ha de formar un rectangle.
  • Amb grid-area: principal en un fill l'enllaces a l'àrea amb aquest nom. Així, a les media queries només canvies el «mapa» del contenidor.
  • grid-column: span 2 i grid-row: span 2 fan que un element ocupi dues cel·les. Amb grid-auto-flow: dense la graella omple els forats que queden.
  • Si en mòbil només hi cap una columna, un span 2 força una columna extra i la pàgina desborda: activa aquest span a partir d'una amplada mínima.

display: gridgrid-template-columnsfrgrid-template-areasgrid-arearepeat(auto-fit, minmax())grid-auto-rowsgrid-column: span 2grid-row: span 2grid-auto-flow: densegapobject-fit: coverposition: absolutelinear-gradienttransitiontransform: scale()variables CSS@media (min-width)clamp()

Ver solución comentadaMostra la solució comentada
NivelNivell 6

Reto final: landing mobile first de una escuela de surfRepte final: landing mobile first d'una escola de surf

RetoRepte90 min

ObjetivoObjectiu. Construir una landing completa partiendo del móvil y ampliándola con dos breakpoints, combinando Flexbox, Grid, position, variables CSS y transiciones en un proyecto con aspecto profesional.Construir una landing completa partint del mòbil i ampliant-la amb dos punts de ruptura, combinant Flexbox, Grid, position, variables CSS i transicions en un projecte amb aspecte professional.

EnunciadoEnunciat

Onada Llarga Surf School es una escuela de surf ficticia en la Barceloneta que abre todo el año. Quiere una página de presentación para captar alumnado nuevo. Diseña y maqueta la landing completa sin JavaScript.

Secciones obligatorias:

  • Navegación sticky con el logo, cuatro enlaces a las secciones de la página y un botón «Reserva».
  • Hero a pantalla completa (100vh) con una foto de fondo y un degradado de color encima, título, texto breve y dos botones.
  • Clases: cuatro tarjetas con foto, etiqueta de nivel, título, descripción y un dato final (duración y edad) alineado abajo.
  • Precios: tres planes. El central está destacado con otro color, una insignia «El más elegido» sobre su borde superior y un tamaño algo mayor.
  • Testimonios: tres opiniones de personas inventadas con foto redonda, nombre y plan contratado.
  • Footer en columnas con marca, dirección, horario y contacto.

Requisitos técnicos:

  • Mobile first: los estilos base son los del móvil y solo hay dos media queries, min-width: 768px y min-width: 1024px.
  • Colores, tipografías, radios, sombras y duraciones de transición definidos como variables CSS en :root.
  • En móvil, el plan destacado aparece el primero; en escritorio vuelve al centro.
  • Transiciones en los botones, en los enlaces del menú y en las tarjetas al pasar el ratón.
  • Ningún elemento provoca scroll horizontal a 375 px de ancho.
  • Imágenes de https://picsum.photos/seed/... con texto alternativo descriptivo.

Onada Llarga Surf School és una escola de surf fictícia a la Barceloneta que obre tot l'any. Vol una pàgina de presentació per captar alumnat nou. Dissenya i maqueta la landing completa sense JavaScript.

Seccions obligatòries:

  • Navegació sticky amb el logotip, quatre enllaços a les seccions de la pàgina i un botó «Reserva».
  • Hero a pantalla completa (100vh) amb una foto de fons i un degradat de color a sobre, títol, text breu i dos botons.
  • Classes: quatre targetes amb foto, etiqueta de nivell, títol, descripció i una dada final (durada i edat) alineada a baix.
  • Preus: tres plans. El central està destacat amb un altre color, una insígnia «El més triat» sobre la vora superior i una mida una mica més gran.
  • Testimonis: tres opinions de persones inventades amb foto rodona, nom i pla contractat.
  • Footer en columnes amb marca, adreça, horari i contacte.

Requisits tècnics:

  • Mobile first: els estils base són els del mòbil i només hi ha dues media queries, min-width: 768px i min-width: 1024px.
  • Colors, tipografies, radis, ombres i durades de transició definits com a variables CSS a :root.
  • En mòbil, el pla destacat apareix el primer; en escriptori torna al centre.
  • Transicions als botons, als enllaços del menú i a les targetes en passar-hi el ratolí.
  • Cap element no provoca scroll horitzontal a 375 px d'amplada.
  • Imatges de https://picsum.photos/seed/... amb text alternatiu descriptiu.

PasosPassos

  1. Escribe todo el HTML semántico de la página y declara las variables en :root.
  2. Maqueta la versión móvil completa, sección por sección, revisándola a 375 px.
  3. Añade el breakpoint de 768 px: menú en una fila y tarjetas, testimonios y footer a dos columnas.
  4. Añade el breakpoint de 1024 px: cuatro clases, tres planes con el destacado ampliado, tres testimonios y footer a cuatro columnas.
  5. Pule transiciones, estados hover y comprueba que no hay scroll horizontal en ningún ancho.
  1. Escriu tot l'HTML semàntic de la pàgina i declara les variables a :root.
  2. Maqueta la versió mòbil completa, secció per secció, revisant-la a 375 px.
  3. Afegeix el punt de ruptura de 768 px: menú en una fila i targetes, testimonis i footer a dues columnes.
  4. Afegeix el punt de ruptura de 1024 px: quatre classes, tres plans amb el destacat ampliat, tres testimonis i footer a quatre columnes.
  5. Poleix transicions, estats hover i comprova que no hi ha scroll horitzontal a cap amplada.

PistasPistes

  • background-image admite varias capas separadas por comas: pon primero el linear-gradient y después la url() de la foto, y combínalo con background-size: cover.
  • La propiedad order cambia la posición visual de un hijo flex o grid sin tocar el HTML: order: -1 lo pasa delante de todos.
  • Para la insignia sobre el borde del plan: padre con position: relative, insignia con position: absolute, top: 0, left: 50% y transform: translate(-50%, -50%).
  • Si la barra sticky tapa el título al pulsar un enlace interno, prueba scroll-padding-top en el elemento html.
  • background-image admet diverses capes separades per comes: posa primer el linear-gradient i després la url() de la foto, i combina-ho amb background-size: cover.
  • La propietat order canvia la posició visual d'un fill flex o grid sense tocar l'HTML: order: -1 el passa davant de tots.
  • Per a la insígnia sobre la vora del pla: pare amb position: relative, insígnia amb position: absolute, top: 0, left: 50% i transform: translate(-50%, -50%).
  • Si la barra sticky tapa el títol quan prems un enllaç intern, prova scroll-padding-top a l'element html.

mobile first@media (min-width: 768px)@media (min-width: 1024px)variables CSSvar()position: stickyz-indexmin-height: 100vhlinear-gradientbackground-size: coverdisplay: gridgrid-template-columnsrepeat()display: flexflex-wrapordermargin-top: autoposition: absolutetransform: translate()transform: scale()transition::beforeclamp()scroll-padding-topGoogle Fonts

Ver solución comentadaMostra la solució comentada

Bootstrap 5Bootstrap 5

NivelNivell 1

Página "sobre mí" solo con utilidadesPàgina "sobre mi" només amb utilitats

GuiadoGuiat25 min

ObjetivoObjectiu. Maquetar una página personal sin escribir CSS propio, usando solo las clases utilitarias de Bootstrap para espaciado, tipografía, colores y bordes. Añadir botones y alertas como primeros componentes.Maquetar una pàgina personal sense escriure CSS propi, fent servir només les classes utilitàries de Bootstrap per a l'espaiat, la tipografia, els colors i les vores. Afegir botons i alertes com a primers components.

EnunciadoEnunciat

Laia Ferrer es una ilustradora ficticia de Sabadell que diseña etiquetas y envases para pequeñas marcas. Necesita una página sencilla de presentación y te pide que la hagas con Bootstrap, sin hoja de estilos propia.

La página debe tener:

  • Una cabecera oscura con su oficio, su nombre en grande, una frase de presentación y dos botones.
  • Una alerta informativa con la disponibilidad de su agenda.
  • Una sección "Sobre mí" con dos párrafos.
  • Una sección "Servicios" con tres bloques blancos con un borde de color a la izquierda.
  • Tres datos en cifras en forma de pastilla de color.
  • Una caja de contacto centrada con dos botones.
  • Una alerta de aviso y un pie de página sencillo.

No puedes crear ningún archivo CSS ni usar el atributo style: todo se resuelve con clases.

La Laia Ferrer és una il·lustradora fictícia de Sabadell que dissenya etiquetes i envasos per a marques petites. Necessita una pàgina senzilla de presentació i et demana que la facis amb Bootstrap, sense full d'estils propi.

La pàgina ha de tenir:

  • Una capçalera fosca amb el seu ofici, el seu nom en gran, una frase de presentació i dos botons.
  • Una alerta informativa amb la disponibilitat de la seva agenda.
  • Una secció "Sobre mi" amb dos paràgrafs.
  • Una secció "Serveis" amb tres blocs blancs amb una vora de color a l'esquerra.
  • Tres dades en xifres en forma de píndola de color.
  • Una caixa de contacte centrada amb dos botons.
  • Una alerta d'avís i un peu de pàgina senzill.

No pots crear cap fitxer CSS ni fer servir l'atribut style: tot es resol amb classes.

PasosPassos

  1. Crea index.html con la plantilla de Bootstrap 5.3: meta charset, meta viewport, el CSS del CDN en el head y el bundle de JavaScript al final del body.
  2. Pon la clase bg-light al body para tener un fondo gris muy claro.
  3. Crea un header con las clases bg-dark text-white py-5 mb-5 y, dentro, un div.container.
  4. Dentro del container añade un párrafo con text-uppercase small text-white-50, un h1 con display-3 fw-bold y un párrafo con la clase lead.
  5. Añade dos enlaces con aspecto de botón: btn btn-warning btn-lg me-2 y btn btn-outline-light btn-lg.
  6. Crea un main.container y empieza con un div.alert.alert-info con role="alert".
  7. Escribe la sección "Sobre mí" con un h2.mb-3, un párrafo con fs-5 y otro con text-secondary.
  8. Escribe la sección "Servicios" con tres div que lleven bg-white border-start border-4 rounded p-4 y un color de borde distinto en cada uno (border-warning, border-primary, border-success).
  9. Usa h3 con la clase h5 para los títulos de cada bloque y mb-0 en sus párrafos.
  10. Crea tres span con d-inline-block text-bg-* px-3 py-2 rounded-pill me-2 mb-2 para los datos en cifras.
  11. Monta la caja de contacto con text-center bg-white border rounded-3 p-5 y dos botones (btn-success y btn-outline-secondary).
  12. Termina con un div.alert.alert-warning y un footer con border-top py-4 text-center text-secondary small.
  1. Crea index.html amb la plantilla de Bootstrap 5.3: meta charset, meta viewport, el CSS del CDN al head i el bundle de JavaScript al final del body.
  2. Posa la classe bg-light al body per tenir un fons gris molt clar.
  3. Crea un header amb les classes bg-dark text-white py-5 mb-5 i, a dins, un div.container.
  4. Dins del container afegeix un paràgraf amb text-uppercase small text-white-50, un h1 amb display-3 fw-bold i un paràgraf amb la classe lead.
  5. Afegeix dos enllaços amb aspecte de botó: btn btn-warning btn-lg me-2 i btn btn-outline-light btn-lg.
  6. Crea un main.container i comença amb un div.alert.alert-info amb role="alert".
  7. Escriu la secció "Sobre mi" amb un h2.mb-3, un paràgraf amb fs-5 i un altre amb text-secondary.
  8. Escriu la secció "Serveis" amb tres div que portin bg-white border-start border-4 rounded p-4 i un color de vora diferent a cadascun (border-warning, border-primary, border-success).
  9. Fes servir h3 amb la classe h5 per als títols de cada bloc i mb-0 als seus paràgrafs.
  10. Crea tres span amb d-inline-block text-bg-* px-3 py-2 rounded-pill me-2 mb-2 per a les dades en xifres.
  11. Munta la caixa de contacte amb text-center bg-white border rounded-3 p-5 i dos botons (btn-success i btn-outline-secondary).
  12. Acaba amb un div.alert.alert-warning i un footer amb border-top py-4 text-center text-secondary small.

containerm-* / p-*mx / my / ms / medisplay-3leadfw-boldfs-5text-uppercasetext-secondarytext-bg-*bg-darkborder-startrounded-pillbtnbtn-outline-*btn-lgalert

Ver solución comentadaMostra la solució comentada
NivelNivell 2

Panel de control con la rejillaTauler de control amb la graella

GuiadoGuiat40 min

ObjetivoObjectiu. Practicar la rejilla de Bootstrap combinando columnas con breakpoints, gutters, row-cols, order y offset. Comprobar cómo cambia la maqueta al estrechar la ventana.Practicar la graella de Bootstrap combinant columnes amb breakpoints, gutters, row-cols, order i offset. Comprovar com canvia la maqueta quan s'estreny la finestra.

EnunciadoEnunciat

Bicis Llevant es una tienda ficticia de alquiler de bicicletas en el Poblenou. El encargado quiere un panel interno para ver de un vistazo cómo va el día. No hace falta que funcione: solo maquetamos la pantalla.

La maqueta tiene que comportarse así:

  • Una barra superior verde con el nombre del panel a la izquierda y la fecha a la derecha.
  • Un menú lateral (sidebar) que en ordenador queda a la izquierda y en el móvil pasa debajo del contenido.
  • Cuatro tarjetas de métricas: una por fila en el móvil, dos por fila en tablet y las cuatro juntas en pantallas grandes.
  • Dos bloques de detalle, uno ancho y otro estrecho, que en el móvil se apilan.
  • Un aviso estrecho y centrado al final, conseguido con offset.

Abre las herramientas de desarrollo del navegador y prueba distintos anchos para comprobar cada cambio.

Bicis Llevant és una botiga fictícia de lloguer de bicicletes al Poblenou. L'encarregat vol un tauler intern per veure d'un cop d'ull com va el dia. No cal que funcioni: només maquetem la pantalla.

La maqueta s'ha de comportar així:

  • Una barra superior verda amb el nom del tauler a l'esquerra i la data a la dreta.
  • Un menú lateral (sidebar) que a l'ordinador queda a l'esquerra i al mòbil passa a sota del contingut.
  • Quatre targetes de mètriques: una per fila al mòbil, dues per fila a la tauleta i les quatre juntes a les pantalles grans.
  • Dos blocs de detall, un d'ample i un d'estret, que al mòbil s'apilen.
  • Un avís estret i centrat al final, aconseguit amb offset.

Obre les eines de desenvolupament del navegador i prova diferents amplades per comprovar cada canvi.

PasosPassos

  1. Parte de la plantilla de Bootstrap 5.3 y pon bg-body-tertiary al body.
  2. Crea el header verde (bg-success text-white py-3) con un container-fluid y una fila con align-items-center.
  3. Dentro de esa fila usa una columna col para el título y una col-auto para la fecha.
  4. Debajo, abre un container-fluid py-4 y una fila con g-4.
  5. Crea el aside con col-12 col-md-4 col-lg-3 order-2 order-md-1 y mete un menú nav nav-pills flex-column.
  6. Crea el main con col-12 col-md-8 col-lg-9 order-1 order-md-2.
  7. Dentro del main, añade una fila row-cols-1 row-cols-sm-2 row-cols-xl-4 g-3 con cuatro div.col.
  8. En cada col mete una card h-100 con un card-body: rótulo pequeño, cifra con fs-2 fw-bold y una variación con text-success, text-danger o text-warning-emphasis.
  9. Añade una fila gx-4 gy-3 con una columna col-lg-8 (tarjeta con list-group-flush) y otra col-lg-4 (tarjeta con lista de tareas).
  10. Cierra con una fila que contenga una columna col-md-10 offset-md-1 col-xl-6 offset-xl-3 y una alerta alert-secondary centrada.
  11. Reduce el ancho de la ventana poco a poco y anota en qué píxeles cambia cada bloque.
  1. Parteix de la plantilla de Bootstrap 5.3 i posa bg-body-tertiary al body.
  2. Crea el header verd (bg-success text-white py-3) amb un container-fluid i una fila amb align-items-center.
  3. Dins d'aquesta fila fes servir una columna col per al títol i una col-auto per a la data.
  4. A sota, obre un container-fluid py-4 i una fila amb g-4.
  5. Crea l'aside amb col-12 col-md-4 col-lg-3 order-2 order-md-1 i posa-hi un menú nav nav-pills flex-column.
  6. Crea el main amb col-12 col-md-8 col-lg-9 order-1 order-md-2.
  7. Dins del main, afegeix una fila row-cols-1 row-cols-sm-2 row-cols-xl-4 g-3 amb quatre div.col.
  8. A cada col posa-hi una card h-100 amb un card-body: rètol petit, xifra amb fs-2 fw-bold i una variació amb text-success, text-danger o text-warning-emphasis.
  9. Afegeix una fila gx-4 gy-3 amb una columna col-lg-8 (targeta amb list-group-flush) i una altra col-lg-4 (targeta amb llista de tasques).
  10. Tanca amb una fila que contingui una columna col-md-10 offset-md-1 col-xl-6 offset-xl-3 i una alerta alert-secondary centrada.
  11. Redueix l'amplada de la finestra a poc a poc i anota a quants píxels canvia cada bloc.

container-fluidrowcol / col-autocol-md-*col-lg-*g-* / gx-* / gy-*row-cols-*order-*offset-*align-items-centernav-pillsflex-columncardh-100list-group-flush

Ver solución comentadaMostra la solució comentada
NivelNivell 3

Página de inicio de una academiaPàgina d'inici d'una acadèmia

IntermedioIntermedi50 min

ObjetivoObjectiu. Combinar varios componentes de Bootstrap en una portada: navbar responsive con desplegable, hero, tarjetas con Bootstrap Icons y footer en columnas. Personalizar el color principal desde una hoja de estilos propia.Combinar diversos components de Bootstrap en una portada: navbar responsive amb desplegable, hero, targetes amb Bootstrap Icons i footer en columnes. Personalitzar el color principal des d'un full d'estils propi.

EnunciadoEnunciat

Brúixola es una escuela de programación ficticia de Terrassa que abre un nuevo grupo en enero. Te piden la página de inicio.

Requisitos:

  • Navbar fija arriba (sticky-top) que en pantallas grandes muestra el menú completo y en móvil lo recoge tras el botón hamburguesa.
  • En el menú, un desplegable "Cursos" con tres cursos, una línea separadora y un enlace al calendario.
  • Un botón "Reserva tu plaza" dentro del menú, alineado a la derecha.
  • Un hero con texto a la izquierda (etiqueta, título, entradilla y dos botones) y una imagen a la derecha. En móvil, la imagen pasa debajo.
  • Una sección de cursos con tres tarjetas de la misma altura, cada una con un icono dentro de un círculo de color.
  • Un footer oscuro de tres columnas con la marca, los cursos y los datos de contacto con iconos.
  • Un archivo css/style.css que cambie el color principal de Bootstrap por un verde azulado (#0f766e).

Brúixola és una escola de programació fictícia de Terrassa que obre un grup nou al gener. Et demanen la pàgina d'inici.

Requisits:

  • Navbar fixa a dalt (sticky-top) que a les pantalles grans mostra el menú complet i al mòbil el recull darrere del botó hamburguesa.
  • Al menú, un desplegable "Cursos" amb tres cursos, una línia separadora i un enllaç al calendari.
  • Un botó "Reserva la teva plaça" dins del menú, alineat a la dreta.
  • Un hero amb text a l'esquerra (etiqueta, títol, entradeta i dos botons) i una imatge a la dreta. Al mòbil, la imatge passa a sota.
  • Una secció de cursos amb tres targetes de la mateixa alçada, cadascuna amb una icona dins d'un cercle de color.
  • Un footer fosc de tres columnes amb la marca, els cursos i les dades de contacte amb icones.
  • Un fitxer css/style.css que canviï el color principal de Bootstrap per un verd blavós (#0f766e).

PasosPassos

  1. Plantilla con los tres enlaces del head en orden: Bootstrap, Bootstrap Icons y tu css/style.css.
  2. Navbar completa con navbar-expand-lg, botón navbar-toggler, bloque collapse y desplegable.
  3. Hero con una fila de dos columnas col-lg-6 alineadas al centro.
  4. Sección de cursos con row-cols-1 row-cols-md-3 y tres cards h-100.
  5. Footer en columnas y retoques de color en style.css.
  1. Plantilla amb els tres enllaços del head en ordre: Bootstrap, Bootstrap Icons i el teu css/style.css.
  2. Navbar completa amb navbar-expand-lg, botó navbar-toggler, bloc collapse i desplegable.
  3. Hero amb una fila de dues columnes col-lg-6 alineades al centre.
  4. Secció de cursos amb row-cols-1 row-cols-md-3 i tres cards h-100.
  5. Footer en columnes i retocs de color a style.css.

PistasPistes

  • El data-bs-target del botón hamburguesa lleva almohadilla (#menuPrincipal) y tiene que coincidir con el id del div collapse, que va sin almohadilla.
  • Para empujar el menú a la derecha basta con ms-auto en el ul.navbar-nav.
  • El desplegable necesita tres piezas: li.nav-item.dropdown, un enlace con dropdown-toggle y data-bs-toggle="dropdown", y un ul.dropdown-menu.
  • Si cambias --bs-primary y los botones siguen azules, recuerda que .btn-primary usa sus propias variables --bs-btn-bg, --bs-btn-border-color y las de hover.
  • Si el menú hamburguesa no se abre, comprueba que el script bootstrap.bundle.min.js está al final del body.
  • El data-bs-target del botó hamburguesa porta coixinet (#menuPrincipal) i ha de coincidir amb l'id del div collapse, que va sense coixinet.
  • Per empènyer el menú a la dreta n'hi ha prou amb ms-auto a l'ul.navbar-nav.
  • El desplegable necessita tres peces: li.nav-item.dropdown, un enllaç amb dropdown-toggle i data-bs-toggle="dropdown", i un ul.dropdown-menu.
  • Si canvies --bs-primary i els botons continuen blaus, recorda que .btn-primary fa servir les seves pròpies variables --bs-btn-bg, --bs-btn-border-color i les de hover.
  • Si el menú hamburguesa no s'obre, comprova que l'script bootstrap.bundle.min.js és al final del body.

navbarnavbar-expand-lgnavbar-togglercollapsedropdownsticky-topms-autobadgeimg-fluidrow-cols-md-3cardcard-footershadow-smBootstrap Iconslist-unstyled--bs-primary--bs-btn-bg

Ver solución comentadaMostra la solució comentada
NivelNivell 4

Formulario de inscripción a un tallerFormulari d'inscripció a un taller

IntermedioIntermedi45 min

ObjetivoObjectiu. Maquetar un formulario completo con los componentes de formulario de Bootstrap: floating labels, input-group, select, checks, radios y switch, organizados con la rejilla. Mostrar de ejemplo los estados de validación is-valid e is-invalid.Maquetar un formulari complet amb els components de formulari de Bootstrap: floating labels, input-group, select, checks, ràdios i switch, organitzats amb la graella. Mostrar d'exemple els estats de validació is-valid i is-invalid.

EnunciadoEnunciat

Papers del Rec es un taller de papelería ficticio de Girona que organiza un curso de encuadernación japonesa. Necesita el formulario de inscripción. No hace falta que envíe datos: solo lo maquetamos.

El formulario va dentro de una tarjeta blanca centrada sobre un fondo gris y tiene tres bloques:

  • Tus datos: nombre y apellidos en la misma fila y el correo debajo, los tres con floating labels.
  • Contacto y preferencias: teléfono con el prefijo +34 pegado, usuario de Instagram con el icono de arroba, un select de experiencia previa, un número de plazas con el precio pegado detrás y un textarea de comentarios con floating label.
  • Material: tres radios para elegir kit (uno desactivado), tres checkboxes en línea, un switch para el boletín y un check obligatorio de condiciones.

Para practicar los estados de validación, deja el nombre marcado como válido, el correo y el check de condiciones marcados como erróneos, cada uno con su mensaje. Termina con un botón oscuro que ocupe todo el ancho.

Papers del Rec és un taller de papereria fictici de Girona que organitza un curs d'enquadernació japonesa. Necessita el formulari d'inscripció. No cal que enviï dades: només el maquetem.

El formulari va dins d'una targeta blanca centrada sobre un fons gris i té tres blocs:

  • Les teves dades: nom i cognoms a la mateixa fila i el correu a sota, tots tres amb floating labels.
  • Contacte i preferències: telèfon amb el prefix +34 enganxat, usuari d'Instagram amb la icona d'arrova, un select d'experiència prèvia, un nombre de places amb el preu enganxat al darrere i un textarea de comentaris amb floating label.
  • Material: tres ràdios per triar el kit (un de desactivat), tres caselles en línia, un switch per al butlletí i una casella obligatòria de condicions.

Per practicar els estats de validació, deixa el nom marcat com a vàlid, i el correu i la casella de condicions marcats com a erronis, cadascun amb el seu missatge. Acaba amb un botó fosc que ocupi tota l'amplada.

PasosPassos

  1. Estructura: container, fila centrada con justify-content-center y una card con card-body.
  2. Bloque de datos con row g-3 y tres form-floating.
  3. Bloque de contacto con dos input-group, un form-select y un textarea flotante.
  4. Bloque de material con fieldset, radios, checks en línea, switch y check obligatorio.
  5. Estados is-valid / is-invalid con sus mensajes y botón final btn-lg w-100.
  1. Estructura: container, fila centrada amb justify-content-center i una card amb card-body.
  2. Bloc de dades amb row g-3 i tres form-floating.
  3. Bloc de contacte amb dos input-group, un form-select i un textarea flotant.
  4. Bloc de material amb fieldset, ràdios, caselles en línia, switch i casella obligatòria.
  5. Estats is-valid / is-invalid amb els seus missatges i botó final btn-lg w-100.

PistasPistes

  • Dentro de form-floating el orden importa: primero el input y después el label. Además el input necesita un atributo placeholder aunque no se llegue a ver.
  • Los mensajes valid-feedback e invalid-feedback están ocultos por defecto. Solo aparecen cuando el campo que tienen justo antes lleva is-valid o is-invalid.
  • Los radios de un mismo grupo deben compartir el mismo name; si no, se podrán marcar todos a la vez.
  • Cada form-check-input necesita un id único y su label un for con ese mismo id. Así, al pulsar el texto también se marca la casilla.
  • Un textarea dentro de form-floating sale con la altura de una línea; la utilidad h-auto junto con rows lo soluciona sin CSS propio.
  • Dins de form-floating l'ordre importa: primer l'input i després el label. A més, l'input necessita un atribut placeholder encara que no es vegi.
  • Els missatges valid-feedback i invalid-feedback estan amagats per defecte. Només apareixen quan el camp que tenen just abans porta is-valid o is-invalid.
  • Els ràdios d'un mateix grup han de compartir el mateix name; si no, es podran marcar tots alhora.
  • Cada form-check-input necessita un id únic i el seu label un for amb aquest mateix id. Així, en clicar el text també es marca la casella.
  • Un textarea dins de form-floating surt amb l'alçada d'una línia; la utilitat h-auto juntament amb rows ho soluciona sense CSS propi.

form-controlform-labelform-textform-floatinginput-groupinput-group-textform-selectform-checkform-check-inlineform-switchis-validis-invalidvalid-feedbackinvalid-feedbackrow g-3justify-content-centerw-100

Ver solución comentadaMostra la solució comentada
NivelNivell 5

Reto: página de planes y preciosRepte: pàgina de plans i preus

RetoRepte75 min

ObjetivoObjectiu. Resolver por tu cuenta una página de tarifas que combina tarjetas de precio con una destacada, list-group, una tabla de comparación responsive y un acordeón de preguntas frecuentes. Adaptar los colores de Bootstrap a la marca con variables --bs-*.Resoldre pel teu compte una pàgina de tarifes que combina targetes de preu amb una de destacada, list-group, una taula de comparació responsive i un acordió de preguntes freqüents. Adaptar els colors de Bootstrap a la marca amb variables --bs-*.

EnunciadoEnunciat

La Nau es un coworking ficticio instalado en un antiguo almacén textil de Sant Andreu. Quiere una página de tarifas que se entienda de un vistazo y que funcione bien en el móvil.

Contenido mínimo:

  • Navbar con el nombre y cuatro enlaces que lleven a las secciones de la página.
  • Una cabecera centrada con título y entradilla.
  • Tres planes en tarjetas: Flexible (90 €), Fijo (165 €) y Despacho (520 €). El plan Fijo es el recomendado: borde de color, sombra, franja superior con el texto "El que más se contrata" y un badge con un descuento.
  • Dentro de cada tarjeta, la lista de ventajas con list-group e iconos de Bootstrap Icons.
  • Una tabla que compare los tres planes en al menos cinco servicios, con la columna del plan Fijo resaltada. En el móvil la tabla debe poder desplazarse en horizontal sin romper la página.
  • Un acordeón con cuatro preguntas frecuentes, la primera abierta.
  • Un pie sencillo.

El color principal de la marca es un granate ladrillo (#9a3412). Tiene que verse en botones, enlaces, borde de la tarjeta destacada, columna resaltada de la tabla y pregunta abierta del acordeón.

La Nau és un coworking fictici instal·lat en un antic magatzem tèxtil de Sant Andreu. Vol una pàgina de tarifes que s'entengui d'un cop d'ull i que funcioni bé al mòbil.

Contingut mínim:

  • Navbar amb el nom i quatre enllaços que portin a les seccions de la pàgina.
  • Una capçalera centrada amb títol i entradeta.
  • Tres plans en targetes: Flexible (90 €), Fix (165 €) i Despatx (520 €). El pla Fix és el recomanat: vora de color, ombra, franja superior amb el text "El que més es contracta" i un badge amb un descompte.
  • Dins de cada targeta, la llista d'avantatges amb list-group i icones de Bootstrap Icons.
  • Una taula que compari els tres plans en almenys cinc serveis, amb la columna del pla Fix ressaltada. Al mòbil, la taula s'ha de poder desplaçar en horitzontal sense trencar la pàgina.
  • Un acordió amb quatre preguntes freqüents, la primera oberta.
  • Un peu senzill.

El color principal de la marca és un granat totxo (#9a3412). S'ha de veure als botons, als enllaços, a la vora de la targeta destacada, a la columna ressaltada de la taula i a la pregunta oberta de l'acordió.

PasosPassos

  1. Navbar y cabecera centrada.
  2. Tres tarjetas de precio en una fila row-cols-lg-3, con la central destacada.
  3. Tabla de comparación dentro de table-responsive.
  4. Acordeón de preguntas frecuentes.
  5. Variables --bs-* en css/style.css para llevar el granate a todos los componentes.
  1. Navbar i capçalera centrada.
  2. Tres targetes de preu en una fila row-cols-lg-3, amb la central destacada.
  3. Taula de comparació dins de table-responsive.
  4. Acordió de preguntes freqüents.
  5. Variables --bs-* a css/style.css per portar el granat a tots els components.

PistasPistes

  • Una card admite varios card-body: uno arriba con el precio, un list-group-flush en medio y otro card-body abajo con el botón.
  • La tabla va dentro de un div.table-responsive; es ese div el que genera la barra de desplazamiento.
  • En el acordeón, cada botón apunta con data-bs-target al id de su panel, y todos los paneles llevan data-bs-parent con el id del acordeón para que solo haya uno abierto.
  • Además de --bs-primary y --bs-primary-rgb, botones, tablas y acordeón tienen variables propias (--bs-btn-*, --bs-table-bg, --bs-accordion-active-bg). Búscalas en la documentación de cada componente, en el apartado "CSS variables".
  • Una card admet diversos card-body: un a dalt amb el preu, un list-group-flush al mig i un altre card-body a baix amb el botó.
  • La taula va dins d'un div.table-responsive; és aquest div el que genera la barra de desplaçament.
  • A l'acordió, cada botó apunta amb data-bs-target a l'id del seu panell, i tots els panells porten data-bs-parent amb l'id de l'acordió perquè només n'hi hagi un d'obert.
  • A més de --bs-primary i --bs-primary-rgb, els botons, les taules i l'acordió tenen variables pròpies (--bs-btn-*, --bs-table-bg, --bs-accordion-active-bg). Busca-les a la documentació de cada component, a l'apartat "CSS variables".

cardcard-headerborder-primarybadgerounded-pilllist-grouplist-group-flushrow-cols-lg-3tabletable-responsivetable-hovertable-primaryaccordiondata-bs-parentvisually-hidden--bs-primary--bs-border-radius--bs-accordion-active-bg

Ver solución comentadaMostra la solució comentada
NivelNivell 6

Reto: web completa de una cafetería en GràciaRepte: web completa d'una cafeteria a Gràcia

RetoRepte120 min

ObjetivoObjectiu. Construir una web de una sola página que reúna los componentes interactivos de Bootstrap (navbar, carrusel, pestañas y modal) con la rejilla, un mapa incrustado y una marca propia aplicada con variables --bs-*.Construir una web d'una sola pàgina que reuneixi els components interactius de Bootstrap (navbar, carrusel, pestanyes i modal) amb la graella, un mapa incrustat i una marca pròpia aplicada amb variables --bs-*.

EnunciadoEnunciat

El Cafè del Sol es una cafetería ficticia de especialidad en la Plaça del Sol, en Gràcia. Quieren una web de una sola página que puedan enseñar en el móvil a quien pasa por la terraza.

La web debe incluir:

  • Navbar oscura fija arriba, con el menú hamburguesa en móvil y un botón "Reservar mesa" que abra un modal.
  • Un carrusel de portada con tres fotos, indicadores, flechas y un texto sobre cada foto que solo se vea desde tablet.
  • La carta en tres pestañas (Cafés, Dulces, Salado). Cada plato con nombre, descripción y precio alineado a la derecha.
  • Una galería de seis fotos cuadradas: dos por fila en móvil y tres desde tablet.
  • Una sección "Dónde estamos" con dirección, metro, teléfono, horario y un mapa de OpenStreetMap incrustado que mantenga su proporción en cualquier pantalla.
  • Un footer oscuro con iconos de redes sociales.
  • Un modal de reserva con nombre, día, hora, comensales, teléfono y un switch para elegir terraza.

La marca usa un marrón tostado (#3b2418) para la navbar y el pie, un caramelo (#b45f2b) como color principal y un crema (#f3e4cf) para los precios. Aplícala desde css/style.css cambiando las variables --bs-* para que el color llegue solo a botones, enlaces, pestañas y formularios.

El Cafè del Sol és una cafeteria fictícia d'especialitat a la plaça del Sol, a Gràcia. Volen una web d'una sola pàgina que puguin ensenyar al mòbil a qui passa per la terrassa.

La web ha d'incloure:

  • Navbar fosca fixa a dalt, amb el menú hamburguesa al mòbil i un botó "Reservar taula" que obri un modal.
  • Un carrusel de portada amb tres fotos, indicadors, fletxes i un text sobre cada foto que només es vegi a partir de la tauleta.
  • La carta en tres pestanyes (Cafès, Dolços, Salat). Cada plat amb nom, descripció i preu alineat a la dreta.
  • Una galeria de sis fotos quadrades: dues per fila al mòbil i tres a partir de la tauleta.
  • Una secció "On som" amb adreça, metro, telèfon, horari i un mapa d'OpenStreetMap incrustat que mantingui la proporció en qualsevol pantalla.
  • Un footer fosc amb icones de xarxes socials.
  • Un modal de reserva amb nom, dia, hora, comensals, telèfon i un switch per triar terrassa.

La marca fa servir un marró torrat (#3b2418) per a la navbar i el peu, un caramel (#b45f2b) com a color principal i un crema (#f3e4cf) per als preus. Aplica-la des de css/style.css canviant les variables --bs-* perquè el color arribi sol als botons, als enllaços, a les pestanyes i als formularis.

PasosPassos

  1. Navbar fixed-top con data-bs-theme="dark" y botón que abre el modal.
  2. Carrusel de portada con indicadores, flechas y carousel-caption.
  3. Carta con nav-tabs y tab-content, y galería con row-cols y ratio-1x1.
  4. Sección de ubicación con el iframe de OpenStreetMap dentro de un div.ratio, y footer con Bootstrap Icons.
  5. Modal de reserva con formulario y variables de marca en css/style.css.
  1. Navbar fixed-top amb data-bs-theme="dark" i botó que obre el modal.
  2. Carrusel de portada amb indicadors, fletxes i carousel-caption.
  3. Carta amb nav-tabs i tab-content, i galeria amb row-cols i ratio-1x1.
  4. Secció d'ubicació amb l'iframe d'OpenStreetMap dins d'un div.ratio, i footer amb Bootstrap Icons.
  5. Modal de reserva amb formulari i variables de marca a css/style.css.

PistasPistes

  • Con fixed-top la navbar deja de ocupar sitio y tapa el principio de la página: compensa con un padding-top en el body.
  • Las pestañas necesitan que cada botón tenga data-bs-toggle="tab" y un data-bs-target con el id de su tab-pane; solo un botón y un panel llevan active al empezar.
  • Para el mapa, ve a openstreetmap.org, busca la Plaça del Sol, pulsa Compartir y elige HTML: obtendrás la URL export/embed.html con el bbox. Mete el iframe dentro de un div.ratio.ratio-4x3 y se adaptará solo.
  • El modal puede ir al final del body. Lo abre cualquier botón con data-bs-toggle="modal" y data-bs-target apuntando a su id.
  • Amb fixed-top la navbar deixa d'ocupar lloc i tapa el principi de la pàgina: compensa-ho amb un padding-top al body.
  • Les pestanyes necessiten que cada botó tingui data-bs-toggle="tab" i un data-bs-target amb l'id del seu tab-pane; només un botó i un panell porten active en començar.
  • Per al mapa, ves a openstreetmap.org, busca la plaça del Sol, prem Comparteix i tria HTML: obtindràs l'URL export/embed.html amb el bbox. Posa l'iframe dins d'un div.ratio.ratio-4x3 i s'adaptarà sol.
  • El modal pot anar al final del body. L'obre qualsevol botó amb data-bs-toggle="modal" i data-bs-target apuntant al seu id.

navbarfixed-topdata-bs-theme="dark"carouselcarousel-indicatorscarousel-captionnav-tabstab-contenttab-panerow-cols-md-3ratioobject-fit-coveriframe OpenStreetMapmodaldata-bs-dismissform-floatingform-switchBootstrap Icons--bs-primary--bs-body-bg--bs-nav-tabs-link-active-color

Ver solución comentadaMostra la solució comentada

Materiales y descargasMaterials i descàrregues

Herramientas y referenciasEines i referències

Sigue con otros cursosContinua amb altres cursos

GlosarioGlossari

AccesibilidadHTML
Conseguir que cualquier persona, también con discapacidad, pueda usar la web.Aconseguir que qualsevol persona, també amb discapacitat, pugui fer servir el web.
altHTML
Texto alternativo de una imagen. Lo leen los lectores de pantalla y aparece si la imagen no carga.Text alternatiu d'una imatge. El llegeixen els lectors de pantalla i apareix si la imatge no carrega.
AnclaHTML
Enlace a una parte de la misma página con href="#id".Enllaç a una part de la mateixa pàgina amb href="#id".
AtributoHTML
Información extra de una etiqueta con la forma nombre="valor", como href o alt.Informació extra d'una etiqueta amb la forma nom="valor", com href o alt.
Back-EndWeb
La parte que funciona en el servidor: bases de datos, usuarios, pagos.La part que funciona al servidor: bases de dades, usuaris, pagaments.
bodyHTML
Parte del documento con todo el contenido visible.Part del document amb tot el contingut visible.
BootstrapBootstrap
Framework de CSS con rejilla responsive, clases utilitarias y componentes.Framework de CSS amb graella responsive, classes utilitàries i components.
box-sizingCSS
Propiedad que decide si el ancho incluye relleno y borde (border-box) o no (content-box).Propietat que decideix si l'amplada inclou farciment i vora (border-box) o no (content-box).
BreakpointBootstrap
Punto de corte: ancho de pantalla a partir del cual cambia el diseño (sm, md, lg, xl, xxl).Punt de tall: amplada de pantalla a partir de la qual canvia el disseny (sm, md, lg, xl, xxl).
CascadaCSS
Orden con el que el navegador decide qué regla se aplica cuando varias chocan.Ordre amb què el navegador decideix quina regla s'aplica quan n'hi ha diverses que xoquen.
CDNBootstrap
Red de servidores que entrega archivos como Bootstrap sin tener que descargarlos.Xarxa de servidors que lliura fitxers com Bootstrap sense haver de descarregar-los.
ClaseCSS
Nombre reutilizable que se da a uno o varios elementos con class y se selecciona con un punto.Nom reutilitzable que es dona a un o diversos elements amb class i se selecciona amb un punt.
Clase utilitariaBootstrap
Clase que hace una sola cosa, como mt-3 (margen superior) o text-center.Classe que fa una sola cosa, com mt-3 (marge superior) o text-center.
ComponenteBootstrap
Pieza de interfaz lista para usar: navbar, card, carousel, accordion, modal.Peça d'interfície a punt per fer servir: navbar, card, carousel, accordion, modal.
CSSWeb
Lenguaje de estilos que define el aspecto de una página: colores, tipografías, tamaños y posición.Llenguatge d'estils que defineix l'aspecte d'una pàgina: colors, tipografies, mides i posició.
CSS GridCSS
Modelo de CSS para maquetar en filas y columnas a la vez.Model de CSS per maquetar en files i columnes alhora.
DeclaraciónCSS
Pareja propiedad: valor; dentro de una regla.Parella propietat: valor; dins d'una regla.
DOCTYPEHTML
Primera línea del documento; indica al navegador que es HTML5.Primera línia del document; indica al navegador que és HTML5.
Eje principalCSS
En Flexbox, la dirección en la que se colocan los ítems: horizontal con row, vertical con column.A Flexbox, la direcció en què es col·loquen els ítems: horitzontal amb row, vertical amb column.
ElementoHTML
Etiqueta de apertura, contenido y etiqueta de cierre.Etiqueta d'obertura, contingut i etiqueta de tancament.
Elemento vacíoHTML
Elemento sin contenido ni etiqueta de cierre, como img, br, hr o input.Element sense contingut ni etiqueta de tancament, com img, br, hr o input.
emCSS
Medida relativa al tamaño de letra del elemento padre.Mida relativa a la mida de lletra de l'element pare.
EntidadHTML
Código que representa un carácter especial, como © para ©.Codi que representa un caràcter especial, com © per a ©.
EspecificidadCSS
Peso de un selector: id pesa más que clase, y clase más que etiqueta.Pes d'un selector: l'id pesa més que la classe, i la classe més que l'etiqueta.
EtiquetaHTML
Marca entre los signos < y > que indica qué tipo de elemento es un contenido.Marca entre els signes < i > que indica quin tipus d'element és un contingut.
FlexboxCSS
Modelo de CSS para alinear y repartir elementos en una fila o una columna.Model de CSS per alinear i repartir elements en una fila o una columna.
FrameworkBootstrap
Conjunto de código ya escrito que sirve de base para construir un proyecto.Conjunt de codi ja escrit que serveix de base per construir un projecte.
Front-EndWeb
La parte de una web que se ejecuta en el navegador y ve el usuario.La part d'una web que s'executa al navegador i veu l'usuari.
headHTML
Parte del documento con información sobre la página que no se ve.Part del document amb informació sobre la pàgina que no es veu.
HerenciaCSS
Paso de algunas propiedades, como el color o la fuente, de un elemento a sus hijos.Pas d'algunes propietats, com el color o la font, d'un element als seus fills.
HTMLWeb
Lenguaje de marcado que define la estructura y el contenido de una página.Llenguatge de marcatge que defineix l'estructura i el contingut d'una pàgina.
idCSS
Nombre único de un elemento; se selecciona con #.Nom únic d'un element; se selecciona amb #.
InspectorWeb
Herramientas de desarrollo del navegador para ver y editar en vivo el HTML y el CSS (F12).Eines de desenvolupament del navegador per veure i editar en directe l'HTML i el CSS (F12).
Live ServerWeb
Extensión de VS Code que abre la página y la recarga cada vez que guardas.Extensió de VS Code que obre la pàgina i la recarrega cada vegada que deses.
Media queryCSS
Bloque de reglas que solo se aplica a partir de cierto ancho de pantalla.Bloc de regles que només s'aplica a partir d'una amplada de pantalla.
Meta viewportHTML
Etiqueta que hace que la página se adapte al ancho del móvil.Etiqueta que fa que la pàgina s'adapti a l'amplada del mòbil.
Mobile firstCSS
Diseñar primero para el móvil y añadir después reglas para pantallas grandes.Dissenyar primer per al mòbil i afegir després regles per a pantalles grans.
Modelo de cajaCSS
Forma en que CSS mide un elemento: contenido, padding, border y margin.Manera com el CSS mesura un element: contingut, padding, border i margin.
NavegadorWeb
Programa que pide los archivos de una web y los dibuja en pantalla: Chrome, Firefox, Safari, Edge.Programa que demana els fitxers d'una web i els dibuixa a la pantalla: Chrome, Firefox, Safari, Edge.
PseudoclaseCSS
Selector de un estado del elemento, como :hover o :focus.Selector d'un estat de l'element, com :hover o :focus.
PseudoelementoCSS
Selector de una parte del elemento, como ::before o ::first-letter.Selector d'una part de l'element, com ::before o ::first-letter.
ReglaCSS
Bloque formado por un selector y sus declaraciones entre llaves.Bloc format per un selector i les seves declaracions entre claus.
Rejilla (grid)Bootstrap
Sistema de Bootstrap que divide cada fila en 12 columnas.Sistema de Bootstrap que divideix cada fila en 12 columnes.
remCSS
Medida relativa al tamaño de letra del elemento html; 1rem suele ser 16px.Mida relativa a la mida de lletra de l'element html; 1rem sol ser 16px.
ResponsiveCSS
Diseño que se adapta a cualquier tamaño de pantalla.Disseny que s'adapta a qualsevol mida de pantalla.
Ruta absolutaHTML
Dirección completa de un archivo, con el protocolo y el dominio.Adreça completa d'un fitxer, amb el protocol i el domini.
Ruta relativaHTML
Camino a un archivo desde el archivo actual, como img/foto.jpg o ../index.html.Camí a un fitxer des del fitxer actual, com img/foto.jpg o ../index.html.
SelectorCSS
Parte de la regla que indica a qué elementos se aplica.Part de la regla que indica a quins elements s'aplica.
SemánticaHTML
Usar cada etiqueta según su significado (header, nav, main…) para que buscadores y lectores de pantalla entiendan la página.Fer servir cada etiqueta segons el seu significat (header, nav, main…) perquè cercadors i lectors de pantalla entenguin la pàgina.
ServidorWeb
Ordenador conectado a internet que guarda una web y envía sus archivos a quien los pide.Ordinador connectat a internet que guarda una web i n'envia els fitxers a qui els demana.
URLWeb
Dirección única de un recurso en internet, por ejemplo https://danimcasas.com.Adreça única d'un recurs a internet, per exemple https://danimcasas.com.
Variable CSSCSS
Valor con nombre declarado con -- y usado con var(), por ejemplo var(--principal).Valor amb nom declarat amb -- i fet servir amb var(), per exemple var(--principal).
vh / vwCSS
Un 1% del alto o del ancho de la ventana del navegador.Un 1% de l'alçada o de l'amplada de la finestra del navegador.

Preguntas frecuentesPreguntes freqüents

¿Necesito saber programar?Cal saber programar?

No. El curso empieza desde cero. Basta con manejar el ordenador con soltura: crear carpetas, guardar archivos y usar el navegador.
No. El curs comença des de zero. N'hi ha prou amb fer servir l'ordinador amb soltesa: crear carpetes, desar fitxers i fer servir el navegador.

¿Qué tengo que instalar?Què he d'instal·lar?

Un editor de código, Visual Studio Code o Sublime Text, y un navegador actualizado como Chrome o Firefox. Nada más: Bootstrap se carga desde internet.
Un editor de codi, Visual Studio Code o Sublime Text, i un navegador actualitzat com Chrome o Firefox. Res més: Bootstrap es carrega des d'internet.

¿El curso incluye JavaScript?El curs inclou JavaScript?

No. Aquí trabajamos HTML, CSS y Bootstrap. JavaScript tiene su propio curso de tres sesiones; con esta base lo aprovecharás mucho más.
No. Aquí treballem HTML, CSS i Bootstrap. El JavaScript té el seu propi curs de tres sessions; amb aquesta base l'aprofitaràs molt més.

¿Dónde descargo el código de las prácticas?On descarrego el codi de les pràctiques?

En cada práctica tienes un botón para descargar cada archivo y otro para descargar la práctica entera en .zip, con su estructura de carpetas. También puedes bajar todas las prácticas de una sesión o del curso completo desde «Materiales y descargas».
A cada pràctica tens un botó per descarregar cada fitxer i un altre per descarregar la pràctica sencera en .zip, amb l'estructura de carpetes. També pots baixar totes les pràctiques d'una sessió o del curs complet des de «Materials i descàrregues».

¿Puedo ver el resultado sin crear los archivos?Puc veure el resultat sense crear els fitxers?

Sí. El botón «Ver resultado» abre la práctica funcionando en una ventana. Aun así, el aprendizaje está en picar el código: es lo que hace que lo recuerdes.
Sí. El botó «Mostra el resultat» obre la pràctica funcionant en una finestra. Tot i així, l'aprenentatge és en picar el codi: és el que fa que el recordis.

Si la IA ya escribe código, ¿por qué lo picamos a mano?Si la IA ja escriu codi, per què el piquem a mà?

Porque para pedirle bien las cosas a una IA, revisar lo que genera y corregir sus errores necesitas entender HTML y CSS. Cuando dominas la base, la IA te hace mucho más rápido; sin base, copias código que no sabes arreglar.
Perquè per demanar bé les coses a una IA, revisar el que genera i corregir-ne els errors cal entendre l'HTML i el CSS. Quan domines la base, la IA et fa molt més ràpid; sense base, copies codi que no saps arreglar.

Mi CSS no se aplica. ¿Qué reviso?El meu CSS no s'aplica. Què reviso?

Por orden: que has guardado los dos archivos; que la ruta del <link> coincide con la carpeta y el nombre exactos (mayúsculas incluidas); que cada declaración termina en punto y coma y cada regla cierra su llave; que el selector coincide con la clase o el id del HTML. El inspector (F12) te dice si la regla llega y si otra la está tachando.
Per ordre: que has desat els dos fitxers; que la ruta del <link> coincideix amb la carpeta i el nom exactes (majúscules incloses); que cada declaració acaba en punt i coma i cada regla tanca la clau; que el selector coincideix amb la classe o l'id de l'HTML. L'inspector (F12) et diu si la regla arriba i si una altra la ratlla.

¿Por qué Bootstrap 5 si el curso se llamaba «Bootstrap 4»?Per què Bootstrap 5 si el curs es deia «Bootstrap 4»?

Bootstrap 5.3 es la versión vigente y la que encontrarás en las ofertas de trabajo. En la teoría de la sesión 4 tienes una tabla con los cambios por si te encuentras código antiguo.
Bootstrap 5.3 és la versió vigent i la que trobaràs a les ofertes de feina. A la teoria de la sessió 4 tens una taula amb els canvis per si trobes codi antic.

Las imágenes de las prácticas, ¿de dónde salen?Les imatges de les pràctiques, d'on surten?

De picsum.photos, un banco de fotos libres que funciona con un enlace. En tus proyectos guarda las imágenes en una carpeta img y enlázalas con una ruta relativa.
De picsum.photos, un banc de fotos lliures que funciona amb un enllaç. Als teus projectes desa les imatges en una carpeta img i enllaça-les amb una ruta relativa.

¿Cómo entrego la práctica final?Com lliuro la pràctica final?

Comprime la carpeta del proyecto en un .zip con tu nombre y súbela a la carpeta de entregas que tienes en «Materiales y descargas».
Comprimeix la carpeta del projecte en un .zip amb el teu nom i puja-la a la carpeta de lliuraments que tens a «Materials i descàrregues».

¿Cómo sigo practicando cuando acabe el curso?Com continuo practicant quan acabi el curs?

Con el anexo de ejercicios de esta página, los juegos Flexbox Froggy y Grid Garden y la certificación de diseño web responsive de freeCodeCamp. El siguiente paso natural es el curso de JavaScript.
Amb l'annex d'exercicis d'aquesta pàgina, els jocs Flexbox Froggy i Grid Garden i la certificació de disseny web responsive de freeCodeCamp. El pas següent natural és el curs de JavaScript.

El formadorEl formador

Daniel M. Casas es desarrollador full stack y máster en Inteligencia Artificial y Big Data. Lleva más de diez años formando en Barcelona Activa y en el Cibernàrium, en desarrollo web, comercio electrónico, SEO e inteligencia artificial.

Daniel M. Casas és desenvolupador full stack i màster en Intel·ligència Artificial i Big Data. Fa més de deu anys que forma a Barcelona Activa i al Cibernàrium, en desenvolupament web, comerç electrònic, SEO i intel·ligència artificial.

Este curso, en tu empresaAquest curs, a la teva empresa

El mismo programa se imparte para equipos y particulares, presencial en Barcelona u online, adaptado a vuestro proyecto.El mateix programa s'imparteix per a equips i particulars, presencial a Barcelona o en línia, adaptat al vostre projecte.

Escribir a DanielEscriu a Daniel danimcasas.com