????
Current Path : /home/multihiv/www/store/wp-content/themes/js/scripts/global/ |
Current File : //home/multihiv/www/store/wp-content/themes/js/scripts/global/stickyContainer.js |
/* global woodmart_settings */ woodmartThemeModule.wdElementorAddAction('frontend/element_ready/container', function() { woodmartThemeModule.stickyContainer(); }); let windowWidth = woodmartThemeModule.windowWidth; woodmartThemeModule.stickyContainer = function () { function isRtl() { return document.querySelector('html').hasAttributes('dir') && 'rtl' === document.querySelector('html').getAttribute('dir'); } function setInlineStyle(el, style) { let properties = Object.keys(style); if (0 === properties.length) { return; } properties.forEach(function(property) { el.style[property] = style[property]; }); } function getFixedStyles(el, offset) { let stickyContainerCloneStyles = window.getComputedStyle(el); let styles = { position: 'fixed', width: stickyContainerCloneStyles.width, marginTop: stickyContainerCloneStyles.marginTop, marginBottom: stickyContainerCloneStyles.marginBottom, top: `${offset}px`, bottom: '', zIndex: 99, } if ( isRtl() ) { styles['insetInlineEnd'] = `${el.getBoundingClientRect().left}px`; } else { styles['insetInlineStart'] = `${el.getBoundingClientRect().left}px`; } return styles; } function getAbsoluteStyles(el) { let styles = { position: 'absolute', top: '', bottom: '0px', }; if ( isRtl() ) { styles['insetInlineEnd'] = `${el.offsetLeft}px`; } else { styles['insetInlineStart'] = `${el.offsetLeft}px`; } return styles; } function createClone(el, offset, position = 'fixed') { let styles = getFixedStyles(el, offset); if ( 'absolute' === position ) { styles = getAbsoluteStyles(el); } let clone = el.cloneNode(true); clone.classList.add('wd-sticky-spacer'); setInlineStyle(clone, {visibility: 'hidden'}); el.parentNode.insertBefore(clone, el); setInlineStyle(el, styles); return clone; } function removeClone(el, clone) { el.parentNode.removeChild(clone); el.style = ''; } function getSiblings(el) { let siblings = []; if(! el.parentNode) { return siblings; } let sibling = el.parentNode.firstChild; while (sibling) { if (sibling.nodeType === 1 && sibling !== el) { siblings.push(sibling); } sibling = sibling.nextSibling; } return siblings; } function makeThisContainerSticky(stickyContainer, responsiveSettings) { let elementId = stickyContainer.dataset.id; if ('undefined' === typeof elementId) { return; } let stickyContainerClone = document.querySelector(`.elementor-element-${elementId}.wd-sticky-spacer`); if ( ( responsiveSettings.is_mobile && ! stickyContainer.classList.contains( 'wd-sticky-container-mobile-yes' ) ) || ( responsiveSettings.is_tablet && ! stickyContainer.classList.contains( 'wd-sticky-container-tablet-yes' ) ) || ( responsiveSettings.is_desktop && ! stickyContainer.classList.contains( 'wd-sticky-container-yes' ) ) ) { if ( null !== stickyContainerClone ) { removeClone(stickyContainer, stickyContainerClone); } return; } let offsetClass = Array.from(stickyContainer.classList).find(function (element) { return element.indexOf('wd-sticky-offset') !== -1; }); let offset = 'undefined' !== typeof offsetClass ? parseInt(offsetClass.substring(offsetClass.lastIndexOf('-') + 1)) : 150; let scrollTop = woodmartThemeModule.$window.scrollTop(); let stickyHolderHeight = stickyContainer.offsetHeight; let stickyHeightToElementStart = stickyContainer.getBoundingClientRect().top + window.scrollY - offset; let isTopContainer = stickyContainer.parentNode.parentNode.classList.contains('entry-content'); let heightToElementParentEnd = stickyContainer.parentNode.getBoundingClientRect().top + window.scrollY - offset + stickyContainer.parentNode.offsetHeight; if ( ! isTopContainer && null === stickyContainerClone && scrollTop > stickyHeightToElementStart) { let clonePosition = 'fixed'; if ( scrollTop > heightToElementParentEnd ) { clonePosition = 'absolute'; } stickyContainerClone = createClone(stickyContainer, offset, clonePosition); } if (null === stickyContainerClone) { return; } let heightToElementWrapperStart = stickyContainerClone.parentNode.getBoundingClientRect().top + window.scrollY - offset; let heightToElementWrapperEnd = heightToElementWrapperStart + stickyContainerClone.parentNode.offsetHeight; let heightToElementStart = stickyContainerClone.getBoundingClientRect().top + window.scrollY - offset; if (scrollTop < heightToElementStart) { removeClone(stickyContainer, stickyContainerClone); } else { if ('fixed' !== stickyContainer.style.position && scrollTop < (heightToElementWrapperEnd - stickyHolderHeight)) { let siblings = getSiblings(stickyContainer); let absoluteColumnExists = siblings.find(function (el) { return 'absolute' === el.style.position; }); if ( 'undefined' === typeof absoluteColumnExists ) { setInlineStyle(stickyContainer.parentNode, {position: ''}); } setInlineStyle(stickyContainer, getFixedStyles(stickyContainerClone, offset)); } else if ('absolute' !== stickyContainer.style.position && (stickyHeightToElementStart + stickyHolderHeight) > heightToElementWrapperEnd) { setInlineStyle(stickyContainer.parentNode, {position: 'relative'}); setInlineStyle(stickyContainer, getAbsoluteStyles(stickyContainerClone)); } } } function wipeSticky() { let stickyContainers = document.querySelectorAll( '.wd-sticky-container-yes, .wd-sticky-container-tablet-yes, .wd-sticky-container-mobile-yes' ); stickyContainers.forEach(function (stickyContainer) { let elementId = stickyContainer.dataset.id; let stickyContainerClone = document.querySelector(`.elementor-element-${elementId}.wd-sticky-spacer`); if ( stickyContainerClone ) { stickyContainerClone.remove() } document.querySelector(`.elementor-element-${elementId}`).style = ''; }); } function makeSticky() { window.addEventListener('scroll',function() { let stickyContainers = document.querySelectorAll('.wd-sticky-container-yes:not(.wd-sticky-spacer), .wd-sticky-container-tablet-yes:not(.wd-sticky-spacer), .wd-sticky-container-mobile-yes:not(.wd-sticky-spacer)'); let responsiveSettings = { is_desktop: windowWidth > 1024, is_tablet : windowWidth > 768 && windowWidth < 1024, is_mobile : windowWidth <= 768, } stickyContainers.forEach(function(stickyContainer) { makeThisContainerSticky(stickyContainer, responsiveSettings); }); }); } wipeSticky(); makeSticky(); } window.addEventListener('resize',function() { if ( 'undefined' !== typeof elementor ) { windowWidth = !isNaN(parseInt(elementor.$preview.css('--e-editor-preview-width'))) ? parseInt(elementor.$preview.css('--e-editor-preview-width')) : 1025; } }); window.addEventListener('load',function() { woodmartThemeModule.stickyContainer(); });