1. Web Design
  2. HTML/CSS
  3. Landing Pages

Cómo crear una plantilla para página de aterrizaje con Bootstrap 4

Scroll to top

Spanish (Español) translation by Carlos (you can also view the original English article)

En este tutorial continuaremos con nuestro recorrido por Bootstrap 4. De manera más específica, aprenderemos a utilizarlo para crear una página de aterrizaje responsiva.

En lo que vamos a trabajar

Antes de iniciar, como siempre, veamos rápidamente nuestro proyecto de demostración:

Please accept marketing cookies to load this content.

Asegúrate de revisar la versión a pantalla completa y cambiar el tamaño de la ventana de tu navegador para que veas cómo varía su diseño según el tamaño de la ventana gráfica.

Nota: Este tutorial asume que tienes cierta familiaridad con Bootstrap 4. Por ejemplo, debes comprender cómo funciona su sistema de rejillas y sus componentes flexibles. Asimismo, te será muy útil tener un buen entendimiento de sus puntos de ruptura responsivos.

Para ponerte al día, aquí en Tuts+ tenemos varios cursos dedicados a Bootstrap 4.

Los recursos

Utilizaremos algunos recursos en este proyecto, aquí los puedes encontrar:

  • Para los íconos de esta demostración, incluí la biblioteca Font Awesome en nuestro «pen».
  • Todas las imágenes son de Unsplash.

1. Establece el marcado

¡Empecemos! Lo primero que haremos es el típico marcado de página; una cabecera (header), un pie de página (footer) y cinco secciones:

1
<header>...</header>
2
<main>
3
  <!-- Banner Section -->
4
  <section>...</section>
5
  <!-- Process Section -->
6
  <section>...</section>
7
  <!-- Featured Destinations Section -->
8
  <section>...</section>
9
  <!-- Popular Destinations Section -->
10
  <section>...</section>
11
  <!-- Request a Quote Section -->
12
  <section>...</section>
13
</main>
14
<footer>...</footer>

2. Define algunos estilos básicos

Antes de ver de cerca las partes individuales de nuestra página, primero definamos algunos estilos de CSS. Estos son principalmente reglas de restablecimiento junto con algunas clases auxiliares que añadiremos a los elementos de destino más adelante:

1
:root {
2
  --lightblue: #F6F9FC;
3
  --red: #d64041;
4
}
5
6
a,
7
a:hover {
8
  color: inherit;
9
}
10
11
a:hover {
12
  text-decoration: none;
13
}
14
15
.bg-lightblue {
16
  background: var(--lightblue);
17
}
18
19
.bg-red {
20
  background: var(--red);
21
}
22
23
.text-red {
24
  color: var(--red);
25
}
26
27
.container-fluid-max {
28
  max-width: 1440px;
29
}
30
31
.cover {
32
  background: no-repeat center/cover;
33
}
34
35
.p-15 {
36
  padding: 15px;
37
}

Nota: intentaremos mantener nuestro CSS lo más ligero posible y aprovecharemos las clases incorporadas de Bootstrap 4.

3. Crea la cabecera (header)

La cabecera de la página incluye:

  • El logotipo
  • La navegación
  • La información de contacto

Utilizando los puntos de ruptura definidos por Bootstrap, en pantallas extra grandes debería verse así:

The header layout on extra large screensThe header layout on extra large screensThe header layout on extra large screens

En pantallas grandes, así:

The header layout on large screensThe header layout on large screensThe header layout on large screens

En pantallas más pequeñas tendrá un aspecto ligeramente diferente:

The header layout on small screensThe header layout on small screensThe header layout on small screens

HTML de la cabecera

Para crear el marcado de la cabecera, aprovecharemos el componente de la barra de navegación que proporciona Bootstrap.

Así es como se ve:

1
<header class="fixed-top page-header">
2
  <div class="container-fluid container-fluid-max">
3
    <nav id="navbar" class="navbar navbar-expand-lg navbar-dark">
4
      <a class="navbar-brand" href="#home">...</a> 
5
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
6
        <span class="navbar-toggler-icon"></span>
7
      </button>
8
      <div class="collapse navbar-collapse justify-content-lg-between" id="navbarNav">
9
        <ul class="navbar-nav">
10
          <li class="nav-item">
11
            <a class="nav-link" href="">...</a>
12
          </li> 
13
          <!-- more list items here -->
14
        </ul>
15
        <div class="text-white">
16
          <a href="" class="mr-2">
