javascript - 如何使用 Vue.js 在 JavaScript 中循环使用表格制作的轮播
问题描述
我尝试使用表格制作自定义轮播,但我很困惑如何在点击最后一个标签后制作我的轮播循环(在这种情况下,最后一个标签表示td
元素的最后一个)。目前我已经成功让它自动播放,但是当自动播放到达最后一个项目时,我很困惑如何让它循环。
为了您的信息,我正在使用 Vue.js 来制作它,如果您想尝试它,这就是沙箱
这是我的模板:
<template>
<div class="merchandise-item-wrapper">
<table class="merchandise-table">
<tr id="customWrapper">
<td
:class="index == 0 ? 'item-store active' : 'item-store'"
v-for="(j, index) in 6"
:key="index"
>
<div>
<div
class="portfolio-img bg-white position-relative text-center overflow-hidden"
>
<img
class="merchandise-img"
src="https://via.placeholder.com/300x300"
/>
</div>
<div style="padding-top: 3vh;">
<div class="portfolio-hover-main text-center">
<div class="portfolio-hover-box align-middle">
<div
class="portfolio-hover-content position-relative"
>
<div class="row text-left">
<div class="col-4">
<p class="merchandise-category">
Kode Pesanan
</p>
</div>
<div class="col-1">
<p class="merchandise-category">:</p>
</div>
<div class="col-7">
<p class="merchandise-code">
Putih (TS1), Hitam (TS2), Navy (TS3)
</p>
</div>
</div>
<div class="row text-left">
<div class="col-4">
<p class="merchandise-category">
Deskripsi
</p>
</div>
<div class="col-1">
<p class="merchandise-category">:</p>
</div>
<div class="col-7">
<p class="merchandise-text number-of-lines-3">
Lorem ipsum dolor sit amet consectetur,
adipisicing elit. Nostrum, porro! Illo
facere soluta molestiae repellat odio porro
id est tenetur nesciunt, ea, similique
consequuntur? Voluptate dolorum explicabo
quo quaerat deserunt?
</p>
</div>
</div>
<div class="row text-left">
<div class="col-4">
<p class="merchandise-category">Harga</p>
</div>
<div class="col-1">
<p class="merchandise-category">:</p>
</div>
<div class="col-7">
<p class="merchandise-price">Rp 80.000</p>
</div>
</div>
<div class="row text-left">
<div class="col-4">
<p class="merchandise-category">Ukuran</p>
</div>
<div class="col-1">
<p class="merchandise-category">:</p>
</div>
<div class="col-7">
<p class="merchandise-size">XS - XXL</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</td>
</tr>
</table>
</div>
</template>
这是我的风格:
.merchandise-item-wrapper {
overflow: hidden;
overflow-x: auto;
}
.merchandise-table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
}
.merchandise-table td {
padding: 0px 8px;
width: 100%;
min-width: 380px;
max-width: 400px;
}
.item-store {
transform: scale(0.75);
}
.item-store.active {
transform: scale(1);
}
这些是我实现自动播放的方法:
methods: {
itemSlider() {
let autoScroller = document.getElementById("customWrapper");
let item = autoScroller.getElementsByTagName("td");
let multiplier = 0;
let imgScaller = 0;
let imgPointer = 0;
setInterval(function() {
console.log("cek start : ", multiplier);
if (item[imgPointer + 1].classList != undefined) {
autoScroller.style.transform = `translateX(${-380 * multiplier}px)`;
}
for (let i = 0; i < item.length; i++) {
if (item[imgPointer + 1].classList != undefined && i == imgScaller) {
imgPointer = i;
}
}
item[imgPointer].classList.remove("active");
if (imgPointer < item.length - 1) {
item[imgPointer + 1].classList.add("active");
console.log("cek pointer if : ", imgPointer);
}
if (multiplier < item.length - 1) {
multiplier++;
imgScaller++;
console.log("cek update : ", multiplier);
} else {
console.log("last update : ", multiplier);
item[imgPointer].classList.remove("active");
multiplier = 0;
imgScaller = 0;
imgPointer = 0;
item[imgPointer].classList.add("active");
}
}, 3000);
}
},
mounted() {
this.itemSlider();
}
在打到最后一节后,我很困惑找到循环卡的方法,目前,我只能将其移回第一个位置。
解决方案
终于我可以解决这个问题了,这个答案是给和我有同样问题的你,
对于无限循环,您需要通过克隆要附加动态索引的元素(在我的情况下)来解决它,所以我调整我的代码直到看起来像这样
itemSlider() {
let autoScroller = document.getElementById("customWrapper");
let item = autoScroller.getElementsByTagName("td");
let multiplier = 0;
let imgScaller = 0;
setInterval(function() {
if (item[imgScaller + 1].classList != undefined) {
autoScroller.style.transform = `translateX(${-380 * multiplier}px)`;
}
if (imgScaller - 1 != -1 && imgScaller != 0) {
let firstSlide = item[imgScaller - 1];
let cloneFirst = firstSlide.cloneNode(true);
autoScroller.appendChild(cloneFirst);
}
if (imgScaller) {
item[imgScaller + 1].classList.add("active");
}
if (imgScaller - 1 != -1) {
item[imgScaller].classList.remove("active");
item[imgScaller - 1].classList.remove("active");
}
multiplier++;
imgScaller++;
}, 3000);
}
但是如果你知道我只是想知道如果你从性能上看我的代码已经足够了吗?因为我只追加它而不删除最旧的?,如果你能优化它会对我有很大帮助,谢谢
推荐阅读
- python-3.x - 子进程 Popen 找不到“播放”
- python - 由 gunicorn 运行的 Flask 应用程序在一段时间后被挂起
- asp.net-core - ASP .NET Core webapi 在中间件中设置 cookie
- javascript - if条件的奇怪执行
- google-analytics - 即使该维度的数据不可用,也可以从 Google Analytics 获取维度数据
- gzip - Flink如何容错将数据下沉到hdfs作为gzip压缩?
- openjfx - 当“库”节点丢失时,Netbeans 11 如何将库添加到项目中?
- variables - 如何将 Terraform 配置器“local-exec”输出存储在局部变量中并在“remote-exec”中使用变量值
- azure-logic-apps - LogicApps 场景登录、下载、压缩
- java - 使用资源锁进行并行测试?