JSFiddle - React, Tailwind, and code Playground
Horizontal Tab Menu Layout
by Jennifer Perrin
HTML
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<nav class="nav nav--active">
<ul class="nav__list">
<li class="nav__item">
<a href="" class="nav__link">
<div class="nav__thumb color1" data-letter="a"></div>
<p class="nav__label">About</p>
</a>
</li>
<li class="nav__item">
<a href="" class="nav__link">
<div class="nav__thumb color2" data-letter="p"></div>
<p class="nav__label">Products</p>
</a>
</li>
<li class="nav__item">
<a href="" class="nav__link">
<div class="nav__thumb color3" data-letter="q"></div>
<p class="nav__label">Questions</p>
</a>
</li>
<li class="nav__item">
<a href="" class="nav__link">
<div class="nav__thumb color4" data-letter="e"></div>
<p class="nav__label">Events</p>
</a>
</li>
<li class="nav__item">
<a href="" class="nav__link">
<div class="nav__thumb color5" data-letter="s"></div>
<p class="nav__label">Sponsors</p>
</a>
</li>
<li class="nav__item">
<a href="" class="nav__link">
<div class="nav__thumb color6" data-letter="c"></div>
<p class="nav__label">Contact</p>
</a>
</li>
</ul>
<div class="burger burger--close">
<div class="burger__patty"></div>
</div>
</nav>
<div class="page">
<section class="section section--active color1" data-letter="a">
<article class="section__wrapper">
<h1 class="section__title">About us</h1>
<p>Voluptatem necessitatibus aliquid cum repellat nihil praesentium tenetur vel voluptates cumque animi accusantium, deserunt, vitae est. Quas suscipit sint quidem fuga repudiandae.</p>
</article>
</section>
<section class="section color2"...
CSS
@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700|Lato:400,300,700);
* {
box-sizing: border-box;
-webkit-tap-highlight-color: rgba(255,255,255,0);
}
body {
line-height: 1.5;
font-family: 'Open Sans';
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
color: #1a1a1a;
background: #1a1a1a;
}
a {
text-decoration: none;
color: inherit;
}
ul {
list-style-type: none;
margin: 0;
padding: 0;
}
.nav {
will-change: transform;
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1;
background: #1a1a1a;
-webkit-transform: translateY(-100%);
-ms-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: all 0.45s cubic-bezier(0.23, 1, 0.32, 1);
transition: all 0.45s cubic-bezier(0.23, 1, 0.32, 1);
}
.nav--active {
-webkit-transform: translateY(0);
-ms-transform: translateY(0);
transform: translateY(0);
}
.nav__list {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
.nav__item {
-webkit-box-flex: 1;
-webkit-flex: 1;
-ms-flex: 1;
flex: 1;
position: relative;
-webkit-transition: all 0.45s cubic-bezier(0.23, 1, 0.32, 1);
transition: all 0.45s cubic-bezier(0.23, 1, 0.32, 1);
}
.nav__item:hover {
opacity: 0.75;
}
.nav__thumb {
display: block;
height: 120px;
background: #dc143c;
-webkit-transition: all 0.45s cubic-bezier(0.23, 1, 0.32, 1);
transition: all 0.45s cubic-bezier(0.23, 1, 0.32, 1);
}
.nav__thumb:before {
content: attr(data-letter);
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
font-size: 70px;
text-transform: uppercase;
opacity: 0.15;
}
.nav__label {
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%,...
JavaScript
var Nav = (function() {
var
nav = $('.nav'),
burger = $('.burger'),
page = $('.page'),
section = $('.section'),
link = nav.find('.nav__link'),
navH = nav.innerHeight(),
isOpen = true,
hasT = false;
var toggleNav = function() {
nav.toggleClass('nav--active');
burger.toggleClass('burger--close');
shiftPage();
};
var shiftPage = function() {
if (!isOpen) {
page.css({
'transform': 'translateY(' + navH + 'px)',
'-webkit-transform': 'translateY(' + navH + 'px)'
});
isOpen = true;
} else {
page.css({
'transform': 'none',
'-webkit-transform': 'none'
});
isOpen = false;
}
};
var switchPage = function(e) {
var self = $(this);
var i = self.parents('.nav__item').index();
var s = section.eq(i);
var a = $('section.section--active');
var t = $(e.target);
if (!hasT) {
if (i == a.index()) {
return false;
}
a
.addClass('section--hidden')
.removeClass('section--active');
s.addClass('section--active');
hasT = true;
a.on('transitionend webkitTransitionend', function() {
$(this).removeClass('section--hidden');
hasT = false;
a.off('transitionend webkitTransitionend');
});
}
return false;
};
var keyNav = function(e) {
var a = $('section.section--active');
var aNext = a.next();
var aPrev = a.prev();
var i = a.index();
if (!hasT) {
if (e.keyCode === 37) {
if (aPrev.length === 0) {
aPrev = section.last();
}
hasT = true;
aPrev.addClass('section--active');
a
.addClass('section--hidden')
.removeClass('section--active');
a.on('transitionend webkitTransitionend', function() {
a.removeClass('section--hidden');
hasT = false;
a.off('transitionend...