Fullscreen Off-canvas Navigation with jQuery and CSS3
| File Size: | 9.07 KB |
|---|---|
| Views Total: | 4714 |
| Last Update: | |
| Publish Date: | |
| Official Website: | Go to website |
| License: | MIT |
Yet another jQuery off-canvas menu script that uses CSS/CSS3 magic to reveal a mobile-friendly, fullscreen, off-screen sidebar navigation while pushing the main content section to the outside of the viewport.
How to use it:
1. Wrap your main content into the 'main' container.
<div class="main"> ... </div>
2. Create a icon trigger to toggle the off-canvas navigation.
<a href="#navi" class="navi-trigger">
<span class="navi-icon">
<svg x="0px" y="0px" width="54px" height="54px" viewBox="0 0 54 54"></svg>
</span>
</a>
3. The Html for the navigation menu
<div id="navi" class="navi">
<div class="navigation-wrapper">
<div class="half-block">
<h2>Navigation</h2>
<nav>
<ul class="primary-navi">
<li><a href="#">Link 1</a></li>
<li><a href="#">Link 2</a></li>
<li><a href="#">Link 3</a></li>
<li><a href="#">Link 4</a></li>
</ul>
</nav>
</div>
</div>
</div>
4. The CSS styles for the 'main' container.
.main {
position: relative;
z-index: 2;
height: 100vh;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
padding: 200px 5%;
background-color: #D7DADB;
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-transition: -webkit-transform 0.7s;
-moz-transition: -moz-transform 0.7s;
transition: transform 0.7s;
-webkit-transition-timing-function: cubic-bezier(0.91, 0.01, 0.6, 0.99);
-moz-transition-timing-function: cubic-bezier(0.91, 0.01, 0.6, 0.99);
transition-timing-function: cubic-bezier(0.91, 0.01, 0.6, 0.99);
}
.navigation-is-open .main {
-webkit-transform: translateX(100%);
-moz-transform: translateX(100%);
-ms-transform: translateX(100%);
-o-transform: translateX(100%);
transform: translateX(100%);
}
5. The CSS styles for menu trigger.
.navi-trigger {
position: fixed;
z-index: 3;
left: 5%;
top: 20px;
height: 54px;
width: 54px;
background-color: #6DBCDB;
border-radius: 50%;
overflow: hidden;
text-indent: 100%;
white-space: nowrap;
-webkit-transition: -webkit-transform 0.5s;
-moz-transition: -moz-transform 0.5s;
transition: transform 0.5s;
}
.navi-trigger .navi-icon {
/* Nav icon created in CSS */
position: absolute;
left: 50%;
top: 50%;
bottom: auto;
right: auto;
-webkit-transform: translateX(-50%) translateY(-50%);
-moz-transform: translateX(-50%) translateY(-50%);
-ms-transform: translateX(-50%) translateY(-50%);
-o-transform: translateX(-50%) translateY(-50%);
transform: translateX(-50%) translateY(-50%);
width: 22px;
height: 2px;
background-color: #FFF;
}
.navi-trigger .navi-icon::before,
.navi-trigger .navi-icon:after {
content: '';
position: absolute;
top: 0;
right: 0;
width: 100%;
height: 100%;
background-color: #FFF;
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-transition: -webkit-transform 0.5s, width 0.5s, top 0.3s;
-moz-transition: -moz-transform 0.5s, width 0.5s, top 0.3s;
transition: transform 0.5s, width 0.5s, top 0.3s;
}
.navi-trigger .navi-icon::before {
-webkit-transform-origin: right top;
-moz-transform-origin: right top;
-ms-transform-origin: right top;
-o-transform-origin: right top;
transform-origin: right top;
-webkit-transform: translateY(-6px);
-moz-transform: translateY(-6px);
-ms-transform: translateY(-6px);
-o-transform: translateY(-6px);
transform: translateY(-6px);
}
.navi-trigger .navi-icon::after {
-webkit-transform-origin: right bottom;
-moz-transform-origin: right bottom;
-ms-transform-origin: right bottom;
-o-transform-origin: right bottom;
transform-origin: right bottom;
-webkit-transform: translateY(6px);
-moz-transform: translateY(6px);
-ms-transform: translateY(6px);
-o-transform: translateY(6px);
transform: translateY(6px);
}
.navi-trigger svg {
position: absolute;
top: 0;
left: 0;
}
.navigation-is-open .navi-trigger {
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
-ms-transform: rotate(180deg);
-o-transform: rotate(180deg);
transform: rotate(180deg);
}
.navigation-is-open .navi-trigger .navi-icon::after,
.navigation-is-open .navi-trigger .navi-icon::before {
/* fFrom Hamburger to Arrow */
width: 50%;
-webkit-transition: -webkit-transform 0.5s, width 0.5s;
-moz-transition: -moz-transform 0.5s, width 0.5s;
transition: transform 0.5s, width 0.5s;
}
.navigation-is-open .navi-trigger .navi-icon::before {
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
.navigation-is-open .navi-trigger .navi-icon::after {
-webkit-transform: rotate(-45deg);
-moz-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
}
6. The CSS styles for the navigation menu.
.navi {
position: fixed;
z-index: 1;
top: 0;
left: 0;
height: 100%;
width: 100%;
background-color: #6DBCDB;
visibility: hidden;
-webkit-transition: visibility 0s 0.7s;
-moz-transition: visibility 0s 0.7s;
transition: visibility 0s 0.7s;
}
.navi .navigation-wrapper {
/* Navigation content */
height: 100%;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
padding: 40px 5% 40px calc(5% + 80px);
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-transform: translateX(-50%);
-moz-transform: translateX(-50%);
-ms-transform: translateX(-50%);
-o-transform: translateX(-50%);
transform: translateX(-50%);
-webkit-transition: -webkit-transform 0.7s;
-moz-transition: -moz-transform 0.7s;
transition: transform 0.7s;
-webkit-transition-timing-function: cubic-bezier(0.86, 0.01, 0.77, 0.78);
-moz-transition-timing-function: cubic-bezier(0.86, 0.01, 0.77, 0.78);
transition-timing-function: cubic-bezier(0.86, 0.01, 0.77, 0.78);
}
.navigation-is-open .navi {
visibility: visible;
-webkit-transition: visibility 0s 0s;
-moz-transition: visibility 0s 0s;
transition: visibility 0s 0s;
}
.navigation-is-open .navi .navigation-wrapper {
-webkit-transform: translateX(0);
-moz-transform: translateX(0);
-ms-transform: translateX(0);
-o-transform: translateX(0);
transform: translateX(0);
-webkit-transition: -webkit-transform 0.5s;
-moz-transition: -moz-transform 0.5s;
transition: transform 0.5s;
-webkit-transition-timing-function: cubic-bezier(0.82, 0.01, 0.77, 0.78);
-moz-transition-timing-function: cubic-bezier(0.82, 0.01, 0.77, 0.78);
transition-timing-function: cubic-bezier(0.82, 0.01, 0.77, 0.78);
}
.navi > h2 {
position: relative;
margin-bottom: 1.7em;
font-size: 1.3rem;
font-weight: 800;
color: #2C3E50;
text-transform: uppercase;
}
.navi > h2::after {
content: '';
position: absolute;
left: 0;
bottom: -20px;
height: 1px;
width: 60px;
background-color: #2C3E50;
}
.navi .primary-navi { margin-top: 60px; }
.navi .primary-navi > li { margin: 1.6em 0; }
.navi .primary-navi a {
font-family: 'Raleway', sans-serif;
font-size: 2.4rem;
color: #D7DADB;
display: inline-block;
}
.navi .primary-navi a.selected { color: #ffffff; }
7. CSS3 media queries for mobile devices.
@media only screen and (min-width: 786px) {
.main { padding: 250px 10%; }
}
@media only screen and (min-width: 1170px) {
.navi-trigger { top: 40px; }
.navi .navigation-wrapper { padding: 62px 20%; }
.navi .navigation-wrapper::after {
clear: both;
content: "";
display: table;
}
.navi .half-block {
width: 50%;
float: left;
}
.navi .primary-navi { margin-top: 0; }
.navi h2 {
font-size: 1.5rem;
margin-bottom: 5.6em;
}
.navi .primary-navi li { margin: 2em 0; }
.navi .primary-navi a { font-size: 2.4rem; }
}
8. Add the following JavaScript snippet after jQuery library.
jQuery(document).ready(function($){
var isLateralNavAnimating = false;
//open/close lateral navigation
$('.navi-trigger').on('click', function(event){
event.preventDefault();
//stop if nav animation is running
if( !isLateralNavAnimating ) {
if($(this).parents('.csstransitions').length > 0 ) isLateralNavAnimating = true;
$('body').toggleClass('navigation-is-open');
$('.navigation-wrapper').one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(){
//animation is over
isLateralNavAnimating = false;
});
}
});
});
This awesome jQuery plugin is developed by tossedwarrior. For more Advanced Usages, please check the demo page or visit the official website.











