This repository has been archived by the owner on Mar 21, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 54
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added footer navigation and cleaned up a bit
- Loading branch information
Cam
committed
Aug 30, 2013
1 parent
76fbf54
commit 21e7222
Showing
9 changed files
with
548 additions
and
250 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,300 @@ | ||
/*jslint unparam: true, browser: true, indent: 2 */ | ||
|
||
;(function ($, window, document, undefined) { | ||
'use strict'; | ||
|
||
Foundation.libs.topbar = { | ||
name : 'topbar', | ||
|
||
version : '4.3.0', | ||
|
||
settings : { | ||
index : 0, | ||
stickyClass : 'sticky', | ||
custom_back_text: true, | ||
back_text: 'Back', | ||
is_hover: true, | ||
mobile_show_parent_link: true, | ||
scrolltop : true, // jump to top when sticky nav menu toggle is clicked | ||
init : false | ||
}, | ||
|
||
init : function (section, method, options) { | ||
Foundation.inherit(this, 'data_options'); | ||
var self = this; | ||
|
||
if (typeof method === 'object') { | ||
$.extend(true, this.settings, method); | ||
} else if (typeof options !== 'undefined') { | ||
$.extend(true, this.settings, options); | ||
} | ||
|
||
if (typeof method !== 'string') { | ||
|
||
$('.top-bar, [data-topbar]').each(function () { | ||
$.extend(true, self.settings, self.data_options($(this))); | ||
self.settings.$w = $(window); | ||
self.settings.$topbar = $(this); | ||
self.settings.$section = self.settings.$topbar.find('section'); | ||
self.settings.$titlebar = self.settings.$topbar.children('ul').first(); | ||
self.settings.$topbar.data('index', 0); | ||
|
||
var breakpoint = $("<div class='top-bar-js-breakpoint'/>").insertAfter(self.settings.$topbar); | ||
self.settings.breakPoint = breakpoint.width(); | ||
breakpoint.remove(); | ||
|
||
self.assemble(); | ||
|
||
if (self.settings.is_hover) { | ||
self.settings.$topbar.find('.has-dropdown').addClass('not-click'); | ||
} | ||
|
||
if (self.settings.$topbar.parent().hasClass('fixed')) { | ||
$('body').css('padding-top', self.outerHeight(self.settings.$topbar)); | ||
} | ||
}); | ||
|
||
if (!self.settings.init) { | ||
this.events(); | ||
} | ||
|
||
return this.settings.init; | ||
} else { | ||
// fire method | ||
return this[method].call(this, options); | ||
} | ||
}, | ||
|
||
timer : null, | ||
|
||
events : function () { | ||
var self = this; | ||
var offst = this.outerHeight($('.top-bar, [data-topbar]')); | ||
$(this.scope) | ||
.off('.fndtn.topbar') | ||
.on('click.fndtn.topbar', '.top-bar .toggle-topbar, [data-topbar] .toggle-topbar', function (e) { | ||
var topbar = $(this).closest('.top-bar, [data-topbar]'), | ||
section = topbar.find('section, .section'), | ||
titlebar = topbar.children('ul').first(); | ||
|
||
e.preventDefault(); | ||
|
||
if (self.breakpoint()) { | ||
if (!self.rtl) { | ||
section.css({left: '0%'}); | ||
section.find('>.name').css({left: '100%'}); | ||
} else { | ||
section.css({right: '0%'}); | ||
section.find('>.name').css({right: '100%'}); | ||
} | ||
|
||
section.find('li.moved').removeClass('moved'); | ||
topbar.data('index', 0); | ||
|
||
topbar | ||
.toggleClass('expanded') | ||
.css('height', ''); | ||
} | ||
|
||
if (!topbar.hasClass('expanded')) { | ||
if (topbar.hasClass('fixed')) { | ||
topbar.parent().addClass('fixed'); | ||
topbar.removeClass('fixed'); | ||
$('body').css('padding-top',offst); | ||
} | ||
} else if (topbar.parent().hasClass('fixed')) { | ||
topbar.parent().removeClass('fixed'); | ||
topbar.addClass('fixed'); | ||
$('body').css('padding-top','0'); | ||
|
||
if (self.settings.scrolltop) { | ||
window.scrollTo(0,0); | ||
} | ||
} | ||
}) | ||
|
||
.on('click.fndtn.topbar', '.top-bar li.has-dropdown', function (e) { | ||
if (self.breakpoint()) return; | ||
|
||
var li = $(this), | ||
target = $(e.target), | ||
topbar = li.closest('[data-topbar], .top-bar'), | ||
is_hover = topbar.data('topbar'); | ||
|
||
if (self.settings.is_hover && !Modernizr.touch) return; | ||
|
||
e.stopImmediatePropagation(); | ||
|
||
if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) { | ||
e.preventDefault(); | ||
} | ||
|
||
if (li.hasClass('hover')) { | ||
li | ||
.removeClass('hover') | ||
.find('li') | ||
.removeClass('hover'); | ||
} else { | ||
li.addClass('hover'); | ||
} | ||
}) | ||
|
||
.on('click.fndtn.topbar', '.top-bar .has-dropdown>a, [data-topbar] .has-dropdown>a', function (e) { | ||
if (self.breakpoint()) { | ||
e.preventDefault(); | ||
|
||
var $this = $(this), | ||
topbar = $this.closest('.top-bar, [data-topbar]'), | ||
section = topbar.find('section, .section'), | ||
titlebar = topbar.children('ul').first(), | ||
dropdownHeight = $this.next('.dropdown').outerHeight(), | ||
$selectedLi = $this.closest('li'); | ||
|
||
topbar.data('index', topbar.data('index') + 1); | ||
$selectedLi.addClass('moved'); | ||
|
||
if (!self.rtl) { | ||
section.css({left: -(100 * topbar.data('index')) + '%'}); | ||
section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); | ||
} else { | ||
section.css({right: -(100 * topbar.data('index')) + '%'}); | ||
section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); | ||
} | ||
|
||
topbar.css('height', self.outerHeight($this.siblings('ul'), true) + self.height(titlebar)); | ||
} | ||
}); | ||
|
||
$(window).on('resize.fndtn.topbar', function () { | ||
if (!self.breakpoint()) { | ||
$('.top-bar, [data-topbar]') | ||
.css('height', '') | ||
.removeClass('expanded') | ||
.find('li') | ||
.removeClass('hover'); | ||
} | ||
}.bind(this)); | ||
|
||
$('body').on('click.fndtn.topbar', function (e) { | ||
var parent = $(e.target).closest('[data-topbar], .top-bar'); | ||
|
||
if (parent.length > 0) { | ||
return; | ||
} | ||
|
||
$('.top-bar li, [data-topbar] li').removeClass('hover'); | ||
}); | ||
|
||
// Go up a level on Click | ||
$(this.scope).on('click.fndtn', '.top-bar .has-dropdown .back, [data-topbar] .has-dropdown .back', function (e) { | ||
e.preventDefault(); | ||
|
||
var $this = $(this), | ||
topbar = $this.closest('.top-bar, [data-topbar]'), | ||
titlebar = topbar.children('ul').first(), | ||
section = topbar.find('section, .section'), | ||
$movedLi = $this.closest('li.moved'), | ||
$previousLevelUl = $movedLi.parent(); | ||
|
||
topbar.data('index', topbar.data('index') - 1); | ||
|
||
if (!self.rtl) { | ||
section.css({left: -(100 * topbar.data('index')) + '%'}); | ||
section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); | ||
} else { | ||
section.css({right: -(100 * topbar.data('index')) + '%'}); | ||
section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); | ||
} | ||
|
||
if (topbar.data('index') === 0) { | ||
topbar.css('height', ''); | ||
} else { | ||
topbar.css('height', self.outerHeight($previousLevelUl, true) + self.height(titlebar)); | ||
} | ||
|
||
setTimeout(function () { | ||
$movedLi.removeClass('moved'); | ||
}, 300); | ||
}); | ||
}, | ||
|
||
breakpoint : function () { | ||
return $(document).width() <= this.settings.breakPoint || $('html').hasClass('lt-ie9'); | ||
}, | ||
|
||
assemble : function () { | ||
var self = this; | ||
// Pull element out of the DOM for manipulation | ||
this.settings.$section.detach(); | ||
|
||
this.settings.$section.find('.has-dropdown>a').each(function () { | ||
var $link = $(this), | ||
$dropdown = $link.siblings('.dropdown'), | ||
url = $link.attr('href'); | ||
|
||
if (self.settings.mobile_show_parent_link && url && url.length > 1) { | ||
var $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li><li><a class="parent-link js-generated" href="' + url + '">' + $link.text() +'</a></li>'); | ||
} else { | ||
var $titleLi = $('<li class="title back js-generated"><h5><a href="#"></a></h5></li>'); | ||
} | ||
|
||
// Copy link to subnav | ||
if (self.settings.custom_back_text == true) { | ||
$titleLi.find('h5>a').html('« ' + self.settings.back_text); | ||
} else { | ||
$titleLi.find('h5>a').html('« ' + $link.html()); | ||
} | ||
$dropdown.prepend($titleLi); | ||
}); | ||
|
||
// Put element back in the DOM | ||
this.settings.$section.appendTo(this.settings.$topbar); | ||
|
||
// check for sticky | ||
this.sticky(); | ||
}, | ||
|
||
height : function (ul) { | ||
var total = 0, | ||
self = this; | ||
|
||
ul.find('> li').each(function () { total += self.outerHeight($(this), true); }); | ||
|
||
return total; | ||
}, | ||
|
||
sticky : function () { | ||
var klass = '.' + this.settings.stickyClass; | ||
if ($(klass).length > 0) { | ||
var distance = $(klass).length ? $(klass).offset().top: 0, | ||
$window = $(window), | ||
offst = this.outerHeight($('.top-bar')), | ||
t_top; | ||
|
||
//Whe resize elements of the page on windows resize. Must recalculate distance | ||
$(window).resize(function() { | ||
clearTimeout(t_top); | ||
t_top = setTimeout (function() { | ||
distance = $(klass).offset().top; | ||
},105); | ||
}); | ||
$window.scroll(function() { | ||
if ($window.scrollTop() > (distance)) { | ||
$(klass).addClass("fixed"); | ||
$('body').css('padding-top',offst); | ||
} else if ($window.scrollTop() <= distance) { | ||
$(klass).removeClass("fixed"); | ||
$('body').css('padding-top','0'); | ||
} | ||
}); | ||
} | ||
}, | ||
|
||
off : function () { | ||
$(this.scope).off('.fndtn.topbar'); | ||
$(window).off('.fndtn.topbar'); | ||
}, | ||
|
||
reflow : function () {} | ||
}; | ||
}(Foundation.zj, this, this.document)); |
Oops, something went wrong.