javascript - 事件监听器只工作一次

标签 javascript html css sass

我正在尝试创建一个滑块,并且有一个按钮用于将元素向左移动。它有效,但只有一次。之后点击无效。下面是我的代码
HTML

<section class="section3">
  <button class="left">LEFT</button> <!-- button that I click on to move elements to the left -->
  <div class="carousel-container">
    <div class="corousel-element">1</div>
    <div class="carousel-element">2</div>
    <div class="carousel-element">3</div>
    <div class="carousel-element">4</div>
    <div class="carousel-element">5</div>
    <div class="carousel-element">6</div>
    <div class="carousel-element">7</div>
    <div class="carousel-element">8</div>
    <div class="carousel-element">9</div>
    <div class="carousel-element">10</div>
    <div class="carousel-element">11</div>
    <div class="carousel-element">12</div>
    <div class="carousel-element">13</div>
  </div>
</section>
CSS(SASS)
section.section3 {
  overflow: hidden;

  div.carousel-container {
    display: flex;
    overflow: hidden;
    justify-content: center;

    div.carousel-element {
      width: 169px;
      height: 193px;
      background: blue;
      flex-shrink: 0;
    }

    div.corousel-element:not(:first-child) {
      margin-left: 15px;
    }
  }
}
java 脚本
var buttonLeft = document.querySelector(".left"); // left button
var carouselContainer = document.querySelector(".corousel-container"); // carousel-container

function left() {
  carouselContainer.style.transform = "translate(-20px)"; // here I am trying to move elements to left with translate.
}

buttonLeft.addEventListener("click", left);

最佳答案

这个怎么样? translateX(-???px)由按下左键的次数决定。

// Get HTML elements
const buttonLeft = document.querySelector(".left");
const section3 = document.querySelector(".section3");
const carouselContainer = document.querySelector(".carousel-container");
const crouselElements = document.querySelectorAll(".carousel-element");

// Moving distance of each click
const dx = -20;

// Store how many times the left button is clicked
let counter = 0;

function left() {
  // Get section3 width
  const section3Width = section3.offsetWidth;
  // Get one carousel element width = 169px
  const crouselElementWidth = crouselElements[0].offsetWidth;
  // Get sum of crousel elements width = 169px * 13
  const crouselElementsWidth = crouselElementWidth * crouselElements.length;
  // Calculate movable distance
  const moveableDistance = crouselElementsWidth - section3Width;

  // When the slider reach the last element, stop moving.
  if (Math.abs(counter * dx) > moveableDistance) return;

  // Count up by 1
  counter++;
  // Moving distance is -20px * count
  carouselContainer.style.transform = `translateX(${dx * counter}px)`;
}

buttonLeft.addEventListener("click", left);
.section3 {
  overflow: hidden;
}

.carousel-container {
  display: flex;
  /* overflow: hidden; */
  /* justify-content: center; */
  transition: transform 0.4s linear;
}

.carousel-element {
  width: 169px;
  height: 193px;
  background: blue;
  flex-shrink: 0;
}

.carousel-element:nth-child(even) {
  background: red;
}
<section class="section3">
  <button class="left">LEFT</button>
  <div class="carousel-container">
    <div class="carousel-element">1</div>
    <div class="carousel-element">2</div>
    <div class="carousel-element">3</div>
    <div class="carousel-element">4</div>
    <div class="carousel-element">5</div>
    <div class="carousel-element">6</div>
    <div class="carousel-element">7</div>
    <div class="carousel-element">8</div>
    <div class="carousel-element">9</div>
    <div class="carousel-element">10</div>
    <div class="carousel-element">11</div>
    <div class="carousel-element">12</div>
    <div class="carousel-element">13</div>
  </div>
</section>


无宽度计算

// Get HTML elements
const buttonLeft = document.querySelector(".left");
const carouselContainer = document.querySelector(".carousel-container");

// Moving distance
let x = 0;

function left() {
  // Update translateX's value every time
  carouselContainer.style.transform = `translateX(${x -= 20}px)`;
}

buttonLeft.addEventListener("click", left);
.section3 {
  overflow: hidden;
}

.carousel-container {
  display: flex;
  /* overflow: hidden; */
  /* justify-content: center; */
  transition: transform 0.4s linear;
}

.carousel-element {
  width: 169px;
  height: 193px;
  background: blue;
  flex-shrink: 0;
}

.carousel-element:nth-child(even) {
  background: red;
}
<section class="section3">
  <button class="left">LEFT</button>
  <div class="carousel-container">
    <div class="carousel-element">1</div>
    <div class="carousel-element">2</div>
    <div class="carousel-element">3</div>
    <div class="carousel-element">4</div>
    <div class="carousel-element">5</div>
    <div class="carousel-element">6</div>
    <div class="carousel-element">7</div>
    <div class="carousel-element">8</div>
    <div class="carousel-element">9</div>
    <div class="carousel-element">10</div>
    <div class="carousel-element">11</div>
    <div class="carousel-element">12</div>
    <div class="carousel-element">13</div>
  </div>
</section>

关于javascript - 事件监听器只工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66706478/

相关文章:

javascript - Winnovative HTML 到 PDF 转换器

javascript - 关闭模式对话框后将行标记为选中

c# - 如何根据登录成功在新窗口/选项卡或同一窗口/选项卡中打开页面?

javascript - 如何在knockoutjs中绑定(bind)嵌套选项

javascript - 如何使用下拉列表中的值在 javascript 中创建函数?

css - 自定义语义 UI React 字体系列,但找不到 src/site/globals/site.variables 文件来执行此操作。还有别的办法吗?

html - "Continued on next page"在 xsl 分页处

javascript - 检查 Id 元素 javascript

javascript - 为什么我的航路点添加类在向下滚动时没有删除

jquery - 如何在 jquery ui selectmenu 中对齐字符串