Massage-Einlegesohlen
.secao { margin-top: 30px; margin-bottom: 10px; text-align: center; max-width: 1200px; margin-left: auto; margin-right: auto; border-radius: 10px; } .secao > img { margin-left: aut o; margin-right: auto; margin-top: 0px; margin-bottom: 15px; width: 100%; max-width: 400px; border-radius: 10px; display: block; } .gallery-container { max-width: 100%; margin: 0 auto; overflow: hidden; position: relative; } .gallery-strip { display: flex; overflow-x: auto; scroll-behavior: smooth; padding: 20px 0; scrollbar-width: none; /* Firefox */ scroll-snap-type: x mandatory; } .gallery-strip::-webkit-scrollbar { display: none; /* Chrome, Safari, Edge */ } img-comparison-slider { visibility: hidden; --divider-width: 2px; --divider-color: #000; --default-handle-color: #000; --default-handle-width: 70px; margin-bottom: 15px; } img-comparison-slider [slot='second'] { display: none; } img-comparison-slider.rendered { visibility: inherit; } img-comparison-slider.rendered [slot='second'] { display: unset; } .gallery-item { flex: 0 0 300px; height: 350px; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); transition: transform 0.3s ease; margin: 0 7.5px; scroll-snap-align: center; text-align: center; background-color: #000; } .gallery-item p { margin: 0; color: #fff; font-weight: bold; padding-top: 6px; } .gallery-item img { width: 100%; height: 300px; object-fit: cover; } .gallery-nav { position: absolute; top: 50%; transform: translateY(-50%); width: 100%; display: flex; justify-content: space-between; pointer-events: none; /* Let clicks pass through to items below */ z-index: 2; } .gallery-nav button { background: rgba(255, 91, 0, 0.8); color: white; border: none; width: 30px; height: 30px; border-radius: 50%; cursor: pointer; transition: background-color 0.3s ease; pointer-events: auto; /* Re-enable clicks for buttons */ font-size: 20px; display: flex; align-items: center; justify-content: center; margin: 0 10px; } .gallery-nav button:hover { background: rgba(255, 123, 48, 0.9); } .gallery-nav button:disabled { background: rgba(128, 128, 128, 0.5); cursor: not-allowed; } .gallery-dots { display: flex; justify-content: center; gap: 8px; margin-top: 15px; } .dot { width: 10px; height: 10px; border-radius: 50%; background-color: #ddd; cursor: pointer; transition: background-color 0.3s ease; } .dot.active { background-color: #ff5b00; } .tabela { max-width: 600px; margin-top: 20px; margin-left: auto; margin-right: auto; text-align: left; border-spacing: 0px; border: 1px hidden #000; border-radius: 10px; } .tabela td { padding: 10px; padding-left: 15px; padding-right: 10px; border: 1px solid #0000000a; } .tabela td.red-x { text-align: center; color: red; font-weight: bold; font-size: 125%; margin-left: auto; margin-right: auto; } .tabela td.green-check { text-align: center; color: green; font-weight: bold; font-size: 125%; margin-left: auto; margin-right: auto; } .tabela th { background-color: white; border: 1px hidden #000; padding: 0px; } .tabela tr { border: 1px hidden #dddddd63; box-sizing: border-box; } .containerzao { display: flex; justify-content: space-evenly; gap: 15px; padding: 15px; padding-bottom: 20px; flex-wrap: wrap; } .containerzin { display: flex; justify-content: space-evenly; gap: 10px; padding: 15px; flex-wrap: wrap; } .expert-panel { border: 1px solid #ddd; border-radius: 8px; padding: 0; width: 100%; max-width: 400px; margin-left: auto; margin-right: auto; box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1); box-sizing: border-box; background-color: #f5f5f5; overflow: hidden; /* Changed from visible to hidden for safety, though wrapper should handle it */ position: relative; } .expert-panel img { width: 100%; height: auto; border-radius: 8px; } .review-panel { border: 1px solid #ddd; border-radius: 8px; padding: 0; width: 31%; box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1); box-sizing: border-box; background-color: #f5f5f5; overflow: hidden; /* Changed from visible to hidden for safety, though wrapper should handle it */ position: relative; } .review-image-wrapper { width: 100%; height: 220px; /* Fixed height for the image container - ADJUST AS NEEDED */ overflow: hidden; border-radius: 8px 8px 0 0; /* Rounded top corners for the image area */ background-color: #f0f0f0; /* Optional: background for empty space if image is smaller (not with cover) */ } .review-image-wrapper img { width: 100%; height: 100%; object-fit: cover; /* Scales and crops image to fill the container */ object-position: center; /* Centers the image within the crop */ display: block; margin: 0; cursor: pointer; /* Indicate it's clickable */ transition: transform 0.3s ease; /* Optional: slight zoom on hover */ } .porcentagem { border-bottom: 1px solid #ddd; padding: 10px; width: 100%; max-width: 550px; margin-left: auto; margin-right: auto; box-sizing: border-box; overflow: hidden; position: relative; display: flex; } .porcentagem img { width: auto; max-height: 75px; border-radius: 100%; display: block; padding: 0px; padding-right: 15px; } .porcentagem p { margin-top: auto; margin-bottom: auto; text-align: left; } .horizontal-review-panel { border: 1px solid #ddd; border-radius: 8px; padding: 10px; width: 100%; max-width: 600px; margin-left: auto; margin-right: auto; box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1); box-sizing: border-box; background-color: #f5f5f5; overflow: hidden; position: relative; display: flex; } .horizontal-review-panel img { width: auto; max-height: 65px; border-radius: 100%; display: block; padding: 7px; } .horizontal-review-content { padding: 10px 10px 10px 5px; text-align: left; position: relative; z-index: 1; background-color: #f5f5f5; } .horizontal-review-content p:last-child { border-top: 1px solid rgba(128, 128, 128, 0.2); margin-bottom: 0; padding-top: 10px; } .review-image-wrapper img:hover { transform: scale(1.03); /* Optional: slight zoom on hover */ } .star-display-wrapper { text-align: center; position: relative; z-index: 2; margin-top: -18px; /* Pulls the star box up */ } .star-box { display: inline-block; background-color: #fff; border-radius: 16px; padding: 6px 14px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); line-height: 1; } .star-box .star-text { margin: 0; font-size: 1.4em; color: #ffcc00; } .review-content { padding: 15px; padding-top: 18px; /* Space for overlapping star box */ text-align: left; position: relative; z-index: 1; background-color: #f5f5f5; } .review-content p:last-child { border-top: 1px solid rgba(128, 128, 128, 0.2); margin-bottom: 0; padding-top: 10px; } .review-name { font-weight: bold; margin-bottom: 8px; } /* Lightbox Styles */ .lightbox { display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgba(0, 0, 0, 0.9); padding-top: 20px; /* Add some padding from top */ box-sizing: border-box; } .lightbox-content { margin: auto; display: block; max-width: 90%; max-height: 90vh; /* Max height relative to viewport height */ animation-name: lightboxZoom; animation-duration: 0.4s; } @keyframes lightboxZoom { from { transform: scale(0.8); opacity: 0; } to { transform: scale(1); opacity: 1; } } .lightbox-close { position: absolute; top: 15px; right: 35px; color: #f1f1f1; font-size: 40px; font-weight: bold; transition: 0.3s; cursor: pointer; line-height: 1; } .lightbox-close:hover, .lightbox-close:focus { color: #bbb; text-decoration: none; } /* Other existing styles */ .table-panel { padding-top: 15px; padding-bottom: 0px; padding-left: 20px; padding-right: 20px; width: 22%; max-width: 500px; box-sizing: border-box; border-radius: 50px; background-color: white; } .table-panel img { /* Image for table-panel-3 */ max-width: 50px; width: 100%; height: auto; border-radius: 5px; display: block; /* Good practice */ margin-left: auto; /* Center if needed */ margin-right: auto; } .table-panel-3 { padding-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; width: 30%; box-sizing: border-box; border-radius: 50px; background-color: white; } .table-panel-3 img { /* Image for table-panel-3 */ max-width: 50px; width: 100%; height: auto; border-radius: 5px; display: block; /* Good practice */ margin-left: auto; /* Center if needed */ margin-right: auto; } .accordion { width: 100%; max-width: 800px; margin: 20px auto; border-bottom: 1px solid #ddd; } .accordion-item { border-top: 1px solid #ddd; } .accordion-header { padding: 15px; cursor: pointer; display: flex; justify-content: space-between; align-items: center; font-weight: bold; text-align: left; } .accordion-header:hover { background-color: #f1f1f1; } .accordion-body { text-align: left; padding: 0 15px; max-height: 0; overflow: hidden; transition: max-height 0.3s ease, padding 0.3s ease; } .accordion-body.active { padding: 15px; margin-bottom: 15px; } .accordion-header .icon { font-size: 120%; } .scrolling-banner-container { width: 100%; max-width: 2000px; overflow: hidden; background-color: #000; color: white; padding: 15px 0; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); } .scrolling-banner-content { display: flex; animation: scroll-continuously var(--scroll-duration) linear infinite; } .banner-phrase { white-space: nowrap; padding: 0 30px; font-weight: bold; text-transform: uppercase; flex-shrink: 0; } @keyframes scroll-continuously { 0% { transform: translateX(0); } 100% { transform: translateX(var(--scroll-translate-x-end)); } } .scrolling-banner-container:hover .scrolling-banner-content { animation-play-state: paused; } .before, .after { margin: 0; } .before figcaption, .after figcaption { background: #ff5b00; border-radius: 12px; color: #fff; font-weight: bold; opacity: 0.8; padding: 12px; position: absolute; top: 6%; transform: translateY(-50%); line-height: 100%; } .before figcaption { left: 12px; } .after figcaption { right: 12px; } .orange-box { border: 2px solid #ff5b00; padding: 10px 10px; margin: 20px auto; max-width: 390px; } .orange-box p { margin: 0; font-weight: bold; text-transform: uppercase; color: #ff5b00; } @media (max-width: 600px) { .containerzao { flex-direction: column; align-items: center; } .review-panel { width: 100%; margin-bottom: 10px; } .table-panel { width: 45%; margin-bottom: 10px; } .lightbox-content { max-width: 95%; } .gallery-item { flex: 0 0 250px; /* Smaller items on mobile */ } .gallery-nav button { width: 35px; height: 35px; font-size: 18px; } .horizontal-review-panel img { max-height: 50px; } .tabela { table-layout: fixed; width: 100%; } .tabela td,th { white-space: normal; overflow-wrap: break-word; } .tabela td:first-child, th:first-child { width: 45%; } .tabela td:nth-child(2), th:nth-child(2) { width: 30%; } .tabela td:nth-child(3), th:nth-child(3) { width: 25%; } } const imageGalleryAPI = { currentIndex: 0, // Logical index of original items (0 to numOriginalItems-1) autoScrollInterval: null, galleryStrip: null, originalGalleryItemElements: [], // To store the initial set of items allGalleryItemElements: [], // All items in the strip including clones numOriginalItems: 0, CLONE_COUNT_PER_SIDE: 0, // Actual number of clones created on each side isDuringSilentJump: false, // Flag to prevent event cascades during silent jumps dotsElements: [], init: function() { this.galleryStrip = document.querySelector('.gallery-strip'); if (!this.galleryStrip) { console.error("Gallery strip element not found!"); return; } this.originalGalleryItemElements = Array.from(this.galleryStrip.querySelectorAll('.gallery-item')); this.numOriginalItems = this.originalGalleryItemElements.length; if (this.numOriginalItems === 0) { console.warn("No gallery items found for infinite scrolling."); document.querySelectorAll('.gallery-dots .dot').forEach(d => d.style.display = 'none'); return; } this.dotsElements = document.querySelectorAll('.gallery-dots .dot'); if (this.dotsElements.length !== this.numOriginalItems) { console.warn(`Image Gallery: Mismatch between gallery items (${this.numOriginalItems}) and dots (${this.dotsElements.length}). Ensure HTML for dots matches the number of original gallery images.`); // You might want to dynamically generate dots here if this is a common issue } // Determine how many items to clone on each side (e.g., 3, or fewer if not enough originals) this.CLONE_COUNT_PER_SIDE = Math.min(3, this.numOriginalItems); // Add a 'data-logical-index' to original items for easier reference this.originalGalleryItemElements.forEach((item, index) => { item.dataset.logicalIndex = index; }); // Prepend clones (items from the end of the original set) if (this.numOriginalItems > 0 && this.CLONE_COUNT_PER_SIDE > 0) { for (let i = 0; i < this.CLONE_COUNT_PER_SIDE; i++) { const originalIndexToClone = (this.numOriginalItems - this.CLONE_COUNT_PER_SIDE + i); const clone = this.originalGalleryItemElements[originalIndexToClone].cloneNode(true); clone.dataset.isClone = "true"; clone.dataset.logicalIndex = originalIndexToClone; // Store the original index it represents this.galleryStrip.insertBefore(clone, this.galleryStrip.firstChild); } // Append clones (items from the beginning of the original set) for (let i = 0; i < this.CLONE_COUNT_PER_SIDE; i++) { const originalIndexToClone = i; const clone = this.originalGalleryItemElements[originalIndexToClone].cloneNode(true); clone.dataset.isClone = "true"; clone.dataset.logicalIndex = originalIndexToClone; this.galleryStrip.appendChild(clone); } } this.allGalleryItemElements = Array.from(this.galleryStrip.querySelectorAll('.gallery-item')); // Initial position: scroll to the first *actual* original item and center it // This needs to be done without smooth scrolling for the initial setup. const firstOriginalItem = this.allGalleryItemElements[this.CLONE_COUNT_PER_SIDE]; if (firstOriginalItem) { this.centerItem(firstOriginalItem, 'auto'); } this.updateDots(); this.startAutoScroll(); // Event listeners for interaction this.galleryStrip.addEventListener('mouseenter', () => this.stopAutoScroll()); this.galleryStrip.addEventListener('mouseleave', () => this.startAutoScroll()); // Use 'scrollend' if available for handling jumps after scrolling, otherwise fallback to debounced 'scroll' if ('onscrollend' in this.galleryStrip) { this.galleryStrip.addEventListener('scrollend', () => this.handleScrollEnd()); } else { let scrollTimeout; this.galleryStrip.addEventListener('scroll', () => { if (this.isDuringSilentJump) return; clearTimeout(scrollTimeout); scrollTimeout = setTimeout(() => this.handleScrollEnd(), 150); // Debounce time }); } }, centerItem: function(itemElement, behavior = 'smooth') { if (!itemElement || !this.galleryStrip) return; const scrollPositionToCenter = itemElement.offsetLeft + (itemElement.offsetWidth / 2) - (this.galleryStrip.offsetWidth / 2); const originalScrollBehavior = this.galleryStrip.style.scrollBehavior; if (behavior === 'auto') { this.galleryStrip.style.scrollBehavior = 'auto'; // Disable smooth for silent jumps/initial set } else { this.galleryStrip.style.scrollBehavior = 'smooth'; } this.galleryStrip.scrollTo({ left: scrollPositionToCenter, behavior: behavior // Note: 'auto' here will be instant, 'smooth' will animate }); if (behavior === 'auto') { this.galleryStrip.offsetHeight; // Force reflow/repaint this.galleryStrip.style.scrollBehavior = originalScrollBehavior; // Restore original behavior } }, scrollToOriginal: function(originalIndex, scrollBehavior = 'smooth') { if (this.numOriginalItems === 0) return; // Ensure index is within bounds and positive originalIndex = (originalIndex % this.numOriginalItems + this.numOriginalItems) % this.numOriginalItems; this.currentIndex = originalIndex; const targetItem = this.allGalleryItemElements[this.CLONE_COUNT_PER_SIDE + originalIndex]; if (targetItem) { this.centerItem(targetItem, scrollBehavior); } this.updateDots(); // Update dots after initiating scroll }, updateDots: function() { if (this.numOriginalItems === 0 || this.dotsElements.length === 0) return; this.dotsElements.forEach((dot, index) => { dot.classList.toggle('active', index === this.currentIndex); }); }, autoScroll: function() { if (this.numOriginalItems === 0) return; let nextIndex = (this.currentIndex + 1) % this.numOriginalItems; this.scrollToOriginal(nextIndex); }, startAutoScroll: function() { if (this.numOriginalItems === 0) return; this.stopAutoScroll(); // Clear any existing interval this.autoScrollInterval = setInterval(() => this.autoScroll(), 3000); // Scroll every 3 seconds }, stopAutoScroll: function() { if (this.autoScrollInterval) { clearInterval(this.autoScrollInterval); this.autoScrollInterval = null; } }, handleScrollEnd: function() { if (this.isDuringSilentJump || this.numOriginalItems === 0) return; // Determine which item is currently centered const stripVisibleAreaLeft = this.galleryStrip.scrollLeft; const stripVisibleAreaRight = stripVisibleAreaLeft + this.galleryStrip.offsetWidth; const stripVisibleCenter = stripVisibleAreaLeft + this.galleryStrip.offsetWidth / 2; let closestItem = null; let minDistance = Infinity; let overallIndexOfClosest = -1; this.allGalleryItemElements.forEach((item, index) => { const itemCenter = item.offsetLeft + item.offsetWidth / 2; const distance = Math.abs(stripVisibleCenter - itemCenter); if (distance < minDistance) { minDistance = distance; closestItem = item; overallIndexOfClosest = index; } }); if (!closestItem) return; const logicalIndexOfCenteredItem = parseInt(closestItem.dataset.logicalIndex); this.currentIndex = logicalIndexOfCenteredItem; // Update logical current index // Check if a silent jump is needed (if the centered item is a clone at the "ends") if (closestItem.dataset.isClone === "true") { // If the centered item is a prepended clone (index < CLONE_COUNT_PER_SIDE) // OR an appended clone (index >= CLONE_COUNT_PER_SIDE + numOriginalItems) // then we need to jump to its "real" counterpart. const targetOverallIndexForJump = this.CLONE_COUNT_PER_SIDE + logicalIndexOfCenteredItem; // Only jump if the currently centered clone is not already at the position of its true original counterpart // (This condition means we are on a clone that's at an "extreme" end) if (overallIndexOfClosest < this.CLONE_COUNT_PER_SIDE || overallIndexOfClosest >= (this.CLONE_COUNT_PER_SIDE + this.numOriginalItems)) { this.isDuringSilentJump = true; const itemToJumpTo = this.allGalleryItemElements[targetOverallIndexForJump]; this.centerItem(itemToJumpTo, 'auto'); // 'auto' for silent jump // Timeout to allow jump to complete and prevent immediate re-triggering of scrollend setTimeout(() => { this.isDuringSilentJump = false; }, 50); } } this.updateDots(); // Ensure dots are correct after potential jump and currentIndex update } }; // Accordion function (remains global) function toggleAccordion(element) { // Close all accordion items except the clicked one const allBodies = document.querySelectorAll(".accordion-body"); const allIcons = document.querySelectorAll(".accordion-header .icon"); const currentBody = element.nextElementSibling; const isActive = currentBody.classList.contains("active"); allBodies.forEach((body) => { body.classList.remove("active"); body.style.maxHeight = null; // Collapse the body }); allIcons.forEach((icon) => { icon.textContent = "+"; }); // Toggle the clicked item if (!isActive) { currentBody.classList.add("active"); element.querySelector(".icon").textContent = "-"; currentBody.style.maxHeight = (currentBody.scrollHeight + 80) + "px"; } else { currentBody.classList.remove("active"); element.querySelector(".icon").textContent = "+"; currentBody.style.maxHeight = null; // Collapse the body } } document.addEventListener("DOMContentLoaded", function () { imageGalleryAPI.init(); // Initialize the new image gallery // Lightbox functionality const lightbox = document.getElementById("imageLightbox"); const lightboxImg = document.getElementById("lightboxImageContent"); // Updated ID const closeLightboxBtn = document.querySelector(".lightbox-close"); if (lightbox && lightboxImg && closeLightboxBtn) { document.querySelectorAll(".review-image-wrapper img").forEach((image) => { image.addEventListener("click", function () { lightbox.style.display = "block"; lightboxImg.src = this.src; document.body.style.overflow = "hidden"; // Prevent body scroll when lightbox is open }); }); closeLightboxBtn.addEventListener("click", function () { lightbox.style.display = "none"; document.body.style.overflow = "auto"; // Restore body scroll }); // Close lightbox when clicking on the background (outside the image) lightbox.addEventListener("click", function (event) { if (event.target === lightbox) { // Check if the click is on the lightbox background itself lightbox.style.display = "none"; document.body.style.overflow = "auto"; // Restore body scroll } }); } const contentElement = document.querySelector(".scrolling-banner-content"); if (contentElement) { const originalContent = contentElement.innerHTML; contentElement.innerHTML = originalContent + originalContent; } else { // It seems there are multiple scrolling banners, the script below handles this better. // console.error("Scrolling banner content element not found!"); } }); × 📏 Kleiner? Zwischengrößen? + Kleiner als unsere kleinste Größe? Bestelle die kleinste Größe und schneide sie anhand der Richtlinien auf der Rückseite zu, um eine perfekte Passform zu erhalten. Zwischen den Größen? Immer Größe anpassen und nach den Richtlinien zuschneiden. Einfach. Einstellbar. Passend für Sie gemacht. 👟 Passt er zu meinen Schuhen? + Ja, sie sind so gemacht, dass sie perfekt in deine normale Schuhgröße passen. Keine Notwendigkeit, die Größe zu erhöhen oder größere Schuhe zu kaufen Zuschneidbare Kanten für eine perfekte Passform Die Schuhe fühlen sich nicht eng an Passt leicht in Arbeitsstiefel, Sneakers, Turnschuhe, und mehr Diese Einlegesohlen sind für das tägliche Tragen konzipiert - kein Quetschen, kein Rätselraten. Einfach nur purer Komfort. 👣 Meinem Fußzustand helfen? + Ja, unsere Einlagen können bei einer Vielzahl von Fußbeschwerden Linderung verschaffen. Dazu gehören Pflanzenfasziitis, Fußgewölbeschmerzen, Fersenschmerzen und Mittelfußschmerzen. Unsere Einlegesohlen bieten hervorragende Unterstützung und Dämpfung, um Beschwerden zu lindern und die allgemeine Fußgesundheit zu verbessern. 🔨 Wie lange halten die Einlegesohlen? + Sie sind langlebig! Bei richtiger Pflege können Sie davon ausgehen, dass Ihre Einlegesohlen über 12 Monate lang Komfort und Unterstützung bieten. Für eine optimale Lebensdauer, wasche sie einfach regelmäßig mit der Hand. 🏷️ Rabatt auf verschiedene Größen + Sie können unseren Rabatt für verschiedene Farben und Größen nutzen! So geht's: Legen Sie eine Größe in Ihren Warenkorb. Legen Sie eine weitere Größe in Ihren Warenkorb. Der Rabatt für 2 Paare, 3 Paare oder 5 Paare wird automatisch auf den Gesamtpreis angerechnet. 📦 Versand & Lieferung + Genießen Sie den kostenlosen weltweiten Versand mit einer geschätzten Lieferzeit von 5-8 Werktagen. Eine Tracking-Nummer wird für Ihre Bequemlichkeit zur Verfügung gestellt werden 💵 Rückgabe- und Erstattungsbedingungen + Wir sind sicher, dass Sie den Komfort unserer Einlagen lieben werden. Deshalb bieten wir eine Risikofreie 90-Tage-Geld-zurück-Garantie. Wenn Sie nicht zufrieden sind, senden Sie uns einfach eine E-Mail und wir erstatten Ihnen das Geld zurück. Für Rücksendungen kontaktieren Sie uns bitte. "Ich habe jahrelang mit Plantarfasziitis gekämpft, aber diese Einlegesohlen haben mein Leben verändert. Die Fußgewölbestütze ist erstaunlich und die Schmerzen sind endlich weg! ★★★★★ - Johann Nicht über Amazon/Ebay verkauft Schmerzen lindern Ganztägiger Komfort Gewölbestütze Heilen Sie Ihre Fußschmerzen Lernen Sie unsere Massageeinlagen kennen - der ultimative Komfort für Ihre Füße. Entdecken Sie die Freude am Stehen, Gehen und Leben ohne Fußschmerzen wieder. document.addEventListener("DOMContentLoaded", function () { // Select all banner content elements const allBannerContents = document.querySelectorAll(".scrolling-banner-content"); if (allBannerContents.length === 0) { // console.warn("No scrolling banner content elements found!"); // Already handled by gallery init return; } allBannerContents.forEach((contentElement) => { // Get the original phrases *for this specific banner* const originalPhrases = Array.from(contentElement.children); if (originalPhrases.length === 0) { // console.warn("A banner content element has no phrases.", contentElement); // Already handled by gallery init return; // Skip this banner if it's empty } // Check if content is already duplicated (e.g. by previous script or server-side) // A simple check: if the number of children is twice the number of unique phrases (based on text content for example) // This is a heuristic. A more robust way is to mark duplicated items. // For this script, we assume it runs once and duplicates. If it might run multiple times, add a 'data-duplicated' flag. let alreadyDuplicated = false; if (contentElement.dataset.alreadyDuplicated === "true") { alreadyDuplicated = true; } if (!alreadyDuplicated) { const currentPhrasesHtml = []; originalPhrases.forEach(phrase => currentPhrasesHtml.push(phrase.outerHTML)); currentPhrasesHtml.forEach(html => { contentElement.insertAdjacentHTML('beforeend', html); }); contentElement.dataset.alreadyDuplicated = "true"; // Mark as duplicated } // 2. Calculate widths and animation parameters *for this specific banner* // Recalculate originalPhrases to be only the first set if duplication happened. const currentAllPhrases = Array.from(contentElement.children); const actualOriginalPhraseCount = currentAllPhrases.length / 2; // Assuming successful duplication let scrollWidthOfOriginalItems = 0; for(let i=0; i < actualOriginalPhraseCount; i++) { const phrase = currentAllPhrases[i]; const style = window.getComputedStyle(phrase); scrollWidthOfOriginalItems += phrase.offsetWidth + parseFloat(style.marginLeft) + parseFloat(style.marginRight); } if (scrollWidthOfOriginalItems === 0) { console.warn("Calculated scroll width is zero for a banner. Animation might not work.", contentElement); return; // Skip if width is zero } const animationDurationMultiplier = 40; // Slower: Adjust for speed (e.g., 40 units per original item width) const animationDuration = (scrollWidthOfOriginalItems / 100) * (originalPhrases.length / 3) ; // Heuristic for duration // More consistent speed: // const pixelsPerSecond = 50; // Adjust speed // const animationDuration = scrollWidthOfOriginalItems / pixelsPerSecond; contentElement.style.setProperty("--scroll-duration", `${animationDuration}s`); contentElement.style.setProperty("--scroll-translate-x-end", `-${scrollWidthOfOriginalItems}px`); }); }); 😊 Mehr als 100.000 zufriedene Kunden 🛡️ 90-Tage-Geld-zurück-Garantie 🌍 Kostenloser weltweiter Versand Vor Nach Der Einlagenunterschied Erleben Sie den Wandel selbst und treten Sie noch heute in eine hellere, schmerzfreie Zukunft ein. Verbesserung der Körperhaltung Die richtige Unterstützung des Fußgewölbes fördert eine bessere Ausrichtung der Wirbelsäule. Leistung steigern Macht jeden Schritt federnd und erleichtert das Gehen und Laufen. Größe einstellbar Schneiden Sie einfach mit einer Schere entlang der gestrichelten Linie. Leicht waschbar Einfach von Hand mit Wasser und Seife waschen. Gebaut für alle Zwecke < > Lange Schichten Extremsportarten Herausragen Natur Läuft Leben retten Abenteuer Einkaufen Fremdenverkehr Sehen Sie sich an, wie andere ihre Massageeinlagen lieben Echte Bewertungen von echten Menschen ★★★★★ Bauarbeiter Ich verbringe meine Tage auf Betonböden in Stahlkappenstiefeln. Diese Einlegesohlen haben eine hervorragende Stoßdämpfung und Unterstützung, die die Auswirkungen auf meine Füße und Gelenke reduziert. Ich bin erstaunt, wie sehr sie mir geholfen haben. Ich habe jedem auf der Arbeit von ihnen erzählt. Erich ★★★★★ Krankenschwester Als Krankenschwester bin ich den ganzen Tag auf den Beinen. In dem Moment, in dem ich in die Schuhe schlüpfte, konnte ich den Unterschied spüren. Die Fußgewölbestütze ist großartig und sorgt für die dringend benötigte Entlastung. Die Dämpfung ist perfekt, um den ständigen Aufprall auf meine Füße zu absorbieren. Regina ★★★★★ Arbeiter im Gastgewerbe Wow, diese Einlegesohlen haben meine Erwartungen übertroffen. Ich habe sie zwei Tage lang in einer 12-Stunden-Schicht getragen und muss sagen, dass sie ein toller Fund waren. Sie sind super bequem, unterstützen einen den ganzen Tag lang und ich habe sogar noch zwei weitere Paare bestellt! Richard Die Zukunft ist fußschmerzfrei Reduzierte Fußschmerzen: Fußgewölbeunterstützung und Dämpfung helfen deutlich bei Fußschmerzen. Verbesserter Komfort: Komfort bei jedem Schritt, minimiert Ermüdung und Unbehagen. Verringerung des Verletzungsrisikos: Dämpfung und Unterstützung helfen, das Risiko von Fußverletzungen zu verringern. * Ergebnisse nach klinischen Studien/Verbraucherstudien. 🧡 Linderung von Schmerzen, Belastungen und Unbehagen 🧡 Fußgewölbestütze & Massagepunkte 🧡 Temperaturregelung und Belüftung 🧡 Stärkung des Selbstbewusstseins 🧡 Entfernt schlechten Geruch Was macht unsere Einlegesohlen so besonders? Ihr Komfort und Ihre Zufriedenheit liegen uns am Herzen. Wir sind bestrebt, Ihr tägliches Leben wirklich zu verbessern. Unsere Einlegesohlen Andere Dämpfung ✓ ✕ Atmungsaktiv ✓ ✕ Sofortige Erleichterung ✓ ✕ Gewölbestütze ✓ ✕ Schockabsorption ✓ ✕ Beseitigung von schlechten Gerüchen ✓ ✕ Kosten $$$ ✕ ✓ Sehen Sie, warum Experten unsere Massageeinlagen empfehlen Gezielte Erleichterung Als Podologe mit langjähriger Erfahrung in der Behandlung von Patienten mit Fußproblemen wie Plattfüßen und Plantarfasziitis empfehle ich diese Einlagen. Das einzigartige Design sorgt für eine gezielte Entlastung der Fußgewölbe und hilft, den Druck gleichmäßig zu verteilen und die Belastung der Plantarfaszie zu verringern. Bei regelmäßiger Anwendung bemerken die Patienten eine deutliche Verbesserung der Symptome. Ich empfehle diese Einlagen als unverzichtbare Ergänzung zu Ihrem Schuhwerk. Dr. Thomas Schneider - Podologe
More you might like
Related
Massage-Einlegesohlen
Related
Foamr® - Massage Einlegesohlen
Related
LexStep™ - Massage Einlegesohlen
Related