17
            <i class="fas fa-phone"></i>
18
            <div class="d-none d-xl-inline">...</div>
19
          </a>
20
          <a href="">
21
            <i class="fas fa-envelope"></i>
22
            <div class="d-none d-xl-inline">...</div>
23
          </a>
24
        </div>
25
      </div>
26
    </nav>
27
  </div>
28
</header>

CSS de la cabecera

De forma predeterminada, solo la cabecera móvil (menú fuera del lienzo) tendrá un color de fondo.

No obstante, en una próxima sección, discutiremos cómo añadir un color de fondo a la cabecera en pantallas de escritorio cada vez que se desplace la página.

1
.scroll .page-header {
2
  background: var(--red);
3
}
4
5
.page-header {
6
  transition: background 0.5s ease-in-out;
7
}
8
9
.page-header .navbar {
10
  padding: 1rem 0;
11
}
12
13
.page-header .navbar-toggler {
14
  border-color: var(--white); 
15
}
16
17
@media screen and (max-width: 991px) {
18
  .page-header {
19
    background: var(--red);
20
  }
21
}

4. Crea la sección hero (portada)

La primera sección de nuestra página incluye:

  • Una imagen de fondo a pantalla completa
  • Un título o encabezado y dos botones de llamada a la acción que estarán centrados verticalmente sobre esa imagen.

Así se ve:

The section layoutThe section layoutThe section layout

Sección 1 HTML

1
<section id="home" class="d-flex align-items-center position-relative vh-100 cover hero" style="background-image:url(IMG_SRC);">
2
  <div class="container-fluid container-fluid-max">
3
    <div class="row">
4
      <div class="col-12 col-md-8 col-lg-6 col-xl-5">
5
        <h1 class="text-white">...</h1>
6
        <div class="mt-3">
7
          <a class="btn bg-red text-white mr-2" href="" role="button">...</a>
8
          <a class="btn bg-red text-white" href="" role="button">...</a>
9
        </div> 
10
      </div>
11
    </div>
12
  </div>
13
</section>

Sección 1 CSS

Por razones de legibilidad, crearemos una superposición sobre el fondo. Después nos aseguraremos de que el texto se coloque sobre esa superposición.

De forma similar a la cabecera, más adelante discutiremos cómo escalar esta sección, cada vez que la página se desplace.

1
.scroll .hero {
2
  transform: scale(0.98);
3
}
4
5
.hero {
6
  background-attachment: fixed;
7
  transition: transform 0.5s ease-in-out;
8
}
9
10
.hero::after {
11
  content: ’’;
12
  position: absolute;
13
  top: 0;
14
  right: 0;
15
  bottom: 0;
16
  left: 0;
17
  background: linear-gradient(
18
    rgba(0, 0, 0, 0.5) 0,
19
    rgba(0, 0, 0, 0.3) 50%,
20
    rgba(0, 0, 0, 0.1) 100%
21
  );
22
}
23
24
.hero .container-fluid {
25
  z-index: 10;
26
}

5. Crea la sección de la información general

La segunda sección de nuestra página incluye algunos detalles que ofrecen una rápida información general una vez que nuestros visitantes han asimilado la portada:

  • Un encabezado
  • Cuatro bloques de texto con sus íconos
  • Un botón de llamada a la acción

En pantallas grandes y superiores, debería verse así:

The section layout on large screensThe section layout on large screensThe section layout on large screens

En pantallas pequeñas y medianas, así:

The section layout on small and medium screensThe section layout on small and medium screensThe section layout on small and medium screens

Finalmente en pantallas extra pequeñas, todas las columnas se apilan:

The section layout on extra small screensThe section layout on extra small screensThe section layout on extra small screens

Sección 2 HTML

1
<section id="process" class="process">
2
  <div class="container-fluid container-fluid-max">
3
    <div class="row text-center py-5">
4
      <div class="col-12 pb-4">
5
        <h2 class="text-red">...</h2>
6
      </div>
7
      <div class="col-12 col-sm-6 col-lg-3">...</div>
8
      <div class="col-12 col-sm-6 col-lg-3">...</div>
9
      <div class="col-12 col-sm-6 col-lg-3">...</div>
10
      <div class="col-12 col-sm-6 col-lg-3">...</div>
11
      <div class="col-12 pt-3">
12
        <a class="btn bg-red text-white" target="_blank" href="" role="button">...</a>
13
      </div>
14
    </div>
15
  </div>
16
</section>

Apilando los íconos

Para apilar varios íconos en nuestras columnas, aprovecharemos los estilos incluidos con Font Awesome. Esto nos permitirá apilar un ícono blanco sobre un ícono con un círculo de color.

Stacking multiple icons using Font Awesome library

Por ejemplo, a continuación puedes ver el marcado que se usó para la primera columna. Los dos elementos <i> están en línea, uno al lado del otro, pero con las clases fa-stack se apilan.

1
<div class="col-12 col-sm-6 col-lg-3">
2
  <span class="fa-stack fa-2x">
3
    <i class="fas fa-circle fa-stack-2x text-red"></i>
4
    <i class="fas fa-map-marked fa-stack-1x text-white"></i>
5
  </span>
6
  <h3 class="mt-3 text-red h4">...</h3>
7
  <p>...</p>
8
</div>

6. Crea la sección de bloques divididos

La tercera sección de nuestra página incluye dos filas a pantalla completa. Cada fila está dividida, conteniendo una columna de imágenes y una columna de texto. El contenido dentro de las columnas de texto tiene que ser centrado de forma vertical.

En las pantallas medianas y superiores, la distribución de la sección se verá así:

The section layout on medium screens and aboveThe section layout on medium screens and aboveThe section layout on medium screens and above

En las pantallas estrechas, deberían ser así:

The section layout on small screensThe section layout on small screensThe section layout on small screens

Sección 3 HTML

Notarás el orden de los bloques anteriores. En pantallas angostas, los bloques de texto e imagen deben alternarse; imagen, texto, imagen, texto. Esto no ocurriría sin las clases order- de flexbox que verás a continuación:

1
<section id="featured-destinations" class="featured-destinations bg-lightblue">
2
  <div class="row no-gutters">
3
    <div class="col-12 col-md-6 d-flex align-items-center order-1 order-md-0">
4
      <div class="p-15">...</div>
5
    </div>
6
    <div class="col-12 col-md-6 order-0 order-md-1">
7
      <div class="vh-100 cover" style="bakground-image:url(IMG_SRC);">...</div>
8
    </div>
9
    <div class="col-12 col-md-6 order-2">
10
      <div class="vh-100 cover" style="bakground-image:url(IMG_SRC);">...</div>
11
    </div>
12
    <div class="col-12 col-md-6 d-flex align-items-center order-3">
13
      <div class="p-15">...</div>
14
    </div>
15
  </div>
16
</section>

7. Crea la sección de la galería de imágenes

La cuarta sección de nuestra página incluye:

  • Un encabezado
  • Cinco columnas de imágenes junto con su descripción.
  • Un botón de llamada a la acción

En pantallas medianas y superiores, se verá de esta forma:

The section layout on medium screens and aboveThe section layout on medium screens and aboveThe section layout on medium screens and above

En pantallas pequeñas, el diseño cambia de la siguiente forma:

The section layout on small screensThe section layout on small screensThe section layout on small screens

En pantallas extra pequeñas, todas las columnas de imágenes se apilan:

The section layout on extra small screensThe section layout on extra small screensThe section layout on extra small screens

Sección 4 HTML

1
<section id="popular-destinations" class="popular-destinations py-5">
2
  <div class="container-fluid container-fluid-max">
3
    <div class="row">
4
      <div class="col-12">
5
        <h2 class="pb-3 text-red">...</h2>
6
      </div>
7
      <div class="col-12 col-sm-6 col-md-4">...</div>
8
      <div class="col-12 col-sm-6 col-md-4">...</div>
9
      <div class="col-12 col-sm-6 col-md-4">...</div>
10
      <div class="col-12 col-sm-6">...</div>
11
      <div class="col-12 col-md-6">...</div>
12
    </div>
13
    <div class="row">
14
      <div class="col text-center">
15
        <a class="btn bg-red text-white" href="" role="button">...</a>
16
      </div>    
17
    </div>
18
  </div>
19
</section>

El marcado responsable de ajustar el contenido de las columnas es el siguiente:

1
<div class="col-12 col-sm-6 col-md-4">
2
  <a href="" class="text-white">
3
    <figure class="position-relative overflow-hidden">
4
      <img class="img-fluid" src="IMG_SRC" alt="">
5
      <figcaption class="d-flex align-items-center justify-content-center position-absolute">
6
        <h3>...</h3>
7
      </figcaption>
8
    </figure>
9
  </a>
10
</div>

Sección 4 CSS

Al principio, todas las imágenes son borrosas y en escala de grises. Cada vez que pasamos el cursor sobre una imagen, la imagen se escala y sus filtros predeterminados se eliminan.

Estos son los estilos para lograr eso:

1
.popular-destinations figure {
2
  margin-bottom: 30px;
3
}
4
5
.popular-destinations figcaption {
6
  top: 0;
7
  right: 0;
8
  bottom: 0;
9
  left: 0;
10
  background: rgba(0, 0, 0, 0.3);
11
}
12
13
.popular-destinations img {
14
  filter: grayscale(100%) blur(3px);
15
  transition: transform 0.5s, filter 0.75s;
16
}
17
18
.popular-destinations a:hover img {
19
  transform: scale(1.25);
20
  filter: none;
21
}

8. Crea la sección de llamada a la acción

La quinta sección de nuestra página incluye:

  • Un bloque de texto
  • Un botón de llamada a la acción

Los llamados (o llamadas) a la acción son vitales en las páginas de aterrizaje ya que alientan a los visitantes a hacer algo en lugar de irse. El ícono de señalamiento que hemos utilizado hace que el CTA (llamado a la acción) sea particularmente convincente. En pantallas medianas y superiores, su apariencia es la siguiente:

The section layout on medium screens and aboveThe section layout on medium screens and aboveThe section layout on medium screens and above

En pantallas más pequeñas, sin embargo, todos los elementos están apilados:

The section layout on small screensThe section layout on small screensThe section layout on small screens

Sección 5 HTML

1
<section id="request-quote" class="py-5 request-quote bg-lightblue">
2
  <div class="container-fluid container-fluid-max">
3
    <div class="row justify-content-center">
4
      <div class="col-12 col-md-auto py-3 text-center">
5
        <h2 class="mb-0 text-red">...</h2>
6
        <p class="mb-0 h4 text-red font-weight-normal">...</p>
7
      <div>
8
      <div class="col-12 col-md-auto d-flex justify-content-center align-items-center">
9
        <a class="btn bg-red text-white font-weight-bold" href="" role="button">
10
          ... 
11
          <i class="ml-1 fas fa-hand-point-right"></i>
12
        </a>
13
      </div>
14
    </div>
15
  </div>
16
</section>

9. Crea el pie de página (footer)

¡Hemos llegado al final de nuestra plantilla para página de aterrizaje! El pie de página incluye:

  • Un elemento con información sobre los derechos de autor (copyright)
  • Un elemento con enlaces a diferentes páginas.

En pantallas medianas y superiores, se debería ver así:

The footer layout on medium screens and aboveThe footer layout on medium screens and aboveThe footer layout on medium screens and above

En pantallas más pequeñas, el diseño cambia de la siguiente forma:

The footer layout on small screensThe footer layout on small screensThe footer layout on small screens

HTML del pie de página

1
<footer class="py-5 page-footer">
2
  <div class="container-fluid container-fluid-max">
3
    <div class="row">
4
      <div class="col-12 col-md-6 footer-child copyright">...</div>
5
      <div class="col-12 col-md-6 footer-child footer-links">
6
        <a href="" class="mr-3">...</a>
7
        <a href="">...</a>
8
        <div>
9
          <small>...</small>
10
        </div>
11
      </div>
12
    </div>
13
  </div>
14
</footer>

CSS del pie de página

La alineación de los enlaces del pie de página cambiará dependiendo del tamaño de la ventana gráfica. Aquí están las reglas que determinan ese comportamiento:

1
.page-footer .footer-links {
2
  text-align: right;
3
}
4
5
@media screen and (max-width: 767px) {
6
  .page-footer .footer-child {
7
    text-align: center;
8
  }
9
}

En este punto, veamos nuestra página:

Please accept marketing cookies to load this content.

10. Añade algunas acciones de JavaScript

Es hora de escribir algo de JavaScript que mejorará la experiencia de nuestra página.

Animaciones al desplazarnos

Cuando se desplaza la página, el elemento body debe recibir la clase scroll. Esta clase será responsable de lo siguiente:

  • Añadir un color de fondo a la cabecera. Ten en cuenta que el comportamiento solo debe ocurrir en pantallas medianas y superiores. Recuerda que ya hemos establecido un color de fondo para el menú móvil.
  • Escalar la primera sección.

De manera rápida, revisemos los estilos correspondientes:

