const LARGE = 992 const mainTitle = document.querySelector('.main-title') const navBar = document.querySelector('body > header') const navBarElems = document.querySelector('body > header > nav') const scrollToTop = document.querySelector('#scrollToTop') const contentElems = document.querySelectorAll('#content > section, .main-title') const backgroundHider = document.querySelector('.background-hider') const projectsContentList = document.querySelectorAll('.article-content') const projectsIDs = Array.from(projectsContentList) .map((project) => project.id) let lastScrollTop = window.scrollY function loadCSS() { const stylesheet = document.createElement('link') stylesheet.href = 'stylesheet-imgs.css' stylesheet.rel = 'stylesheet' stylesheet.type = 'text/css' document.querySelector('head').appendChild(stylesheet) } loadCSS() function toAddClass(toClass, inClass) { const elementsToAddClass = document.querySelectorAll(toClass) if (elementsToAddClass !== null) { elementsToAddClass.forEach(function (elem) { const distInView = elem.getBoundingClientRect().top - window.innerHeight + 100 if (distInView < 0) { elem.classList.add(inClass) } // else { // elem.classList.remove(inClass) // } }) } } function updateTitle() { const y = window.scrollY const titlePos = mainTitle.getBoundingClientRect() if (titlePos.bottom <= 0) return; const distanceToTop = window.scrollY + titlePos.top const elementHeight = mainTitle.offsetHeight const opacity = 1 - ((y - distanceToTop) / elementHeight) * 2 if (opacity <= 0) return; const pixelsSpacing = (y * 0.005 <= 0.1 ? 0.1 : y * 0.005) mainTitle.style.letterSpacing = (pixelsSpacing * 2) + 'em' mainTitle.style.opacity = opacity } function updateUrl() { const elements = [] let max = null let index = null contentElems.forEach(function (elem) { const pos = elem.getBoundingClientRect().top if (pos <= 50) { if (max === null || pos > max) { max = pos index = Array.from(contentElems).indexOf(elem) } elements.push(elem) } }) if (elements[index] && !projectsIDs.includes(elements[index].id) && !window.location.href.includes(elements[index].id)) { const hash = 'index.html#' + elements[index].id window.history.replaceState(null, null, hash) } } function switchArticle(article) { if (backgroundHider.classList.contains('bgh-off')) { backgroundHider.classList.remove('bgh-off') } else { backgroundHider.classList.add('bgh-off') } if (article !== null) { article.style.display = 'flex' } else { projectsContentList.forEach(function (art) { art.style.display = 'none' }) } } function updateScrollDirectionElems() { const scrollTop = window.scrollY let opacity = "100%" let visibility = "visible" if (scrollTop > lastScrollTop && window.innerWidth >= LARGE) { opacity = "50%" } if (scrollTop < 100) { visibility = "hidden" } navBar.style.opacity = opacity scrollToTop.style.visibility = visibility lastScrollTop = scrollTop } function scrollHandler() { toAddClass('.to-fade', 'fade-in') toAddClass('.to-grow', 'grow-in') toAddClass('.to-slide', 'slide-in') updateScrollDirectionElems() updateTitle() updateUrl() } scrollHandler() window.addEventListener('scroll', scrollHandler) function switchNavBar() { const header = document.querySelector('.hamburger').parentNode.classList if (header.contains('slide-in') || header.contains('to-cross')) { header.remove('slide-in') header.remove('to-cross') navBarElems.classList.remove('slide-elements') } else { header.add('slide-in') header.add('to-cross') navBarElems.classList.add('slide-elements') } } document.querySelectorAll('nav a').forEach(function (a) { a.onclick = switchNavBar }) document.querySelectorAll('.projects-list article').forEach(function (a) { a.onclick = function () { switchArticle(document.getElementById(a.classList[0])) } })