You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS滚动画廊脚本仅单实例生效,多画廊适配问题求助

多画廊滚动失效问题

我跟着教程做了一个可滚动画廊,第一个画廊运行正常,但复制并修改类名/ID后,另外两个画廊完全无法滚动。

可正常运行的代码

JavaScript

let scrollContainer= document.querySelector (".gallery")
let arrowLeft = document.getElementById("arrowLeft")
let arrowRight = document.getElementById("arrowRight")

scrollContainer.addEventListener ("wheel", (evt) => {
  evt.preventDefault ();
  scrollContainer.scrollLeft +=evt.deltaY;
});

arrowLeft.addEventListener ("click", () => {
  scrollContainer.style.scrollBehavior = "smooth";
  scrollContainer.scrollLeft -= 900;
});

arrowRight.addEventListener ("click", () => {
  scrollContainer.style.scrollBehavior = "smooth";
  scrollContainer.scrollLeft += 900;
});

HTML

<section id="Welcome">
  <h2>
    Welcome
  </h2>
  <div class="gallery-wrap">
    <img id="arrowLeft" src="images/arrow_left.jpg">
    <div class="gallery">
      <div>
        <span >
          <a href="https://www.hdm-stuttgart.de/">
            <img src="images/audiovisualmedia.jpg">
            <p>
              Placeholder
            </p>
          </a>
        </span>
        <span>
          <img src="images/hdm.jpg">
        </span>
        <span>
          <img src="images/hdm_building.jpg">
        </span>
        <span>
          <img src="images/mobilemedia.jpg">
      </div>
      <div>
        <span>
          <img src="images/audiovisualmedia.jpg">
        </span>
        <span>
          <img src="images/hdm.jpg">
        </span>
        <span>
          <img src="images/hdm_building.jpg">
        </span>
        <span>
          <img src="images/mobilemedia.jpg">
      </div>
    </div>
    <img id="arrowRight"src="images/arrow_right.png">
  </div>            
</section>

无法滚动的代码(修改后)

JavaScript

let scrollContainer= document.querySelector (".gallery2")
let arrowLeft2 = document.getElementById("arrowLeft2")
let arrowRight2 = document.getElementById("arrowRight2")

scrollContainer.addEventListener ("wheel", (evt) => {
  evt.preventDefault ();
  scrollContainer.scrollLeft +=evt.deltaY;
});

arrowLeft2.addEventListener ("click", () => {
  scrollContainer.style.scrollBehavior = "smooth";
  scrollContainer.scrollLeft -= 900;
});

arrowRight2.addEventListener ("click", () => {
  scrollContainer.style.scrollBehavior = "smooth";
  scrollContainer.scrollLeft += 900;
});

HTML

<section id="Cocktails">
  <h2>
    Cocktails
  </h2>
  <div class="gallery-wrap2">
    <img id="arrowLeft2" src="images/arrow_left.jpg">
    <div class="gallery2">
      <div>
        <span >
          <a href="https://www.hdm-stuttgart.de/">
            <img src="images/audiovisualmedia.jpg">
            <p> Placeholder</p>
          </a>
        </span>
        <span>
          <img src="images/hdm.jpg">
        </span>
        <span>
          <img src="images/hdm_building.jpg">
        </span>
        <span>
          <img src="images/mobilemedia.jpg">
      </div>
      <div>
        <span>
          <img src="images/audiovisualmedia.jpg">
        </span>
        <span>
          <img src="images/hdm.jpg">
        </span>
        <span>
          <img src="images/hdm_building.jpg">
        </span>
        <span>
          <img src="images/mobilemedia.jpg">
      </div>
    </div>
    <img id="arrowRight2"src="images/arrow_right.png">
  </div>            
</section>

解决办法

1. 同步修改CSS样式

第一个画廊的.gallery和.gallery-wrap肯定设置了关键滚动样式(比如横向溢出、弹性布局),你只改了HTML和JS的类名,但.gallery2和.gallery-wrap2没有对应的CSS,这是核心问题。给新画廊添加和原画廊一致的样式:

.gallery2 {
  display: flex;
  overflow-x: auto;
  scrollbar-width: none; /* 可选:隐藏滚动条 */
}
.gallery2::-webkit-scrollbar {
  display: none; /* 可选:隐藏webkit内核浏览器滚动条 */
}
.gallery2 > div {
  display: flex;
  gap: 1rem; /* 和原画廊保持一致的间距 */
  flex-shrink: 0;
}
.gallery-wrap2 {
  display: flex;
  align-items: center;
  gap: 1rem;
}

2. 避免变量名冲突

如果三个画廊的JS代码放在同一个文件里,重复使用scrollContainer变量会导致后面的覆盖前面的,最终只有最后一个画廊生效。建议用批量处理的方式,不用重复写代码:

// 批量绑定所有画廊的事件
document.querySelectorAll('.gallery-wrap, .gallery-wrap2').forEach(wrap => {
  const scrollContainer = wrap.querySelector('[class^="gallery"]');
  const arrowLeft = wrap.querySelector('[id^="arrowLeft"]');
  const arrowRight = wrap.querySelector('[id^="arrowRight"]');

  scrollContainer.addEventListener('wheel', (evt) => {
    evt.preventDefault();
    scrollContainer.scrollLeft += evt.deltaY;
  });

  arrowLeft.addEventListener('click', () => {
    scrollContainer.style.scrollBehavior = 'smooth';
    scrollContainer.scrollLeft -= 900;
  });

  arrowRight.addEventListener('click', () => {
    scrollContainer.style.scrollBehavior = 'smooth';
    scrollContainer.scrollLeft += 900;
  });
});

只要后续画廊保持相同的结构(包裹容器+箭头+画廊元素),就能自动绑定事件,不用再写重复代码。

3. 检查元素加载顺序

打开浏览器控制台(F12),如果看到Cannot read properties of null的错误,说明JS代码在HTML元素加载前执行了。解决办法:把JS代码放在</body>标签前,或者用DOMContentLoaded包裹:

document.addEventListener('DOMContentLoaded', () => {
  // 这里放你的画廊JS代码
});

内容的提问来源于stack exchange,提问作者Tarasynora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:37:02