399 lines
8.1 KiB
JavaScript
399 lines
8.1 KiB
JavaScript
|
/*
|
||
|
|
||
|
*/
|
||
|
|
||
|
(function($) {
|
||
|
|
||
|
var $window = $(window),
|
||
|
$body = $('body'),
|
||
|
$wrapper = $('#wrapper'),
|
||
|
$header = $('#header'),
|
||
|
$footer = $('#footer'),
|
||
|
$main = $('#main'),
|
||
|
$main_articles = $main.children('article');
|
||
|
|
||
|
// Breakpoints.
|
||
|
breakpoints({
|
||
|
xlarge: [ '1281px', '1680px' ],
|
||
|
large: [ '981px', '1280px' ],
|
||
|
medium: [ '737px', '980px' ],
|
||
|
small: [ '481px', '736px' ],
|
||
|
xsmall: [ '361px', '480px' ],
|
||
|
xxsmall: [ null, '360px' ]
|
||
|
});
|
||
|
|
||
|
// Play initial animations on page load.
|
||
|
$window.on('load', function() {
|
||
|
window.setTimeout(function() {
|
||
|
$body.removeClass('is-preload');
|
||
|
}, 100);
|
||
|
});
|
||
|
|
||
|
// Fix: Flexbox min-height bug on IE.
|
||
|
if (browser.name == 'ie') {
|
||
|
|
||
|
var flexboxFixTimeoutId;
|
||
|
|
||
|
$window.on('resize.flexbox-fix', function() {
|
||
|
|
||
|
clearTimeout(flexboxFixTimeoutId);
|
||
|
|
||
|
flexboxFixTimeoutId = setTimeout(function() {
|
||
|
|
||
|
if ($wrapper.prop('scrollHeight') > $window.height())
|
||
|
$wrapper.css('height', 'auto');
|
||
|
else
|
||
|
$wrapper.css('height', '100vh');
|
||
|
|
||
|
}, 250);
|
||
|
|
||
|
}).triggerHandler('resize.flexbox-fix');
|
||
|
|
||
|
}
|
||
|
|
||
|
// Nav.
|
||
|
var $nav = $header.children('nav'),
|
||
|
$nav_li = $nav.find('li');
|
||
|
|
||
|
// Add "middle" alignment classes if we're dealing with an even number of items.
|
||
|
if ($nav_li.length % 2 == 0) {
|
||
|
|
||
|
$nav.addClass('use-middle');
|
||
|
$nav_li.eq( ($nav_li.length / 2) ).addClass('is-middle');
|
||
|
|
||
|
}
|
||
|
|
||
|
// Main.
|
||
|
var delay = 325,
|
||
|
locked = false;
|
||
|
|
||
|
// Methods.
|
||
|
$main._show = function(id, initial) {
|
||
|
|
||
|
var $article = $main_articles.filter('#' + id);
|
||
|
|
||
|
// No such article? Bail.
|
||
|
if ($article.length == 0)
|
||
|
return;
|
||
|
|
||
|
// Handle lock.
|
||
|
|
||
|
// Already locked? Speed through "show" steps w/o delays.
|
||
|
if (locked || (typeof initial != 'undefined' && initial === true)) {
|
||
|
|
||
|
// Mark as switching.
|
||
|
$body.addClass('is-switching');
|
||
|
|
||
|
// Mark as visible.
|
||
|
$body.addClass('is-article-visible');
|
||
|
|
||
|
// Deactivate all articles (just in case one's already active).
|
||
|
$main_articles.removeClass('active');
|
||
|
|
||
|
// Hide header, footer.
|
||
|
$header.hide();
|
||
|
$footer.hide();
|
||
|
|
||
|
// Show main, article.
|
||
|
$main.show();
|
||
|
$article.show();
|
||
|
|
||
|
// Activate article.
|
||
|
$article.addClass('active');
|
||
|
|
||
|
// Unlock.
|
||
|
locked = false;
|
||
|
|
||
|
// Unmark as switching.
|
||
|
setTimeout(function() {
|
||
|
$body.removeClass('is-switching');
|
||
|
}, (initial ? 1000 : 0));
|
||
|
|
||
|
return;
|
||
|
|
||
|
}
|
||
|
|
||
|
// Lock.
|
||
|
locked = true;
|
||
|
|
||
|
// Article already visible? Just swap articles.
|
||
|
if ($body.hasClass('is-article-visible')) {
|
||
|
|
||
|
// Deactivate current article.
|
||
|
var $currentArticle = $main_articles.filter('.active');
|
||
|
|
||
|
$currentArticle.removeClass('active');
|
||
|
|
||
|
// Show article.
|
||
|
setTimeout(function() {
|
||
|
|
||
|
// Hide current article.
|
||
|
$currentArticle.hide();
|
||
|
|
||
|
// Show article.
|
||
|
$article.show();
|
||
|
|
||
|
// Activate article.
|
||
|
setTimeout(function() {
|
||
|
|
||
|
$article.addClass('active');
|
||
|
|
||
|
// Window stuff.
|
||
|
$window
|
||
|
.scrollTop(0)
|
||
|
.triggerHandler('resize.flexbox-fix');
|
||
|
|
||
|
// Unlock.
|
||
|
setTimeout(function() {
|
||
|
locked = false;
|
||
|
}, delay);
|
||
|
|
||
|
}, 25);
|
||
|
|
||
|
}, delay);
|
||
|
|
||
|
}
|
||
|
|
||
|
// Otherwise, handle as normal.
|
||
|
else {
|
||
|
|
||
|
// Mark as visible.
|
||
|
$body
|
||
|
.addClass('is-article-visible');
|
||
|
|
||
|
// Show article.
|
||
|
setTimeout(function() {
|
||
|
|
||
|
// Hide header, footer.
|
||
|
$header.hide();
|
||
|
$footer.hide();
|
||
|
|
||
|
// Show main, article.
|
||
|
$main.show();
|
||
|
$article.show();
|
||
|
|
||
|
// Activate article.
|
||
|
setTimeout(function() {
|
||
|
|
||
|
$article.addClass('active');
|
||
|
|
||
|
// Window stuff.
|
||
|
$window
|
||
|
.scrollTop(0)
|
||
|
.triggerHandler('resize.flexbox-fix');
|
||
|
|
||
|
// Unlock.
|
||
|
setTimeout(function() {
|
||
|
locked = false;
|
||
|
}, delay);
|
||
|
|
||
|
}, 25);
|
||
|
|
||
|
}, delay);
|
||
|
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
$main._hide = function(addState) {
|
||
|
|
||
|
var $article = $main_articles.filter('.active');
|
||
|
|
||
|
// Article not visible? Bail.
|
||
|
if (!$body.hasClass('is-article-visible'))
|
||
|
return;
|
||
|
|
||
|
// Add state?
|
||
|
if (typeof addState != 'undefined'
|
||
|
&& addState === true)
|
||
|
history.pushState(null, null, '#');
|
||
|
|
||
|
// Handle lock.
|
||
|
|
||
|
// Already locked? Speed through "hide" steps w/o delays.
|
||
|
if (locked) {
|
||
|
|
||
|
// Mark as switching.
|
||
|
$body.addClass('is-switching');
|
||
|
|
||
|
// Deactivate article.
|
||
|
$article.removeClass('active');
|
||
|
|
||
|
// Hide article, main.
|
||
|
$article.hide();
|
||
|
$main.hide();
|
||
|
|
||
|
// Show footer, header.
|
||
|
$footer.show();
|
||
|
$header.show();
|
||
|
|
||
|
// Unmark as visible.
|
||
|
$body.removeClass('is-article-visible');
|
||
|
|
||
|
// Unlock.
|
||
|
locked = false;
|
||
|
|
||
|
// Unmark as switching.
|
||
|
$body.removeClass('is-switching');
|
||
|
|
||
|
// Window stuff.
|
||
|
$window
|
||
|
.scrollTop(0)
|
||
|
.triggerHandler('resize.flexbox-fix');
|
||
|
|
||
|
return;
|
||
|
|
||
|
}
|
||
|
|
||
|
// Lock.
|
||
|
locked = true;
|
||
|
|
||
|
// Deactivate article.
|
||
|
$article.removeClass('active');
|
||
|
|
||
|
// Hide article.
|
||
|
setTimeout(function() {
|
||
|
|
||
|
// Hide article, main.
|
||
|
$article.hide();
|
||
|
$main.hide();
|
||
|
|
||
|
// Show footer, header.
|
||
|
$footer.show();
|
||
|
$header.show();
|
||
|
|
||
|
// Unmark as visible.
|
||
|
setTimeout(function() {
|
||
|
|
||
|
$body.removeClass('is-article-visible');
|
||
|
|
||
|
// Window stuff.
|
||
|
$window
|
||
|
.scrollTop(0)
|
||
|
.triggerHandler('resize.flexbox-fix');
|
||
|
|
||
|
// Unlock.
|
||
|
setTimeout(function() {
|
||
|
locked = false;
|
||
|
}, delay);
|
||
|
|
||
|
}, 25);
|
||
|
|
||
|
}, delay);
|
||
|
|
||
|
|
||
|
};
|
||
|
|
||
|
// Articles.
|
||
|
$main_articles.each(function() {
|
||
|
|
||
|
var $this = $(this);
|
||
|
|
||
|
// Close.
|
||
|
$('<div class="close">Close</div>')
|
||
|
.appendTo($this)
|
||
|
.on('click', function() {
|
||
|
location.hash = '';
|
||
|
});
|
||
|
|
||
|
// Prevent clicks from inside article from bubbling.
|
||
|
$this.on('click', function(event) {
|
||
|
event.stopPropagation();
|
||
|
});
|
||
|
|
||
|
});
|
||
|
|
||
|
// Events.
|
||
|
$body.on('click', function(event) {
|
||
|
|
||
|
// Article visible? Hide.
|
||
|
if ($body.hasClass('is-article-visible'))
|
||
|
$main._hide(true);
|
||
|
|
||
|
});
|
||
|
|
||
|
$window.on('keyup', function(event) {
|
||
|
|
||
|
switch (event.keyCode) {
|
||
|
|
||
|
case 27:
|
||
|
|
||
|
// Article visible? Hide.
|
||
|
if ($body.hasClass('is-article-visible'))
|
||
|
$main._hide(true);
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
$window.on('hashchange', function(event) {
|
||
|
|
||
|
// Empty hash?
|
||
|
if (location.hash == ''
|
||
|
|| location.hash == '#') {
|
||
|
|
||
|
// Prevent default.
|
||
|
event.preventDefault();
|
||
|
event.stopPropagation();
|
||
|
|
||
|
// Hide.
|
||
|
$main._hide();
|
||
|
|
||
|
}
|
||
|
|
||
|
// Otherwise, check for a matching article.
|
||
|
else if ($main_articles.filter(location.hash).length > 0) {
|
||
|
|
||
|
// Prevent default.
|
||
|
event.preventDefault();
|
||
|
event.stopPropagation();
|
||
|
|
||
|
// Show article.
|
||
|
$main._show(location.hash.substr(1));
|
||
|
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
// Scroll restoration.
|
||
|
// This prevents the page from scrolling back to the top on a hashchange.
|
||
|
if ('scrollRestoration' in history)
|
||
|
history.scrollRestoration = 'manual';
|
||
|
else {
|
||
|
|
||
|
var oldScrollPos = 0,
|
||
|
scrollPos = 0,
|
||
|
$htmlbody = $('html,body');
|
||
|
|
||
|
$window
|
||
|
.on('scroll', function() {
|
||
|
|
||
|
oldScrollPos = scrollPos;
|
||
|
scrollPos = $htmlbody.scrollTop();
|
||
|
|
||
|
})
|
||
|
.on('hashchange', function() {
|
||
|
$window.scrollTop(oldScrollPos);
|
||
|
});
|
||
|
|
||
|
}
|
||
|
|
||
|
// Initialize.
|
||
|
|
||
|
// Hide main, articles.
|
||
|
$main.hide();
|
||
|
$main_articles.hide();
|
||
|
|
||
|
// Initial article.
|
||
|
if (location.hash != ''
|
||
|
&& location.hash != '#')
|
||
|
$window.on('load', function() {
|
||
|
$main._show(location.hash.substr(1), true);
|
||
|
});
|
||
|
|
||
|
})(jQuery);
|