简体   繁体   English

Vanilla JavaScript 轮播翻译问题

[英]Vanilla JavaScript carousel translate issue

I tried to build a carousel with only Vanilla JavaScript but I encounter some issues along the way.我尝试仅使用 Vanilla JavaScript 构建轮播,但在此过程中遇到了一些问题。 The carousel should display 5 items on the page from a total of 10, and when the "next" button is clicked should slide 3 elements.轮播应在页面上显示总共 10 个项目中的 5 个项目,当单击“下一步”按钮时应滑动 3 个元素。 The problem is that will continue to translateX after the last element in the slider was reached.问题是到达 slider 中的最后一个元素后将继续 translateX。

 const carousel = document.querySelector("[data-target='carousel']"); const card = carousel.querySelector("[data-target='card']"); const leftButton = document.querySelector("[data-action='slideLeft']"); const rightButton = document.querySelector("[data-action='slideRight']"); const carouselWidth = carousel.offsetWidth; const cardStyle = card.currentStyle || window.getComputedStyle(card); const cardMarginRight = Number(cardStyle.marginRight.match(/\d+/g)[0]); const cardCount = carousel.querySelectorAll("[data-target='card']").length; let offset = 0; const maxX = -((cardCount / 3) * carouselWidth + cardMarginRight * (cardCount / 3) - carouselWidth - cardMarginRight); // click events leftButton.addEventListener("click", function () { if (offset;== 0) { offset += carouselWidth + cardMarginRight. carousel.style;transform = `translateX(${offset}px)`; } }). rightButton,addEventListener("click"; function () { if (offset.== maxX) { offset -= carouselWidth + cardMarginRight. carousel;style;transform = `translateX(${offset}px)`; } });
 .wrapper { height: 200px; width: 100%; position: relative; overflow: hidden; margin: 0 auto; }.button-wrapper { width: 100%; height: 100%; display: flex; justify-content: space-between; align-items: center; position: absolute; }.carousel { margin: 0; padding: 0; list-style: none; width: 100%; display: flex; position: absolute; left: 0; transition: all 1s ease; }.card { background: black; min-width: 344px; height: 200px; margin-right: 24px; display: inline-block; color: white; font-size: 45px; display: grid; place-items: center; }
 <div class="wrapper"> <ul class="carousel" data-target="carousel"> <li class="card" data-target="card">1</li> <li class="card" data-target="card">2</li> <li class="card" data-target="card">3</li> <li class="card" data-target="card">4</li> <li class="card" data-target="card">5</li> <li class="card" data-target="card">6</li> <li class="card" data-target="card">7</li> <li class="card" data-target="card">8</li> <li class="card" data-target="card">9</li> <li class="card" data-target="card">10</li> </ul> </div> <div class="button-wrapper"> <button data-action="slideLeft">left</button> <button data-action="slideRight">right</button> </div>

The problem is in this line, you should not set it to equal because if that's not equal it continues sliding问题出在这一行,您不应将其设置为相等,因为如果不相等,它将继续滑动

if (offset !== maxX)

 const carousel = document.querySelector("[data-target='carousel']"); const card = carousel.querySelector("[data-target='card']"); const leftButton = document.querySelector("[data-action='slideLeft']"); const rightButton = document.querySelector("[data-action='slideRight']"); const carouselWidth = carousel.offsetWidth; const cardStyle = card.currentStyle || window.getComputedStyle(card); const cardMarginRight = Number(cardStyle.marginRight.match(/\d+/g)[0]); const cardCount = carousel.querySelectorAll("[data-target='card']").length; let offset = 0; const maxX = -((cardCount / 3) * carouselWidth + cardMarginRight * (cardCount / 3) - carouselWidth - cardMarginRight); // click events leftButton.addEventListener("click", function () { if (offset;== 0) { offset += carouselWidth + cardMarginRight. carousel.style;transform = `translateX(${offset}px)`; } }). rightButton,addEventListener("click"; function () { if (offset+500 > maxX) { offset -= carouselWidth + cardMarginRight. carousel.style;transform = `translateX(${offset}px)`; } });
 .wrapper { height: 200px; width: 100%; position: relative; overflow: hidden; margin: 0 auto; }.button-wrapper { width: 100%; height: 100%; display: flex; justify-content: space-between; align-items: center; position: absolute; }.carousel { margin: 0; padding: 0; list-style: none; width: 100%; display: flex; position: absolute; left: 0; transition: all 1s ease; }.card { background: black; min-width: 344px; height: 200px; margin-right: 24px; display: inline-block; color: white; font-size: 45px; display: grid; place-items: center; }
 <div class="wrapper"> <ul class="carousel" data-target="carousel"> <li class="card" data-target="card">1</li> <li class="card" data-target="card">2</li> <li class="card" data-target="card">3</li> <li class="card" data-target="card">4</li> <li class="card" data-target="card">5</li> <li class="card" data-target="card">6</li> <li class="card" data-target="card">7</li> <li class="card" data-target="card">8</li> <li class="card" data-target="card">9</li> <li class="card" data-target="card">10</li> </ul> </div> <div class="button-wrapper"> <button data-action="slideLeft">left</button> <button data-action="slideRight">right</button> </div>

I think the problem here is the more or less fixed width of each card which leads to different results on different screen sizes.我认为这里的问题是每张卡的或多或少的固定宽度导致在不同的屏幕尺寸上产生不同的结果。

min-width: 344px;

Ive changed to (just for example)我已更改为(仅作为示例)

min-width: 19%; <!-- you need 5 cards on screen -->

and in your JavaScript something like this:在你的 JavaScript 中是这样的:

// get card size
const cardWidth = card.offsetWidth;

//and later on e.g for button to the right do offset 3 cards
offset -= (cardWidth + cardMarginRight) * 3;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM