hugo-academic-mirror/static/js/hugo-academic.js

153 lines
4.9 KiB
JavaScript

/*************************************************
* Hugo Academic: an academic theme for Hugo.
* https://github.com/gcushen/hugo-academic
**************************************************/
(function($){
/* ---------------------------------------------------------------------------
* Add smooth scrolling to all links inside the main navbar.
* --------------------------------------------------------------------------- */
$('#navbar-main li.nav-item a').on('click', function(event){
// Store requested URL hash.
var hash = this.hash;
// If we are on the homepage and the navigation bar link is to a homepage section.
if( hash && $(hash).length && ($("#homepage").length > 0)){
// Prevent default click behavior
event.preventDefault();
var navbarHeight = $('.navbar-header').innerHeight();
// Use jQuery's animate() method for smooth page scrolling.
// The numerical parameter specifies the time (ms) taken to scroll to the specified hash.
$('html, body').animate({
scrollTop: $(hash).offset().top - navbarHeight
}, 800, function () {
// Add hash (#) to URL once finished scrolling to hash position
if (hash == "#top"){
window.location.hash = ""
}else {
window.location.hash = hash;
}
});
}
});
/* ---------------------------------------------------------------------------
* Smooth scrolling for Back To Top link.
* --------------------------------------------------------------------------- */
$('#back_to_top').on('click', function(event){
event.preventDefault();
$('html, body').animate({
'scrollTop': 0
}, 800, function(){
window.location.hash = ""
});
});
/* ---------------------------------------------------------------------------
* Smooth scrolling for mouse wheel.
* --------------------------------------------------------------------------- */
function smoothScroll(scrollTime, scrollDistance){
if (navigator.userAgent.indexOf('Mac') != -1 || navigator.userAgent.indexOf('Firefox') > -1 || jQuery('body').hasClass('is-horizontal')){
return;
}
jQuery(window).on("mousewheel DOMMouseScroll", function(event){
event.preventDefault();
var delta = event.originalEvent.wheelDelta/120 || -event.originalEvent.detail/3;
var scrollTop = jQuery(window).scrollTop();
var finalScroll = scrollTop - parseInt(delta*scrollDistance);
TweenMax.to(jQuery(window), scrollTime, {
scrollTo : { y: finalScroll, autoKill:true },
ease: Expo.easeOut,
autoKill: true,
overwrite: 5
});
});
}
/* ---------------------------------------------------------------------------
* Hide mobile collapsable menu on clicking a link.
* --------------------------------------------------------------------------- */
$(document).on('click','.navbar-collapse.in',function(e){
if( $(e.target).is('a') && $(e.target).attr('class') != 'dropdown-toggle' ){
$(this).collapse('hide');
}
});
/* ---------------------------------------------------------------------------
* Filter projects.
* --------------------------------------------------------------------------- */
var $container = $('#container-projects');
$container.imagesLoaded(function () {
// Initialize Isotope after all images have loaded.
$container.isotope({
itemSelector: '.isotope-item',
layoutMode: 'masonry'
});
// Filter items when filter link is clicked.
$('#filters a').click(function () {
var selector = $(this).attr('data-filter');
$container.isotope({filter: selector});
$(this).removeClass('active').addClass('active').siblings().removeClass('active all');
return false;
});
});
/* ---------------------------------------------------------------------------
* On window load.
* --------------------------------------------------------------------------- */
$(window).load(function(){
// Enable smooth scrolling with mouse wheel
smoothScroll(1.3, 220);
// When accessing homepage from another page and `#top` hash is set, show top of page (no hash).
if (window.location.hash == "#top") {
window.location.hash = ""
}
// Initialize Scrollspy.
var $body = $('body');
var $navbar = $('.navbar-header');
var navbar_offset = $navbar.innerHeight() + 1;
$body.scrollspy({offset: navbar_offset });
// Make Scrollspy responsive.
function fixScrollspy() {
var data = $body.data('bs.scrollspy');
if (data) {
navbar_offset = $navbar.innerHeight() + 1;
data.options.offset = navbar_offset;
$body.data('bs.scrollspy', data);
$body.scrollspy('refresh');
}
}
// Call `fixScrollspy` when window is resized.
var resizeTimer;
$(window).resize(function() {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(fixScrollspy, 200);
});
});
})(jQuery);