Navegación lateral fuera de lienzo con transiciones de página

Tiempo de ejecución: 30 minutos. Empezar

Autor: Kyle Brumm
Views Total: 849
Sitio oficial: Ir a la web
Actualizado: February 7, 2018
Licencia: MIT

Vista prévia

Navegación lateral fuera de lienzo con transiciones de página

Descripción

Un moderno Sticky navegación lateral fuera de lienzo donde los usuarios son capaces de cambiar entre las secciones de página con un efecto de transición suave haciendo clic en enlaces de NAV.

Funcionamiento

Cree la navegación fuera del lienzo que contenga vínculos de anclaje que apunten a sus secciones de página:

<nav class="nav">

<ul class="nav__list">


<li class="nav__item"><a href="#">Section 1</a></li>


<li class="nav__item"><a href="#">Section 2</a></li>


<li class="nav__item"><a href="#">Section 3</a></li>


...

</ul>
</nav>

Cree un elemento de desencadenador para alternar la navegación fuera del lienzo.

<div class="nav__bar">

<a href="#" class="nav__trigger">


<div class="bars"></div>

</a>




</div>

Cree el contenido seccionado de la siguiente manera:

<main class="main">


<section class="content">



<article class="article">



<a href class="article__title">Section 1</a>



<p class="article__content">




Section 1 Content



</p>


</article>






<article class="article">



<a href class="article__title">Section 2</a>



<p class="article__content">




Section 2 Content



</p>


</article>



<article class="article">



<a href class="article__title">Section 3</a>



<p class="article__content">




Section 3 Content



</p>


</article>



...


</section>
</main>

Los estilos primarios CSS/CSS3.

*, *:before, *:after {

-webkit-box-sizing: border-box;

box-sizing: border-box;
}

html {

font-family: "Open Sans", Helvetica, arial, sans-serif;

color: #333333;

background-color: #eeeeee;
}

body.is-froze {

overflow: hidden;

width: 100vw;

height: 100vh;
}

h1, h2, h3, h4, h5, h6 { font-family: "Raleway", "Open Sans", sans-serif; }

a {

color: #333333;

text-decoration: none;
}

img { max-width: 100%; }

a {

-webkit-transition: color 0.3s ease-in-out;

transition: color 0.3s ease-in-out;
}