1
.scroll .page-header {
2
  background: var(--red);
3
}
4
5
.scroll .hero {
6
  transform: scale(0.98);
7
}
8
9
.page-header {
10
  transition: background 0.5s ease-in-out;
11
}
12
13
.hero {
14
  transition: transform 0.5s ease-in-out;
15
}
16
17
@media screen and (max-width: 991px) {
18
  .page-header {
19
    background: var(--red);
20
  }
21
}

Y aquí está el código JavaScript que se requiere:

1
const $body = $("body");
2
const $header = $(".page-header");
3
const scrollClass = "scroll";
4
5
$(window).on("scroll", () => {
6
  if (this.matchMedia("(min-width: 992px)").matches) {
7
    const scrollY = $(this).scrollTop();
8
    scrollY > 0
9
      ? $body.addClass(scrollClass)
10
      : $body.removeClass(scrollClass);
11
  } else {
12
    $body.removeClass(scrollClass);
13
  }
14
});

Activando Scrollspy de Bootstrap

Como siguiente paso, queremos que el enlace del menú activo se actualice de manera automática, dependiendo de la posición de desplazamiento.

Para hacer esto, aprovecharemos el plugin (o complemento) Scrollspy de Bootstrap.

Siguiendo la documentación, para activar el comportamiento scrollspy en los elementos de navegación, tendremos que ajustar el elemento body. De manera más específica:

  • Dale position:relative
  • Añade data-spy="scroll"
  • Agrega data-target="#navbar" donde #navbar es la ID de nuestro elemento navbar. Dentro de ese elemento están los enlaces del menú que deben recibir la clase active de Scrollspy.
  • Agrega data-offset="72" donde 72 es la altura de la cabecera en pantallas de escritorio así como la altura de la cabecera móvil cuando se cierra el menú. Esta opción determina el enlace del menú que se activará en cuanto su sección correspondiente esté a 72 píxeles de la parte superior de la ventana gráfica.

Aquí están los cambios que se requieren en la estructura de la página:

1
<body data-spy="scroll" data-target="#navbar" data-offset="72" position-relative>
2
  ...
3
  <nav id="navbar" class="navbar navbar-expand-lg navbar-dark">
4
    ...
5
  </nav>
6
  ...
7
</body>

Algo que hay que tener en cuenta es que las cosas se complican cuando se requieren compensaciones responsivas. Es decir, cuando la cabecera tiene una altura diferente dependiendo de la pantalla (debido al tamaño de la fuente). En este caso, dar un valor estático al atributo data-offset no funcionará e inicializar el complemento a través de JavaScript (junto con algún código personalizado) es la única opción. Aclarado el punto, esto está más allá del alcance de nuestro tutorial en este momento.

Añade el desplazamiento suave al logotipo y a los enlaces del menú

Por último, cada vez que hagamos clic en el logotipo o en un enlace del menú, el navegador debe desplazarse suavemente a la sección correspondiente.

Gracias al método animate de jQuery, podemos lograr fácilmente esta funcionalidad. Aquí está el código JavaScript que se requiere:

1
$(".page-header .nav-link, .navbar-brand").on("click", function(e) {
2
  e.preventDefault();
3
  const href = $(this).attr("href");
4
  $("html, body").animate({
5
    scrollTop: $(href).offset().top - 71
6
  }, 600);
7
});

Observa el número 71 dentro del código. Este número se obtiene restándole 1 a 72 (recuerda que esa es la altura de la cabecera).

Mi intento inicial fue poner el número 72 dentro del código anterior. No obstante, encontré un problema en algunos navegadores (por ejemplo, en Firefox y Chrome sí funcionó). De manera específica, cada vez que se hacía clic en un enlace del menú del encabezado, ese enlace no recibía inmediatamente la clase active esperada (que proviene del componente Scrollspy). Eso funcionó tan pronto como me desplacé hacia abajo aproximadamente un píxel. Frente a esa situación, una solución simple fue restarle uno al número inicial.

Conclusión

¡Eso es todo, amigos! Este ha sido un largo viaje, esperemos que haya valido la pena el esfuerzo. Realmente espero que este ejercicio te haya dado suficiente conocimiento e inspiración para crear impresionantes páginas de aterrizaje con Bootstrap 4. No olvides revisar la versión a pantalla completa y asegurarte de que concuerde con tu trabajo.

Con respecto a esta demostración, un siguiente paso podría ser volverla dinámica conectándola a un lenguaje del lado del servidor. Por ejemplo, sería genial crear un tema de WordPress basado en este diseño.

¡Muchas gracias por leer!

Más recursos para páginas de aterrizaje en HTML