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

Django模板For循环动态产品卡片实现6项/屏带前后按钮轮播方法

Django模板实现产品卡片轮播(每屏6项+前后按钮切换)

以下是基于你现有代码修改的完整实现方案,无需引入第三方轮播库,原生代码即可跑通:

1. 修改HTML模板结构

外层新增轮播容器、可视视口、滑动轨道和前后按钮,保留原有Django循环逻辑不变,调整列占比适配6项/屏的需求,同时修正了你原有代码里的标签嵌套错误:

<!-- 轮播外层容器 -->
<div class="product-carousel" style="position: relative; padding: 0 40px;">
  <!-- 前切按钮 -->
  <button class="carousel-btn carousel-prev" style="left: 0;">‹</button>
  
  <!-- 轮播可视视口 -->
  <div class="carousel-viewport" style="overflow: hidden; width: 100%;">
    <!-- 滑动轨道 -->
    <div class="carousel-track" style="display: flex; transition: transform 0.3s ease;">
      {% for product in categoryname %}
      <!-- 产品卡片项,每屏6个所以单张宽度1/6 -->
      <div class="col" style="width: 16.666%; flex-shrink: 0; padding: 10px;">
        <div class="card shadow-sm" style="width: 100%;height: 450px;">
          <img class="card-img-top" style="cursor:pointer;height:60%; width:100%;"
              data-product="{{ product.Productid }}"
              onclick=location.href="{% url 'detail' product.Productid %}" src="{{product.Icon}}"
              alt="Card image cap">
          <div class="card-body">
            <h5 class="card-title" style="color: black; font-size: 20px;">{{product.Name}}</h5>
            <p class="card-text" id="price">{{product.Price}}</p>
            <span class="card-text" id="half" style="color: lawngreen;">{% widthratio product.Price 2 1 %}
            </span> <span style="color: orange;">First order price</span>
          </div>
        </div>
      </div>
      {% endfor %}
    </div>
  </div>

  <!-- 后切按钮 -->
  <button class="carousel-btn carousel-next" style="right: 0;">›</button>
</div>

2. 补充公共CSS样式

你可以把这段样式放到页面的<style>标签里,或者公共CSS文件中:

.carousel-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: none;
  background: rgba(0,0,0,0.7);
  color: #fff;
  font-size: 20px;
  cursor: pointer;
  z-index: 10;
}
.carousel-btn:hover {
  background: rgba(0,0,0,0.9);
}
/* 响应式适配:小于768px时每屏2个 */
@media (max-width: 768px) {
  .carousel-track .col {
    width: 50%;
  }
}

3. 添加JavaScript交互逻辑

放到页面的<script>标签底部即可:

document.addEventListener('DOMContentLoaded', function() {
  const track = document.querySelector('.carousel-track');
  const prevBtn = document.querySelector('.carousel-prev');
  const nextBtn = document.querySelector('.carousel-next');
  const items = document.querySelectorAll('.carousel-track .col');
  let itemWidth = items[0].offsetWidth;
  // 按屏幕宽度自动适配每屏展示数量
  let itemsPerView = window.innerWidth > 768 ? 6 : 2;
  let maxOffset = (items.length - itemsPerView) * itemWidth;
  let currentOffset = 0;

  // 下一页逻辑
  nextBtn.addEventListener('click', function() {
    currentOffset -= itemWidth * itemsPerView;
    if (currentOffset < -maxOffset) currentOffset = -maxOffset;
    track.style.transform = `translateX(${currentOffset}px)`;
  });

  // 上一页逻辑
  prevBtn.addEventListener('click', function() {
    currentOffset += itemWidth * itemsPerView;
    if (currentOffset > 0) currentOffset = 0;
    track.style.transform = `translateX(${currentOffset}px)`;
  });

  // 窗口大小变化时重新计算参数,避免布局错乱
  window.addEventListener('resize', function() {
    itemWidth = items[0].offsetWidth;
    itemsPerView = window.innerWidth > 768 ? 6 : 2;
    maxOffset = (items.length - itemsPerView) * itemWidth;
    // 修正当前偏移量避免超出边界
    currentOffset = currentOffset < -maxOffset ? -maxOffset : currentOffset;
    currentOffset = currentOffset > 0 ? 0 : currentOffset;
    track.style.transform = `translateX(${currentOffset}px)`;
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:45:03