123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- /*
- Dimension by HTML5 UP
- html5up.net | @ajlkn
- Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
- */
- (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);
|