Sticky header, o cabecera fija al hacer scroll con jQuery y CSS

Hay muchas veces en las que parece que nos gusta complicarnos la vida. Una de ellas puede ser el momento en el que queremos dejar nuestra cabecera superior fija mientras se hace scroll vertical. Hay muchas ocasiones en las que las librerías y scripts que encontramos, sobrepasan con creces lo que necesitamos. Esto puede llevarnos en más de una ocasión a sobrecargar la maquetación y penalizar el rendimiento.

Hoy os traigo una solución sencillísima a este reto. Simplemente agregamos una clase mediante jQuery en el momento de hacer scroll, y es precisamente esta clase, en el ejemplo “sticky“, la que después usamos para dejar fija nuestra cabecera. Básicamente lo que hacemos es decir – “Cuando el usuario haga scroll, fija esta cabecera arriba“.

Veamos el marcado:

<header id="main-header">
  <nav role='navigation'>
    <ul id="main-nav">
      <li><a href="#">Home</a></li>
      <li><a href="#">About</a></li>
      <li><a href="#">Clients</a></li>
      <li><a href="#">Contact Us</a></li>
    </ul>
  </nav>  
</header>
<section id="main-content">
  <p>Etiam auctor lorem eu consectetur vehicula. Etiam convallis vehicula ornare. Integer vel varius nulla. Nam tempor condimentum ex, non euismod arcu vulputate et. Integer malesuada tortor quis lectus congue tempus. Sed et dolor nulla. Etiam ac lectus tempor, dictum elit sed, vestibulum libero.

  <p>Nunc tempus dictum luctus. Curabitur ipsum dui, elementum eu ultricies quis, dapibus molestie ante. Mauris commodo dignissim est, pharetra lobortis velit aliquet eget. Praesent vel laoreet tellus. Nulla sit amet elit interdum, facilisis leo in, rutrum purus. Nam semper nisi lacus, quis consequat enim condimentum id. Mauris enim eros, euismod non mauris sed, imperdiet cursus eros. Proin purus libero, elementum eu turpis nec, molestie vehicula nisl.</p>

  <p>Vivamus sodales orci vitae semper malesuada. Vivamus eros risus, rutrum eu suscipit vitae, laoreet ut dui. Cras et tincidunt ligula, a porttitor elit. Nam sollicitudin, odio id suscipit blandit, justo ligula facilisis quam, eu egestas felis est eget leo. Donec non consequat lacus. Donec vestibulum malesuada massa eu porta. Vivamus vestibulum tortor enim, id suscipit ligula scelerisque sit amet. Quisque iaculis luctus facilisis. Aliquam sollicitudin justo nisi, pellentesque convallis nibh fermentum eget.</p>
  
  <p>Cras aliquam ex sit amet est fermentum pellentesque. Praesent semper, elit quis elementum tempor, turpis arcu tincidunt enim, in consequat nisl nulla ut neque. Vestibulum vehicula augue orci, nec faucibus est maximus egestas. In aliquam, ipsum eleifend commodo commodo, est sapien porta ex, nec dapibus nibh leo sed purus. Praesent convallis nunc libero, ac imperdiet elit dapibus ut. Fusce consectetur felis pretium nulla gravida, non vehicula nulla consequat. Ut eleifend dictum dolor, ac sollicitudin eros feugiat et.</p>
</section>

Ahora hagamos mediante jQuery, que al hacer scroll, al #main-header se le agregue la clase “sticky“:

$(window).scroll(function() {
  if ($(this).scrollTop() > 1){  
    $('#main-header').addClass("sticky");
  }
  else{
    $('#main-header').removeClass("sticky");
  }
});

Ya tenemos la magia implementada, y comprobamos que al hacer scroll, nuestra cabecera tiene la clase “sticky“. Así que es momento de armar el cañón con CSS, y disparar sin piedad:

* {
  margin: 0;
  padding: 0;
  font-family: georgia, times, serif;
}

#main-header {
  background-color: grey;
  padding: 20px;
  margin-bottom: 20px;
}

#main-nav li,
#main-nav li a {
  text-decoration: none;
  text-transform: uppercase;
  color: white;
  display: inline;
  margin: 0;
  padding: 0 10px;
}

#main-content {
  padding: 0 20px;
  max-width: 500px;
}

p { margin-bottom: 15px; }

/* Here is the simple magic */

#main-header.sticky {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  background-color: rgba(0,0,0,0.8);
}

Y listo. Aquí debajo podréis ver el ejemplo funcionando. Evidentemente, podemos llegar a complicar el scrip cuanto queramos, agregando efectos por ejemplo, pero repito que muy de vez en cuando, en la sencillez está la elegancia.

See the Pen Sticky header – CSS + jQuery by Enrique (@bosspetta) on CodePen.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>