/* nowprocket urlaubspunktStickyBarV2 */ (function () { "use strict"; var STYLE_ID = "urlaubspunkt-stickybar-v2-style"; var MANAGED_CLASS = "up-sticky-managed"; var VISIBLE_CLASS = "up-sticky-visible"; var FOOTER_CLASS = "up-sticky-footer-hidden"; var stickySelector = [ ".ult-sticky-section", "#gusta-sticky", ".dtcs-sticky-row", ".ult-stick" ].join(","); /* * Reihenfolge ist wichtig: * Zuerst wird die neue Header-Galerie gesucht, * danach das normale einzelne Beitragsbild. */ var triggerSelector = [ ".up-header-gallery", ".urlaubspunkt-header-gallery", "[data-up-header-gallery]", ".post-thumbnail", ".post-thumbnail-wrap", ".post-thumbnail-wrapper", ".entry-thumbnail" ].join(","); var footerSelector = [ "#main-footer", "footer", "#footer", ".footer" ].join(","); var ticking = false; var initialized = false; var observer = null; function injectStyles() { if (document.getElementById(STYLE_ID)) { return; } var style = document.createElement("style"); style.id = STYLE_ID; style.textContent = stickySelector + "." + MANAGED_CLASS + "{" + "position:fixed!important;" + "left:0!important;" + "right:0!important;" + "bottom:0!important;" + "width:100%!important;" + "max-width:none!important;" + "z-index:99990!important;" + "opacity:0!important;" + "visibility:hidden!important;" + "pointer-events:none!important;" + "transform:translateY(105%)!important;" + "transition:opacity .28s ease,transform .28s ease,visibility .28s ease!important;" + "will-change:opacity,transform!important;" + "}" + stickySelector + "." + MANAGED_CLASS + "." + VISIBLE_CLASS + "{" + "opacity:1!important;" + "visibility:visible!important;" + "pointer-events:auto!important;" + "transform:translateY(0)!important;" + "}" + stickySelector + "." + MANAGED_CLASS + "." + FOOTER_CLASS + "{" + "opacity:0!important;" + "visibility:hidden!important;" + "pointer-events:none!important;" + "transform:translateY(105%)!important;" + "}"; document.head.appendChild(style); } function getStickySections() { var elements = Array.prototype.slice.call( document.querySelectorAll(stickySelector) ); /* * Falls mehrere Selektoren auf dasselbe Element oder auf * ineinander verschachtelte Sticky-Elemente zeigen, wird nur * das äußerste Element gesteuert. */ return elements.filter(function (element, index, all) { if (!element || all.indexOf(element) !== index) { return false; } return !all.some(function (other) { return other !== element && other.contains(element); }); }); } function getTrigger() { return document.querySelector(triggerSelector); } function getFooter() { return document.querySelector(footerSelector); } function getFallbackTriggerPosition() { /* * Nur falls weder Galerie noch Beitragsbild gefunden werden: * Die Bar erscheint nach einer moderaten Scrollstrecke. */ return window.innerWidth <= 700 ? 420 : 620; } function updateStickyBar() { ticking = false; var stickySections = getStickySections(); if (!stickySections.length) { return; } var trigger = getTrigger(); var footer = getFooter(); var showBar; if (trigger) { /* * Sichtbar, sobald die Unterkante der Galerie beziehungsweise * des Beitragsbildes den oberen Viewportrand passiert hat. */ showBar = trigger.getBoundingClientRect().bottom <= 0; } else { showBar = window.scrollY >= getFallbackTriggerPosition(); } var footerReached = false; if (footer) { /* * Ausblenden, sobald der Footer in den sichtbaren Bereich kommt. */ footerReached = footer.getBoundingClientRect().top <= window.innerHeight; } stickySections.forEach(function (section) { section.classList.add(MANAGED_CLASS); section.classList.toggle(VISIBLE_CLASS, showBar && !footerReached); section.classList.toggle(FOOTER_CLASS, footerReached); section.setAttribute("aria-hidden", showBar && !footerReached ? "false" : "true"); }); } function requestUpdate() { if (ticking) { return; } ticking = true; window.requestAnimationFrame(updateStickyBar); } function observeDynamicElements() { if (!window.MutationObserver || observer) { return; } observer = new MutationObserver(function () { /* * WPBakery oder Gusta können Elemente nachträglich einsetzen. * Sobald Sticky-Bar, Galerie oder Bild auftauchen, wird neu geprüft. */ if (getStickySections().length) { requestUpdate(); } }); observer.observe(document.body, { childList: true, subtree: true }); } function observeTriggerSize() { if (!window.ResizeObserver) { return; } var trigger = getTrigger(); if (!trigger || trigger.dataset.upStickyResizeObserved === "1") { return; } trigger.dataset.upStickyResizeObserved = "1"; var resizeObserver = new ResizeObserver(function () { requestUpdate(); }); resizeObserver.observe(trigger); } function initStickyBar() { injectStyles(); observeDynamicElements(); observeTriggerSize(); window.addEventListener("scroll", requestUpdate, { passive: true }); window.addEventListener("resize", requestUpdate, { passive: true }); window.addEventListener("load", function () { observeTriggerSize(); requestUpdate(); }); requestUpdate(); /* * Kurze Nachprüfungen für spät geladene WPBakery- * beziehungsweise Galerie-Elemente. */ window.setTimeout(function () { observeTriggerSize(); requestUpdate(); }, 500); window.setTimeout(function () { observeTriggerSize(); requestUpdate(); }, 1500); initialized = true; } /* * Funktioniert auch dann, wenn WP Rocket das Skript erst ausführt, * nachdem DOMContentLoaded bereits stattgefunden hat. */ if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", initStickyBar, { once: true }); } else { initStickyBar(); } })();
Go to Top