a:hover { color: #7d87a8; }

.main {

overflow: hidden;

position: relative;

width: 100%;

width: calc(100% - 60px);

height: 100vh;

margin-left: 60px;

background-color: #eeeeee;

-webkit-transition: 0.55s cubic-bezier(0.645, 0.045, 0.355, 1);

transition: 0.55s cubic-bezier(0.645, 0.045, 0.355, 1);

-webkit-transform: scale(1) translate3d(0, 0, 0);

transform: scale(1) translate3d(0, 0, 0);

-webkit-clip-path: inset(0 0 0 0);

clip-path: inset(0 0 0 0);

will-change: width, height, opacity, transform, clip-path;

z-index: 1;
}

.main.is-active {

overflow: hidden;

height: 100vh;

width: 100vw;

width: calc(100vw - 60px);

pointer-events: none;

opacity: 0.25;

-webkit-transform: scale(0.9) translate3d(60%, 0, 0);

transform: scale(0.9) translate3d(60%, 0, 0);
}

@media (min-width: 600px) {

.main.is-active {

-webkit-transform: scale(0.9) translate3d(40%, 0, 0);

transform: scale(0.9) translate3d(40%, 0, 0);
}
}

.main.is-transition-out {

-webkit-clip-path: inset(0 0 0 100%);

clip-path: inset(0 0 0 100%);
}

.article {

padding: 1.5rem;

position: relative;
}

@media (min-width: 600px) {

.article { padding: 6vmin; }
}

.article:not(:last-of-type):after {

content: '';

position: absolute;

bottom: 0;

left: 1.5rem;

width: 50px;

height: 2px;

background-color: #7d87a8;
}

@media (min-width: 600px) {

.article:not(:last-of-type):after { left: 6vmin; }
}

.article__title {

display: block;

position: relative;

font-family: "Raleway", "Open Sans", sans-serif;

font-size: 1.5rem;

color: #191b22;
}
@media (min-width: 600px) {

.article__title { font-size: 3vmin; }
}

.article__title:hover { color: #7d87a8; }

.article__time {

display: block;

position: relative;

text-transform: uppercase;

font-size: 0.8rem;

margin-top: 1rem;
}

@media (min-width: 600px) {

.article__time { font-size: 1.5vmin; }
}

.article__content {

margin: 1rem 0 0;

font-size: 1rem;

line-height: 1.5;
}

@media (min-width: 600px) {

.article__content { font-size: 2vmin; }
}

.nav__bar {

position: fixed;

top: 0;

bottom: 0;

left: 0;

width: 60px;

height: 100vh;

border-right: 1px solid rgba(125, 135, 168, 0.25);

background-color: #191b22;

z-index: 99;
}

.nav__trigger {

display: block;

position: absolute;

top: 50%;

left: 16px;

padding: 8px 0;

margin-top: -10px;

-webkit-transition: 0.2s ease-in-out;

transition: 0.2s ease-in-out;

z-index: 99;
}

.nav__trigger .bars { position: relative; }

.nav__trigger .bars, .nav__trigger .bars:before, .nav__trigger .bars:after {

width: 28px;

height: 4px;

background-color: #7d87a8;

-webkit-transition: 0.2s ease-in-out;

transition: 0.2s ease-in-out;

border-radius: 4px;
}

.nav__trigger .bars:before, .nav__trigger .bars:after {

content: '';

display: block;

position: absolute;

top: 0;

left: 0;

will-change: transform;
}

.nav__trigger .bars:before {

-webkit-transform: translateY(-8px);

transform: translateY(-8px);
}

.nav__trigger .bars:after {

-webkit-transform: translateY(8px);

transform: translateY(8px);
}

.nav__trigger.is-active {

-webkit-transform: rotate(-45deg);

transform: rotate(-45deg);
}

.nav__trigger.is-active .bars:before, .nav__trigger.is-active .bars:after {

-webkit-transform: translateX(0) rotate(-90deg);

transform: translateX(0) rotate(-90deg);
}

.nav {

position: fixed;

top: 0;

right: 0;

bottom: 0;

left: 0;

background-color: #191b22;

z-index: 0;
}

.nav__list {

overflow: hidden;

position: absolute;

top: 50%;

left: 0;

width: 100%;

margin: 0;

padding-left: 60px;

list-style: none;

font-family: "Raleway", "Open Sans", sans-serif;

-webkit-transform: translateY(-50%);

transform: translateY(-50%);
}

.nav__list .nav__item { padding: 0.5rem 1rem; }

@media (min-width: 600px) {

.nav__list .nav__item {

width: 33.3333333333%;

padding: 0.5rem 1rem;
}
}

.nav__list a {

display: inline-block;

color: #7d87a8;

font-size: 1rem;

line-height: 1.5;
}

.nav__list a:hover { color: #b1b7cb; }

.nav__list a.is-active { color: #d2d5e1; }
@media (min-width: 600px) {

.nav__list a { font-size: 1.5rem; }
}

Cargue el necesario classList. js y suavizar bibliotecas en el documento.

<script src='https://cdnjs.cloudflare.com/ajax/libs/classlist/2014.01.31/classList.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/iamdustan-smoothscroll/0.4.0/smoothscroll.js'></script>

El principal JavaScript para activar la navegación fuera de lienzo & efectos de transición de página suave.

let navigation = {


// Variables


$navTrigger: document.querySelector('.nav__trigger'),


$nav: document.querySelector('.nav'),


$navItems: document.querySelectorAll('.nav__item a'),


$main: document.querySelector('.main'),


transitionEnd: 'webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend',


isOpeningNav: false,



init() {




let self = this;





// Reset overflow and height on load




self.$main.style.overflow = 'auto';




self.$main.style.height = 'auto';










// Handle scroll events




window.addEventListener('scroll', (e) => {






if (window.scrollY == 0 && self.isOpeningNav) {








self.isOpeningNav = false;

















// Add a small delay








setTimeout(function() {










self.openNavigation();


















}, 150);






}




});





// Handle .nav__trigger click event




self.$navTrigger.addEventListener('click', (e) => {






e.preventDefault();













if (!self.$navTrigger.classList.contains('is-active')) {








if (window.scrollY !== 0) {










// Scroll to top










window.scroll({ top: 0, left: 0, behavior: 'smooth' });











// Enable opening nav










self.isOpeningNav = true;


















} else {










self.openNavigation();








}






} else {








self.closeNavigation();






}




});













// Handle .nav__item click events




self.$navItems.forEach((navLink) => {






navLink.addEventListener('click', function(e) {








e.preventDefault();

















// Remove is-active from all .nav__items








self.$navItems.forEach((el) => {










el.classList.remove('is-active');








});

















// Ad is-active to clicked .nav__item








this.classList.add('is-active');

















// Transition the page








self.transitionPage();






});




});


},





openNavigation() {




let self = this;





// .nav--trigger active




self.$navTrigger.classList.add('is-active');





// body froze




document.body.classList.add('is-froze');





// Remove old inline styles




if (self.$main.style.removeProperty) {






self.$main.style.removeProperty('overflow');






self.$main.style.removeProperty('height');




} else {






self.$main.style.removeAttribute('overflow');






self.$main.style.removeAttribute('height');




}





// .main active




self.$main.classList.add('is-active');


},





closeNavigation() {




let self = this;









// .nav--trigger inactive




self.$navTrigger.classList.remove('is-active');





// .main inactive




self.$main.classList.remove('is-active');




self.$main.addEventListener('transitionend', (e) => {








if (e.propertyName == 'transform' && !self.$navTrigger.classList.contains('is-active')) {








// Reset overflow and height








self.$main.style.overflow = 'auto';








self.$main.style.height = 'auto';









// body unfroze








document.body.classList.remove('is-froze');






}




});















// no-csstransitions fallback




if (document.documentElement.classList.contains('no-csstransitions')) {






// .main inactive






self.$main.classList.remove('is-active');







// body unfroze






document.body.classList.remove('is-froze');




}


},





transitionPage() {




let self = this;









// .main transitioning




self.$main.classList.add('is-transition-out');




self.$main.addEventListener('transitionend', (e) => {








if (e.propertyName == 'clip-path') {








if (self.$main.classList.contains('is-transition-in')) {










self.$main.classList.remove('is-transition-in');










self.$main.classList.remove('is-transition-out');










self.closeNavigation();








}









if (self.$main.classList.contains('is-transition-out')) {










self.$main.classList.remove('is-transition-out');





















// Add new content to .main





















setTimeout(function() {












self.$main.classList.add('is-transition-in');










}, 500);








}






}




});


}
}

navigation.init();

Te puede interesar: