我想出的是,它似乎运行幻灯片功能两次滑动,每隔一段时间,我能够得到正确的行为,但它是如此不可预测.它似乎只有在我勉强滑动的情况下才能使用.我试过更改所需的最小刷屏距离,没有问题.请救救我!

const slider = document.querySelector('.slider');
const sliderContainer = document.querySelector('.sliderContainer');
const items = document.querySelectorAll('.item');
const rowGap = (window.innerWidth / 2); // Adjust this value based on your desired row gap

let currentIndex = 0;
let index = 0;
let touchStartX = 0;
let touchStartY = 0;

// Calculate the total width of all items, including the row gap
const totalItemsWidth = Array.from(items).reduce((total, item) => {
  const itemStyle = getComputedStyle(item);
  const itemWidth = item.offsetWidth + parseFloat(itemStyle.marginLeft) + parseFloat(itemStyle.marginRight);
  return total + itemWidth + rowGap;
}, 0);

// Set the width of the slider container to accommodate all items
sliderContainer.style.width = `${totalItemsWidth}px`;



function slideTo(index, swipe) {
  let translation;
if (currentIndex == 2 && swipe != true) {
    console.log(currentIndex + index);
    index = 0;
}

  if (index < 0 || index >= items.length) {
    return;
  }

  translation = index * (items[0].offsetWidth + rowGap);
  sliderContainer.style.transform = `translateX(-${translation}px)`;
  currentIndex = index;
  return;
}

function slideNext(swipe) {
  slideTo(currentIndex + 1, swipe);
}

function slidePrev(swipe) {
  slideTo(currentIndex - 1, swipe);
}

setInterval(slideNext, 8500); // Automatically slide every 4.5 seconds

slider.addEventListener('touchstart', handleTouchStart);
slider.addEventListener('touchmove', handleTouchMove);
slider.addEventListener('touchend', handleTouchEnd);

function handleTouchStart(event) {
  touchStartX = event.touches[0].clientX;
}

function handleTouchMove(event) {
    event.preventDefault(); // Prevent default scrolling behavior
    const touchX = event.touches[0].clientX;
    const touchDiff = touchX - touchStartX;
  
    console.log("hi")
  if (touchDiff > 50) {
    slidePrev(true);
  } else if (touchDiff < -50) {
    slideNext(true);
  }
}

function handleTouchEnd() {
  touchStartX = 0;
}
.slider {
    margin: auto;
    display: flex;
    width: fit-content;
    overflow: hidden;
    gap: 50vw;
    position: relative;
    left: 1%;
}
  
.sliderContainer {
    display: flex;
    transition: transform 0.3s ease;
    padding-bottom: 3vh;
    position: relative;
}

.sliderWrapper {
    height: auto;
    width: 99.5%;
    overflow: hidden;
    background-color: white;
    border: 1px solid #E28C4A;
}

.sliderWrapper h1 {
    font-size: 11vmin;
    margin: 15px 0 15px 0;
    color: #9D000D;
}

.item {
    flex: 0 0 300px;
    display: flex;
    flex-direction: column;
}

.item img {
    width: 97%;
    border-radius: 15px;
}

.item > button {
    width: 95%;
}

.item h2 {
    min-width: 340px;
    font-size: 30px;
    margin: 7px 0 15px 0;
}
<div class="sliderWrapper">
        <h1>What's Popular</h1>
    <div class="sliderContainer">
        <div class="slider">
            <div id="butterPecan" class="item">
                <div class="textWrapper">
                    <img src="Images/Butter-Pecan-Mobile.webp">
                    <h2>Butter Pecan</h2>
                </div>
                <button>Order ahead</button>
            </div>
            <div class="item">
                <div class="textWrapper">
                    <img id="mintChocolate" src="Images/Mint-Chocolate-Chip-Mobile.webp">
                    <h2>Mint Chocolate Chip</h2>
                </div>
                <button>Order ahead</button>
            </div>
            <div class="item">
                <div class="textWrapper">
                    <img id="peanutButter" src="Images/Peanut-Butter-Chippy-Mobile.webp">
                    <h2>Peanut Butter Chippy</h2>
                </div>
                <button>Order ahead</button>
            </div>
        </div>
    </div>
</div>

推荐答案

您已经将您的handleTouchMove函数设置为每次用户移动手指时都会触发.在函数内部,测量相对于手势开始位置的位移.如果位移超过50像素,则会触发幻灯片更改.

一旦位移达到50,随后的每一次移动都会触发更改,这解释了您观察到的行为:

touchDiff -11.25, no change
touchDiff -12.5, no change
touchDiff -20, no change
touchDiff -25, no change
touchDiff -27.5, no change
touchDiff -33.75, no change
touchDiff -43.75, no change
touchDiff -50, no change
touchDiff -51.25, switching to next slide
touchDiff -57.5, switching to next slide
touchDiff -60, switching to next slide
touchDiff -71.25, switching to next slide
touchDiff -72.5, switching to next slide
touchDiff -75, switching to next slide

根据您认为合适的用户体验,您可以:

  • 每次触发幻灯片时,将位移重置为0
  • 防止每个手势有多个幻灯片

要重置置换,请将touchStartX设置为touchX.你不需要touchend监听者.

slider.addEventListener('touchstart', handleTouchStart);
slider.addEventListener('touchmove', handleTouchMove);

function handleTouchStart(event) {
    touchStartX = event.touches[0].clientX;
}

function handleTouchMove(event) {
    event.preventDefault();
    const touchX = event.touches[0].clientX;
    const touchDiff = touchX - touchStartX;

    if (touchDiff > 150) {
        slidePrev(true);
        touchStartX = touchX;
    }
    else if (touchDiff < -150) {
        slideNext(true);
        touchStartX = touchX;
    }
}

为了防止多张幻灯片,引入了一个新的变量来跟踪用户是否刷过:

slider.addEventListener('touchstart', handleTouchStart);
slider.addEventListener('touchmove', handleTouchMove);

let canSlide = true;

function handleTouchStart(event) {
    touchStartX = event.touches[0].clientX;
    canSlide = true;
}

function handleTouchMove(event) {
    event.preventDefault();

    if (!canSlide) return;

    const touchX = event.touches[0].clientX;
    const touchDiff = touchX - touchStartX;

    if (touchDiff > 50) {
        slidePrev(true);
        canSlide = false;
    }
    else if (touchDiff < -50) {
        slideNext(true);
        canSlide = false;
    }
}

Javascript相关问答推荐

如何循环访问对象数组并以关键值形式获得结果?

为什么从liveWire info js代码传递数组我出现错误?

微软Edge Select 间隙鼠标退出问题

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

通过在页面上滚动来移动滚动条

为什么!逗号和空格不会作为输出返回,如果它在参数上?

在带有背景图像和圆形的div中添加长方体阴影时的重影线

如何将react—flanet map添加到remixjs应用程序

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

如果Arrow函数返回函数,而不是为useEffect返回NULL,则会出现错误

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

当使用';字母而不是与';var#39;一起使用时,访问窗口为什么返回未定义的?

Angular 形式,从DOM中删除不会删除指定索引处的内容,但会删除最后一项

在VS代码上一次设置多个变量格式

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

如何访问此数组中的值?

我想使用GAS和HTML将从Electron 表格中获得的信息插入到文本字段的初始值中

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

不协调嵌入图片

如何使pdf.js上的文本呈现为可选?