Skip to content

Instantly share code, notes, and snippets.

@CodeMyUI
Created October 24, 2016 04:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save CodeMyUI/37a6433b0dc83c92481f9eb9cefc88eb to your computer and use it in GitHub Desktop.
Save CodeMyUI/37a6433b0dc83c92481f9eb9cefc88eb to your computer and use it in GitHub Desktop.
Navbar Transition on Scroll
// available colors: primary | secondary | white | ghost
- var navStartColor = 'ghost'
- var navIntoColor = 'secondary'
// available sizes: xl | lg | md | sm
- var navStartSize = 'xl'
- var navIntoSize = 'md'
// the bootstrap navbar
nav.navbar.navbar-fixed-top(
class=('navbar--color--#{navStartColor}')
class=('navbar--size--#{navStartSize}')
data-startColor=('navbar--color--#{navStartColor}')
data-startSize=('navbar--size--#{navStartSize}')
data-intoColor=('navbar--color--#{navIntoColor}')
data-intoSize=('navbar--size--#{navIntoSize}')
)
.container
.navbar-header
button.navbar-toggle.collapsed(
type='button',
data-toggle='collapse',
data-target='#mobileNav',
aria-expanded='false'
)
span.sr-only Toggle navigation
span.icon-bar
span.icon-bar
span.icon-bar
a.navbar-brand(href='#') ElasticNav.
#mobileNav.collapse.navbar-collapse
p.navbar-right.navbar-text Scroll down to trigger the nav transition.
// some content to allow scrolling :)
.hero
.overlay
.main-content
- var i = 0
while i < 9
section
.container
h2 Your journey starts here.
p This is it. You've made it so far. There is no going back.
p Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dicta iste molestias vel commodi, quae quaerat ex numquam. Consectetur corporis explicabo, qui labore, repellat dignissimos illo molestias maxime nisi a consequuntur?
p Lorem ipsum dolor sit amet, consectetur adipisicing elit. Impedit fuga autem dolore, ex nobis, iste quasi, asperiores esse repellendus tempore, obcaecati numquam minima maxime! Laboriosam, ut ipsam magnam corporis aut.
h3 Get lost and find yourself.
p Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sequi placeat dolor molestias facere veritatis culpa amet fugiat debitis dolorem qui quidem consequuntur mollitia, nesciunt pariatur voluptatum! Dolor accusamus labore, sequi.
- i++

Navbar Transition on Scroll

A simple experiment to transition a sticky navbar from a Start color / size into another color / size.

The navbar has some data attributes in HTML. These are used to add / remove CSS classes to create the CSS transition on scroll.

The scroll event listener is only firing every 100ms (via a setInterval) and only triggers the classes toggle if it actually needs to.

I am pretty sure there are more performant ways of doing this - but as a proof of concept for a modular approach, this is pretty neat! :)

A Pen by Simon Vrachliotis on CodePen.

License.

// grabbing the class names from the data attributes
const navBar = $('.navbar'),
data = navBar.data();
// booleans used to tame the scroll event listening a little..
let scrolling = false,
scrolledPast = false;
// transition Into
function switchInto() {
// update `scrolledPast` bool
scrolledPast = true;
// add/remove CSS classes
navBar.removeClass(data.startcolor);
navBar.removeClass(data.startsize);
navBar.addClass(data.intocolor);
navBar.addClass(data.intosize);
console.log('into transition triggered!')
};
// transition Start
function switchStart() {
// update `scrolledPast` bool
scrolledPast = false;
// add/remove CSS classes
navBar.addClass(data.startcolor);
navBar.addClass(data.startsize);
navBar.removeClass(data.intocolor);
navBar.removeClass(data.intosize);
console.log('start transition triggered!')
}
// set `scrolling` to true when user scrolls
$(window).scroll(() => scrolling = true);
setInterval(() => {
// when `scrolling` becomes true...
if(scrolling) {
// set it back to false
scrolling = false;
// check scroll position
if ($(window).scrollTop() > 100) {
// user has scrolled > 100px from top since last check
if ( !scrolledPast ) {
switchInto();
}
} else {
// user has scrolled back <= 100px from top since last check
if ( scrolledPast ) {
switchStart();
}
}
}
// take a breath.. hold event listener from firing for 100ms
}, 100);
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js"></script>
// variables
$primary = #37ca7e
$secondary = #43a6dd
$transitionSpeed = 0.4s
// Lato font
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,900);
// basic styles
body
font-family 'Lato', Arial, sans-serif
color #6b6b6b
font-size 17px
line-height 1.6
.hero
position relative
height 60vh
z-index -2
background url('https://unsplash.it/2000/800?image=563') center top / cover no-repeat
.overlay
position absolute
z-index -1
top 0
left 0
height 100%
width 100%
background rgba(#000, 0.6)
.main-content
background #f2f2f2
section
background white
padding 4rem 0 7rem
// zebra striping the sections
&:nth-child(even)
background darken(white, 4)
h2, h3
padding 2rem 0 .75rem
font-weight 700
color #4b4b4b
/* ===================================== */
/* ===== THE INTERESTING STUFF NOW ===== */
/* ===================================== */
.navbar
border none
transition $transitionSpeed
&-brand
font-size 2.25rem
font-weight 900
color #4b4b4b
/* --- navbar sizes --- */
&--size
&--xl
padding 4rem 0
&--lg
padding 2rem 0
&--md
padding 1rem 0
&--sm
padding 0
/* --- navbar colors --- */
&--color
&--white
background white
&--primary
background $primary
&--secondary
background $secondary
&--ghost
background rgba(0,0,0,0.2)
.navbar-brand,
.navbar-text,
a
color white
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment