FootCare - Elektrischen Fußschwielenentferner
.secao { padding: 10px 0px 10px 0px; text-align: center; max-width: 1200px; margin-left: auto; margin-right: auto; } .secao-cor { padding: 10px 0px 10px 0px; text-align: center; ma rgin-left: auto; margin-right: auto; background-color: #fcf7ef; border-top: 1px solid black; border-bottom: 1px solid black; } .secao-cor-img-right { padding: 10px 5px 10px 5px; text-align: left; margin-left: auto; margin-right: auto; background-color: #fcf7ef; border-top: 1px solid black; border-bottom: 1px solid black; display: flex; align-items: center; justify-content: space-around; gap: 25px; flex-wrap: wrap; } .secao-cor-img-right-content { flex: 1; /* Permite que o container de texto ocupe o espaço disponível */ max-width: 500px; text-align: left; padding: 20px; } .secao-cor-img-right img { max-width: 350px; width: 100%; height: auto; border-radius: 10px; display: block; } .secao-com-background { margin-top: 30px; padding: 20px; max-width: 1200px; margin-left: auto; margin-right: auto; background-image: url('https://cdn.shopify.com/s/files/1/0502/6430/9916/files/3background.jpg?v=1750974433'); border-top: 1px solid black; background-size: cover; background-position: center; display: flex; align-items: center; min-height: 400px; /* Adjust as needed */ } .secao-com-background img { display: none; } .light-text { color: #1a1a1a; font-weight: lighter; } .secao-com-background-content { flex: 0 1 60%; padding: 20px; text-align: left; } .secao > img { margin-left: auto; margin-right: auto; margin-top: 0px; margin-bottom: 15px; width: 100%; max-width: 400px; border-radius: 10px; display: block; } .secao-cor > img { margin-left: auto; 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 250px; height: 250px; 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; border: 1px solid black; } .gallery-item img { width: 100%; height: 250px; 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 { color: black; border: 1px solid black; 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: #fcf7ef; } .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: 5px; padding-bottom: 10px; } .dot { width: 10px; height: 10px; border-radius: 50%; background-color: #ddd; cursor: pointer; transition: background-color 0.3s ease; } .dot.active { background-color: #fcf7ef; } .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%; padding-left: 40px; padding-right: 40px; } .tabela td.green-check { text-align: center; color: green; font-weight: bold; font-size: 125%; padding-left: 0px; padding-right: 0px; } .tabela th { background-color: white; border: 1px hidden #000; padding: 0px; } .tabela tr { border: 1px hidden #dddddd63; box-sizing: border-box; } .tabelinha { max-width: 550px; margin-left: auto; margin-right: auto; text-align: left; border-spacing: 10px; border: 1px hidden #000; } .tabelinha td { padding: 7px; border: 1px hidden #000; } .tabelinha tr { border: 1px solid #dddddd63; border-radius: 5px; box-shadow: 0px 1px 5px rgba(0, 0, 0, 0.075); box-sizing: border-box; } .tabelinha img { height: 75px; width: auto; } .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: 10px; 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: #fcf7ef; 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: #fcf7ef; /* 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: #fcf7ef; 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: #fcf7ef; } .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: #fcf7ef; } .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: 10px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; max-width: 500px; box-sizing: border-box; border-radius: 50px; background-color: #fcf7ef; } .table-panel img { width: auto; height: 25px; border-radius: 0px; display: block; } .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: 550; 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 { max-height: 700px; /* Adjust depending on content */ 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: 310px; } .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 { margin-bottom: 10px; } .lightbox-content { max-width: 95%; } .gallery-item { flex: 0 0 200px; /* Smaller items on mobile */ } .gallery-nav button { width: 35px; height: 35px; font-size: 18px; } .horizontal-review-panel img { max-height: 50px; } .secao-cor-img-right { flex-direction: column; gap: 3px; } .secao-cor-img-right-content { order: 2; text-align: center; } .secao-cor-img-right img { order: 1; margin-top: 10px; } .secao-com-background { flex-direction: column; align-items: center; text-align: center; background: #bdbdbd; background: linear-gradient(90deg, rgba(189, 189, 189, 1) 0%, rgba(249, 249, 249, 1) 50%, rgba(255, 255, 255, 1) 100%); } .secao-com-background img { display: block; /* Hide the image in the background section on mobile */ width: 100%; max-width: 300px; padding: 15px 0px 0px 0px; } .secao-com-background-content { text-align: center; padding: 0px; } } 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 videoStrip = document.querySelector(".video-strip"); const videoCarouselContainer = document.querySelector(".video-carousel-container"); const scrollLeftArrow = document.querySelector(".video-navigation .left"); const scrollRightArrow = document.querySelector(".video-navigation .right"); if (videoStrip && videoCarouselContainer && scrollLeftArrow && scrollRightArrow) { const originalVideoItems = Array.from(videoStrip.querySelectorAll(".video-item")); if (originalVideoItems.length === 0) { scrollLeftArrow.disabled = true; scrollRightArrow.disabled = true; return; } const CLONE_COUNT = originalVideoItems.length > 1 ? Math.min(Math.floor(originalVideoItems.length / 2) + 1, 5) : 0; let allVideoItems = [...originalVideoItems]; let videosInStrip = allVideoItems.map((item) => item.querySelector("video")); // Map videos once let currentOriginalIndex = 0; // Tracks the intended "original" video index let scrollTimeoutId = null; let isManuallyScrolling = false; // True if user is dragging, false if programmatic scroll let isDuringSilentJump = false; const setupCarouselClones = () => { if (CLONE_COUNT === 0) return; for (let i = 0; i < CLONE_COUNT; i++) { const originalIdxEnd = originalVideoItems.length - 1 - (i % originalVideoItems.length); const cloneEnd = originalVideoItems[originalIdxEnd].cloneNode(true); cloneEnd.dataset.isClone = "true"; cloneEnd.dataset.originalIndex = originalIdxEnd; videoStrip.insertBefore(cloneEnd, videoStrip.firstChild); const originalIdxStart = i % originalVideoItems.length; const cloneStart = originalVideoItems[originalIdxStart].cloneNode(true); cloneStart.dataset.isClone = "true"; cloneStart.dataset.originalIndex = originalIdxStart; videoStrip.appendChild(cloneStart); } allVideoItems = Array.from(videoStrip.querySelectorAll(".video-item")); videosInStrip = allVideoItems.map((item) => item.querySelector("video")); }; const getScrollLeftForCenteringItem = (itemIndexInStrip) => { if (itemIndexInStrip < 0 || itemIndexInStrip >= allVideoItems.length) return 0; const targetItem = allVideoItems[itemIndexInStrip]; const containerWidth = videoCarouselContainer.offsetWidth; const itemWidth = targetItem.offsetWidth; const itemMarginLeft = parseFloat(getComputedStyle(targetItem).marginLeft) || 0; // Calculate offsetLeft relative to the videoStrip's content edge // The scrollLeft value needed to place the item's *center* at the container's *center* return targetItem.offsetLeft + itemWidth / 2 - containerWidth / 2; }; const playVideo = (video) => { if (video && video.paused) { video.play().catch((e) => console.warn("Video play interrupted or failed:", video.src, e)); } }; const pauseVideo = (video) => { if (video && !video.paused) { video.pause(); } }; const manageVideoPlaybackAndState = () => { if (isDuringSilentJump) return; const containerRect = videoCarouselContainer.getBoundingClientRect(); const containerCenterViewport = containerRect.left + containerRect.width / 2; // Center relative to viewport let bestMatch = { videoEl: null, itemEl: null, distance: Infinity, overallIndex: -1, originalItemIndex: -1 }; // Convert containerCenter to be relative to scrollable content for comparison with item.offsetLeft const containerScrollCenter = videoStrip.scrollLeft + videoCarouselContainer.offsetWidth / 2; allVideoItems.forEach((item, index) => { const video = videosInStrip[index]; const itemCenterScroll = item.offsetLeft + item.offsetWidth / 2; // Center relative to scrollable content const distance = Math.abs(containerScrollCenter - itemCenterScroll); // Check if item is roughly visible (optimization) const itemRect = item.getBoundingClientRect(); // For visibility check only if (itemRect.right < containerRect.left || itemRect.left > containerRect.right) { pauseVideo(video); // Pause if definitely out of view return; } if (distance < bestMatch.distance) { const originalIdx = item.dataset.originalIndex !== undefined ? parseInt(item.dataset.originalIndex) : CLONE_COUNT > 0 ? index - CLONE_COUNT : index; bestMatch = { videoEl: video, itemEl: item, distance, overallIndex: index, originalItemIndex: originalIdx }; } }); const centeringThreshold = allVideoItems[0] ? allVideoItems[0].offsetWidth * 0.45 : 50; if (bestMatch.videoEl && bestMatch.distance < centeringThreshold) { videosInStrip.forEach((video, idx) => { if (idx === bestMatch.overallIndex) { playVideo(video); } else { pauseVideo(video); } }); currentOriginalIndex = bestMatch.originalItemIndex; } else { videosInStrip.forEach(pauseVideo); } updateArrowStates(); }; const performSilentJumpIfNeeded = () => { if (CLONE_COUNT === 0 || isDuringSilentJump) return; const firstOriginalItemOverallIndex = CLONE_COUNT; const lastOriginalItemOverallIndex = CLONE_COUNT + originalVideoItems.length - 1; // Determine currently centered item using similar logic to manageVideoPlaybackAndState const containerScrollCenter = videoStrip.scrollLeft + videoCarouselContainer.offsetWidth / 2; let currentOverallCenteredApprox = -1; let minDistance = Infinity; allVideoItems.forEach((item, index) => { const itemCenterScroll = item.offsetLeft + item.offsetWidth / 2; const distance = Math.abs(containerScrollCenter - itemCenterScroll); if (distance < minDistance) { minDistance = distance; currentOverallCenteredApprox = index; } }); if (currentOverallCenteredApprox === -1) return; // Should not happen if items exist // If centered on a clone at the END of the strip (representing the START of originals) if (currentOverallCenteredApprox > lastOriginalItemOverallIndex) { isDuringSilentJump = true; const originalIdxToJumpTo = parseInt(allVideoItems[currentOverallCenteredApprox].dataset.originalIndex); const targetOverallIdx = firstOriginalItemOverallIndex + originalIdxToJumpTo; videoStrip.style.scrollBehavior = "auto"; videoStrip.scrollLeft = getScrollLeftForCenteringItem(targetOverallIdx); videoStrip.offsetHeight; videoStrip.style.scrollBehavior = "smooth"; currentOriginalIndex = originalIdxToJumpTo; setTimeout(() => { isDuringSilentJump = false; manageVideoPlaybackAndState(); }, 50); } // If centered on a clone at the START of the strip (representing the END of originals) else if (currentOverallCenteredApprox < firstOriginalItemOverallIndex) { isDuringSilentJump = true; const originalIdxToJumpTo = parseInt(allVideoItems[currentOverallCenteredApprox].dataset.originalIndex); const targetOverallIdx = firstOriginalItemOverallIndex + originalIdxToJumpTo; videoStrip.style.scrollBehavior = "auto"; videoStrip.scrollLeft = getScrollLeftForCenteringItem(targetOverallIdx); videoStrip.offsetHeight; videoStrip.style.scrollBehavior = "smooth"; currentOriginalIndex = originalIdxToJumpTo; setTimeout(() => { isDuringSilentJump = false; manageVideoPlaybackAndState(); }, 50); } }; const scrollByArrow = (direction) => { if (originalVideoItems.length === 0 || isDuringSilentJump) return; let nextOriginalIndex = currentOriginalIndex + direction; if (nextOriginalIndex >= originalVideoItems.length) { nextOriginalIndex = 0; } else if (nextOriginalIndex < 0) { nextOriginalIndex = originalVideoItems.length - 1; } const targetOverallIndex = CLONE_COUNT > 0 ? CLONE_COUNT + nextOriginalIndex : nextOriginalIndex; isManuallyScrolling = false; videoStrip.scrollTo({ left: getScrollLeftForCenteringItem(targetOverallIndex), behavior: "smooth", }); }; const updateArrowStates = () => { if (originalVideoItems.length scrollByArrow(-1)); scrollRightArrow.addEventListener("click", () => scrollByArrow(1)); const handleScrollEnd = () => { if (isDuringSilentJump) return; performSilentJumpIfNeeded(); // Always check for jump after any scroll settles manageVideoPlaybackAndState(); // Then manage playback based on final position isManuallyScrolling = false; }; if ("onscrollend" in videoStrip) { videoStrip.addEventListener("scrollend", handleScrollEnd); } else { videoStrip.addEventListener("scroll", () => { // isManuallyScrolling = true; // This might be set too eagerly clearTimeout(scrollTimeoutId); scrollTimeoutId = setTimeout(handleScrollEnd, 250); }); } videoStrip.addEventListener( "touchstart", () => { isManuallyScrolling = true; }, { passive: true } ); // Initial setup setupCarouselClones(); if (originalVideoItems.length > 0) { const initialLoadAndCenter = () => { currentOriginalIndex = 0; const initialOverallIndex = CLONE_COUNT > 0 ? CLONE_COUNT : 0; videoStrip.style.scrollBehavior = "auto"; if (allVideoItems[initialOverallIndex]) { videoStrip.scrollLeft = getScrollLeftForCenteringItem(initialOverallIndex); } videoStrip.offsetHeight; videoStrip.style.scrollBehavior = "smooth"; setTimeout(() => { manageVideoPlaybackAndState(); updateArrowStates(); }, 100); }; // Simplified ready check: wait for a brief moment for layout, then init. // More robust would be to check video.readyState or images.complete if critical. setTimeout(initialLoadAndCenter, 50); } else { updateArrowStates(); } } 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!"); } }); × Beschreibung + 12x preisgekrönt Schmerzfreie Anwendung Entfernt Schwielen und abgestorbene Haut, macht die Füße weich, verhindert Risse und verbessert die allgemeine Fußgesundheit Einfache 10-minütige Behandlung für Ergebnisse Mit unserem preisgekrönten FootCare elektrischer Fußschwielenentferner entfernen Sie Schwielen, raue Stellen und abgestorbene Haut und sorgen so für glatte Füße! Genießen Sie ein Fußpflegeerlebnis in Spa-Qualität zu Hause oder unterwegs. Erleben Sie eine Ablage in Spa-Qualität zu Hause oder unterwegs! Erweiterte Funktionen: 360-Grad-Drehung: Sorgt für ein gründliches Peeling aus allen Winkeln. Doppelte Geschwindigkeitseinstellungen: Anpassbar für unterschiedliche Schweregrade der Hornhaut. Schmerzfreier Komfort: Entfernt sanft Hornhaut, ohne die gesunde Haut zu verletzen. Regelmäßige Anwendung für weiche, gesunde Füße. Kompakt, tragbar und einfach in der Anwendung ist es perfekt für Ihre Fußpflege-Routine. Erleben Sie sichtbare Ergebnisse in nur wenigen Wochen! Wie schnell kann ich Ergebnisse erwarten? + Der FootCare elektrischer Fußschwielenentferner bietet sofortige und dauerhafte Vorteile für Ihre Füße. Sofortige Wirkung: Erleben Sie sofort nach der ersten Anwendung glattere, weichere Füße, die Schwielen und raue Stellen sichtbar reduzieren. Kurzfristige Vorteile: Innerhalb der ersten Tage bemerken die meisten Anwender eine deutlich verbesserte Hautbeschaffenheit, weichere Füße und die Vermeidung von Rissen und Trockenheit. Langfristige Vorteile: Nach einer Woche regelmäßiger Anwendung genießen Sie glatte, gesunde Füße mit einer dauerhaften Verringerung von Hornhaut und rauer Haut, die tiefgreifende, dauerhafte Ergebnisse gewährleistet. Wie zu verwenden + Beginnen Sie mit sauberen Füßen: Waschen und trocknen Sie Ihre Füße gründlich. Trennen Sie Ihre Füße: Teilen Sie Ihre Füße für die Behandlung in überschaubare Abschnitte ein. Behandeln Sie jeden Bereich: Verwenden Sie das Gerät auf jedem Abschnitt für 3 Minuten. Passen Sie die Geschwindigkeitseinstellung je nach Schwere der Schwielen an. Hohe Geschwindigkeit: Für harte Schwielen. Niedrige Geschwindigkeit: Für sanftes Peeling. Feuchtigkeitspflege: Zum Schluss eine feuchtigkeitsspendende Fußcreme auftragen, um die Feuchtigkeit einzuschließen und die Geschmeidigkeit zu erhalten. Die besten Ergebnisse erzielen Sie mit Ihrer regelmäßigen Fußpflege. Ist die Verwendung sicher? + Ja, der elektrische Fußschwielenentferner von FootCare ist bei bestimmungsgemäßem Gebrauch sicher. Er wurde von Experten entwickelt und gründlich auf Sicherheit und Wirksamkeit getestet. Tausende von zufriedenen Kunden auf der ganzen Welt vertrauen auf seine Fähigkeit, glatte, weiche Füße zu bekommen, ohne Schaden anzurichten. Lesen Sie vor dem Gebrauch immer die vollständige Gebrauchsanweisung, um einen ordnungsgemäßen und sicheren Betrieb zu gewährleisten. Gesehen in Echte Kunden, reale Ergebnisse < > *Individuelle Ergebnisse können variieren. Die Haut eines jeden Menschen ist einzigartig und kann unterschiedlich auf unsere Produkte reagieren. Verabschieden Sie sich von Schwellungen und trockenen Flecken Entfernt Schwielen Entfernt effizient hartnäckige Schwielen und sorgt für glatte, weiche Füße nach nur einer Anwendung. Mildert raue Flecken Sanftes Peeling, um raue Stellen zu mildern und die Haut glatt und gesund zu erhalten. Verhindert Risse und Trockenheit Beugt Rissen und Trockenheit vor, indem es die Füße gut belüftet und mit Feuchtigkeit versorgt und so für dauerhaften Komfort und Gesundheit sorgt. Erleben Sie diese Ergebnisse nach nur einer Anwendung mit dem FootCare elektrischen Fußschwielenentferner. Optimieren Sie Ihre Routine Die besten Ergebnisse erzielen Sie, wenn Sie den FootCare elektrischen Fußschwielenentferner regelmäßig verwenden. Unser Produkt ist so konzipiert, dass es bei allen Hauttypen effektiv funktioniert. Wenn Sie das Gerät in Ihre Fußpflegeroutine integrieren, wird die Haut glatter und feuchtigkeitsspendend, und die Ergebnisse werden bis zu 3 bis 5 Mal schneller sichtbar. Kunden lieben es, wie weich und verjüngt sich ihre Füße anfühlen, nachdem sie den FootCare elektrischen Fußschwielenentferner benutzt haben. Erleben Sie die Vorteile von glatten, gesunden Füßen, indem Sie es zu einem Teil Ihrer wöchentlichen Kur machen. Was Menschen wie Sie sagen ★★★★★ Ich habe gerade meinen Fußfeiler erhalten und schon bei der ersten Anwendung waren die Ergebnisse erstaunlich, ich hätte nicht erwartet, dass er so gut sein würde! Ich werde ihn sicher auch für meine Mutter kaufen. Emma ★★★★★ Das ist einfach unglaublich! Ich war anfangs ziemlich skeptisch, aber nach der ersten Anwendung kann ich einen großen Unterschied in der Textur und Klarheit meiner Haut sehen. Perfekt! Ich danke Ihnen! Mia ★★★★★ Ich liebe es, wie einfach es zu benutzen ist. Die Risse, die ich an meinem Fuß habe, waren ziemlich schlimm, aber das hier hat sie einfach weggemacht, als wäre es nichts! Ich empfehle dies sehr, mein einziges Bedauern ist nicht immer diese früher. Jenna Häufig gestellte Fragen Ist der FootCare elektrische Fußschwielenentferner sicher in der Anwendung? + Ja, es ist sicher, wenn es wie vorgeschrieben verwendet wird. Es wurde von Experten entwickelt und auf Sicherheit und Wirksamkeit getestet. Lesen Sie vor der Anwendung immer die Gebrauchsanweisung. Wie oft sollte ich das Gerät benutzen? + Die besten Ergebnisse erzielen Sie, wenn Sie den Hornhautentferner je nach Schwere der Hornhaut und der rauen Stellen ein- bis zweimal pro Woche anwenden. Kann es auf nassen Füßen verwendet werden? + Ja, der elektrische Fußschwielenentferner von FootCare ist wasserfest und kann sowohl für trockene als auch für nasse Füße verwendet werden. Wie kann ich das Gerät reinigen? + Nehmen Sie den Rollenkopf nach jedem Gebrauch ab und spülen Sie ihn unter fließendem Wasser ab. Trocknen Sie ihn gründlich, bevor Sie ihn wieder anbringen. Ist es für alle Hauttypen geeignet? + Ja, das Gerät ist so konzipiert, dass es für alle Hauttypen, auch für empfindliche Haut, sanft und effektiv ist. Wie schnell kann ich Ergebnisse erwarten? + Schon nach der ersten Anwendung können Sie glattere und weichere Füße feststellen. Eine regelmäßige Anwendung sorgt für langfristige Vorteile. Was ist in dem Paket enthalten? + Das Paket wird geliefert mit: 1x FootCare - Elektrischer Fuß Hornhautentferner 60x Schleifpapierscheibe 1x Kabel Was ist, wenn ich mit dem Produkt nicht zufrieden bin? + Wir bieten eine 30-tägige Geld-zurück-Garantie. Wenn Sie mit Ihren Ergebnissen nicht zufrieden sind, können Sie den Zauberstab gegen volle Rückerstattung zurückgeben. Kann ich das Gerät auf Reisen mitnehmen? + Ja, sein kompaktes und tragbares Design macht ihn perfekt für Reisen.