146 lines
5.9 KiB
JavaScript
146 lines
5.9 KiB
JavaScript
document.addEventListener('DOMContentLoaded', function () {
|
|
// Get references to the DOM elements
|
|
const header = document.getElementById('lcp-header-container');
|
|
const sideContent = document.getElementById('lcp-sidecontent');
|
|
|
|
// Ensure elements exist before proceeding
|
|
if (!header || !sideContent) return;
|
|
|
|
// Check if the header has the 'lcp-sticky' and 'lcp-sticky-on-scroll' class
|
|
const isSticky = header.classList.contains('lcp-sticky');
|
|
const isStickyOnScroll = header.classList.contains('lcp-sticky-on-scroll');
|
|
|
|
// Measure the height of the header once the DOM is loaded
|
|
const headerHeight = header.offsetHeight;
|
|
let fullHeaderHeight;
|
|
|
|
// If the admin-bar is present, the fullHeaderHeight is the headerHeight + 32px
|
|
if (document.body.classList.contains('admin-bar')) {
|
|
const adminBarHeight = document.getElementById('wpadminbar').offsetHeight;
|
|
fullHeaderHeight = headerHeight + adminBarHeight;
|
|
} else {
|
|
fullHeaderHeight = headerHeight;
|
|
}
|
|
|
|
// Set the initial height of #lcp-sidecontent based on whether the header is sticky or not
|
|
if (isSticky) {
|
|
sideContent.style.height = `calc(100vh - ${headerHeight}px)`;
|
|
} else {
|
|
sideContent.style.height = `100vh`;
|
|
}
|
|
|
|
// Function to handle the scroll event
|
|
function handleScroll() {
|
|
const scrolled = window.scrollY || document.documentElement.scrollTop;
|
|
|
|
// Check if the page has scrolled past the height of the header
|
|
if (scrolled >= headerHeight) {
|
|
// Add the 'lcp-fixed' class and set 'top' to 0 for side content
|
|
sideContent.classList.add('lcp-fixed');
|
|
sideContent.style.top = '0';
|
|
|
|
// If the header has 'lcp-sticky-on-scroll', adjust height of side content to be 100vh - fullHeaderHeight
|
|
if (isStickyOnScroll) {
|
|
sideContent.style.height = `calc(100vh - ${fullHeaderHeight}px)`;
|
|
// Add 'lcp-fixed' to the header
|
|
header.classList.add('lcp-fixed');
|
|
// Set the 'top' of the sideContent to the height of the header
|
|
sideContent.style.top = `${fullHeaderHeight}px`;
|
|
} else if (isSticky) {
|
|
// If the header is sticky but not 'sticky-on-scroll', keep the side content height adjusted
|
|
sideContent.style.height = `calc(100vh - ${fullHeaderHeight}px)`;
|
|
} else {
|
|
// Set side content height to 100vh when not sticky
|
|
sideContent.style.height = '100vh';
|
|
}
|
|
} else {
|
|
// Remove the 'lcp-fixed' class from side content and header if scrolled back above the header
|
|
sideContent.classList.remove('lcp-fixed');
|
|
sideContent.style.top = ''; // Reset the 'top' style
|
|
|
|
// Reset height to 100vh when not fixed
|
|
sideContent.style.height = isSticky ? `calc(100vh - ${headerHeight}px)` : '100vh';
|
|
|
|
// If header has the 'lcp-sticky-on-scroll' class, remove 'lcp-fixed' from the header
|
|
if (isStickyOnScroll) {
|
|
header.classList.remove('lcp-fixed');
|
|
}
|
|
}
|
|
}
|
|
|
|
// Add the scroll event listener
|
|
window.addEventListener('scroll', handleScroll);
|
|
|
|
// Also trigger the scroll handler once on load in case the page is already scrolled
|
|
handleScroll();
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const sidecontent = document.getElementById("lcp-sidecontent");
|
|
const innerContent = document.getElementById("lcp-sidecontent-inner");
|
|
const scrollTrack = document.getElementById("lcp-scroll-track");
|
|
const scrollBar = document.getElementById("lcp-scroll-bar");
|
|
|
|
let isDragging = false;
|
|
let startY = 0;
|
|
let startScrollTop = 0;
|
|
|
|
// Update the custom scrollbar position based on the content's scroll position
|
|
function updateCustomScrollbar() {
|
|
const contentHeight = innerContent.scrollHeight;
|
|
const visibleHeight = innerContent.clientHeight;
|
|
const scrollTrackHeight = scrollTrack.clientHeight;
|
|
|
|
// Calculate the proportion of visible content to total content
|
|
const thumbHeight = (visibleHeight / contentHeight) * scrollTrackHeight;
|
|
scrollBar.style.height = `${thumbHeight}px`;
|
|
|
|
// Calculate the scroll ratio (position of the content relative to its height)
|
|
const scrollRatio = innerContent.scrollTop / (contentHeight - visibleHeight);
|
|
|
|
// Position the scrollbar thumb based on the scroll ratio
|
|
scrollBar.style.top = `${scrollRatio * (scrollTrackHeight - thumbHeight)}px`;
|
|
}
|
|
|
|
// Handle the mouse down event to begin dragging the scrollbar
|
|
scrollBar.addEventListener("mousedown", (e) => {
|
|
isDragging = true;
|
|
startY = e.clientY;
|
|
startScrollTop = innerContent.scrollTop;
|
|
document.body.style.userSelect = "none"; // Disable text selection while dragging
|
|
});
|
|
|
|
// Handle mouse movement to drag the scrollbar and simulate scrolling
|
|
document.addEventListener("mousemove", (e) => {
|
|
if (!isDragging) return;
|
|
|
|
const deltaY = e.clientY - startY;
|
|
const contentHeight = innerContent.scrollHeight;
|
|
const visibleHeight = innerContent.clientHeight;
|
|
const scrollTrackHeight = scrollTrack.clientHeight;
|
|
|
|
const thumbHeight = scrollBar.clientHeight;
|
|
const scrollableDistance = contentHeight - visibleHeight;
|
|
const thumbDistance = scrollTrackHeight - thumbHeight;
|
|
|
|
// Calculate new scroll position for content based on dragging
|
|
const newScrollTop = (deltaY / thumbDistance) * scrollableDistance + startScrollTop;
|
|
innerContent.scrollTop = newScrollTop;
|
|
updateCustomScrollbar();
|
|
});
|
|
|
|
// Handle mouse up event to stop dragging
|
|
document.addEventListener("mouseup", () => {
|
|
isDragging = false;
|
|
document.body.style.userSelect = ""; // Enable text selection again
|
|
});
|
|
|
|
// Handle scroll events on the content to update the custom scrollbar
|
|
innerContent.addEventListener("scroll", updateCustomScrollbar);
|
|
|
|
// Initialize the custom scrollbar position when the page loads
|
|
updateCustomScrollbar();
|