Spaces:
Running
Running
(function() { | |
"use strict"; | |
/** | |
* Easy selector helper function | |
*/ | |
const select = (el, all = false) => { | |
el = el.trim() | |
if (all) { | |
return [...document.querySelectorAll(el)] | |
} else { | |
return document.querySelector(el) | |
} | |
} | |
/** | |
* Easy event listener function | |
*/ | |
const on = (type, el, listener, all = false) => { | |
if (all) { | |
select(el, all).forEach(e => e.addEventListener(type, listener)) | |
} else { | |
select(el, all).addEventListener(type, listener) | |
} | |
} | |
/** | |
* Easy on scroll event listener | |
*/ | |
const onscroll = (el, listener) => { | |
el.addEventListener('scroll', listener) | |
} | |
/** | |
* Navbar links active state on scroll | |
*/ | |
let navbarlinks = select('#navbar .scrollto', true) | |
const navbarlinksActive = () => { | |
let position = window.scrollY + 200 | |
navbarlinks.forEach(navbarlink => { | |
if (!navbarlink.hash) return | |
let section = select(navbarlink.hash) | |
if (!section) return | |
if (position >= section.offsetTop && position <= (section.offsetTop + section.offsetHeight)) { | |
navbarlink.classList.add('active') | |
} else { | |
navbarlink.classList.remove('active') | |
} | |
}) | |
} | |
window.addEventListener('load', navbarlinksActive) | |
onscroll(document, navbarlinksActive) | |
/** | |
* Scrolls to an element with header offset | |
*/ | |
const scrollto = (el) => { | |
let header = select('#header') | |
let offset = header.offsetHeight | |
if (!header.classList.contains('header-scrolled')) { | |
offset -= 10 | |
} | |
let elementPos = select(el).offsetTop | |
window.scrollTo({ | |
top: elementPos - offset, | |
behavior: 'smooth' | |
}) | |
} | |
/** | |
* Toggle .header-scrolled class to #header when page is scrolled | |
*/ | |
let selectHeader = select('#header') | |
if (selectHeader) { | |
const headerScrolled = () => { | |
if (window.scrollY > 100) { | |
selectHeader.classList.add('header-scrolled') | |
} else { | |
selectHeader.classList.remove('header-scrolled') | |
} | |
} | |
window.addEventListener('load', headerScrolled) | |
onscroll(document, headerScrolled) | |
} | |
/** | |
* Back to top button | |
*/ | |
let backtotop = select('.back-to-top') | |
if (backtotop) { | |
const toggleBacktotop = () => { | |
if (window.scrollY > 100) { | |
backtotop.classList.add('active') | |
} else { | |
backtotop.classList.remove('active') | |
} | |
} | |
window.addEventListener('load', toggleBacktotop) | |
onscroll(document, toggleBacktotop) | |
} | |
/** | |
* Mobile nav toggle | |
*/ | |
on('click', '.mobile-nav-toggle', function(e) { | |
select('#navbar').classList.toggle('navbar-mobile') | |
this.classList.toggle('bi-list') | |
this.classList.toggle('bi-x') | |
}) | |
/** | |
* Mobile nav dropdowns activate | |
*/ | |
on('click', '.navbar .dropdown > a', function(e) { | |
if (select('#navbar').classList.contains('navbar-mobile')) { | |
e.preventDefault() | |
this.nextElementSibling.classList.toggle('dropdown-active') | |
} | |
}, true) | |
/** | |
* Scrool with ofset on links with a class name .scrollto | |
*/ | |
on('click', '.scrollto', function(e) { | |
if (select(this.hash)) { | |
e.preventDefault() | |
let navbar = select('#navbar') | |
if (navbar.classList.contains('navbar-mobile')) { | |
navbar.classList.remove('navbar-mobile') | |
let navbarToggle = select('.mobile-nav-toggle') | |
navbarToggle.classList.toggle('bi-list') | |
navbarToggle.classList.toggle('bi-x') | |
} | |
scrollto(this.hash) | |
} | |
}, true) | |
/** | |
* Scroll with ofset on page load with hash links in the url | |
*/ | |
window.addEventListener('load', () => { | |
if (window.location.hash) { | |
if (select(window.location.hash)) { | |
scrollto(window.location.hash) | |
} | |
} | |
}); | |
/** | |
* Clients Slider | |
*/ | |
new Swiper('.clients-slider', { | |
speed: 400, | |
loop: true, | |
autoplay: { | |
delay: 5000, | |
disableOnInteraction: false | |
}, | |
slidesPerView: 'auto', | |
pagination: { | |
el: '.swiper-pagination', | |
type: 'bullets', | |
clickable: true | |
}, | |
breakpoints: { | |
320: { | |
slidesPerView: 2, | |
spaceBetween: 40 | |
}, | |
480: { | |
slidesPerView: 3, | |
spaceBetween: 60 | |
}, | |
640: { | |
slidesPerView: 4, | |
spaceBetween: 80 | |
}, | |
992: { | |
slidesPerView: 6, | |
spaceBetween: 120 | |
} | |
} | |
}); | |
new Swiper('.portfolio-details-slider', { | |
speed: 400, | |
autoplay: { | |
delay: 5000, | |
disableOnInteraction: false | |
}, | |
pagination: { | |
el: '.swiper-pagination', | |
type: 'bullets', | |
clickable: true | |
} | |
}); | |
/** | |
* Animation on scroll | |
*/ | |
function aos_init() { | |
AOS.init({ | |
duration: 1000, | |
easing: "ease-in-out", | |
once: true, | |
mirror: false | |
}); | |
} | |
window.addEventListener('load', () => { | |
aos_init(); | |
}); | |
})(); |