【发布时间】:2020-09-27 16:48:02
【问题描述】:
我的问题有 3 个部分。对此 JS 问题的任何部分的任何帮助将不胜感激。我正在尝试通过反复试验来学习和理解 JS。
我创建了这个漂亮的旅行登录页面https://portfolioprime.github.io/Nature%20carousel/glidejs.html,带有一个使用 Glide.js 的缩略图轮播,非常酷且运行良好。旋转木马向左移动,并带有箭头按钮来手动控制幻灯片。
但我一直在尝试实现一个香草 JS 轮播滑块,但我失败了。挣扎了 2 天,我能做到的最好的事情就是让一个旋转木马项目左右移动。见https://portfolioprime.github.io/Nature%20carousel/。
我想要的是让旋转木马自动向左滑动,用箭头按钮手动控制滑块。
我使用querySelectorAll('.carousel-items') 定位所有轮播项目并将left:-274px 添加到轮播容器glide__slides。
这是我的 JS 代码。
// var & event-listener buttons
document.querySelector(".left").addEventListener("click", slideLeft);
document.querySelector(".right").addEventListener("click", slideRight);
// Function slide left
function slideLeft(left) {
document.querySelector('.glide__slides').style.left = left;
}
// Function slide left
function slideRight(right) {
document.querySelector('.glide__slides').style.left = right;
}
其次,我想要一个活动的轮播项目,当它处于活动状态时会自动更改背景图片。
现在我有hero.style.background = var;,我已经在每个轮播项目上用onclick = function('01.jpg') 更改了onclick。
这是代码。
// Change Hero Img
function heroChange(hmmm) {
var hero = document.querySelector('.hero');
hero.style.background = hmmm;
}
所以我想我会将 EventListeners 添加到 carousel-items 并像这样向 carousel-item 添加一个活动类,
var slides = document.querySelectorAll('.carousel-items');
function changeBgImg() {
slides.forEach(s => s.classList.remove('active');
this.classList.add('active');
//change the bg image === this
//But I have no idea how to do that
}
第三,我使用上面相同的函数获得了内容、背景和轮播指示器,但它看起来像是很脏的代码。 HTML 有每个.carousel-item,有十个,每个调用 4 个函数。它看起来像这样:
<div class="glide hero-carousel">
<div class="glide__track" data-glide-el="track">
<ul class="glide__slides">
<li class="glide__slide carousel-item"
onclick="heroChange('url(images/02.jpg) bottom/cover no-repeat');
number('01');
h4('Destination Shire');
h1('Valley<br> of Dreams');">
<div class="carousel-text">
<p>Destination Shire</p>
<h3>Valley<br> of Dreams</h3>
</div>
</li>
<li class="glide__slide carousel-item"
onclick="heroChange('url(images/03.jpg) bottom/cover no-repeat');
number('02');
h4('Destination Westwood');
h1('Misty<br> Woodlands');">
<div class="carousel-text">
<p>Destination Westwood</p>
<h3>Misty<br> Woodlands</h3>
</div>
</li>
</ul>
</div>
</div>
所以看起来很恶心。虽然它可以工作,但我希望找到一种更优雅的方式来实现这一点,将所有这些函数放入一个函数中,按顺序执行每个部分。
最后,我想让点击动画过渡,但这完全是另一锅鱼。
就是这样。呼!
感谢您抽出宝贵的时间,我很感激。你能提供的任何帮助都会让我成为一个更好的设计师。实际上,我有很多项目将从答案中受益。
如果您至少可以提供第 2 部分和第 3 部分的帮助:将代码清理为 1 个函数并在活动类上更改 bg-image,那将是一个很大的帮助。
JS 可以做的事情太多了,我在 Google 和 YouTube 上找不到答案。
再次感谢您。
更新:
我已经使用 margin-left 编辑了滑块,如这个问题所示:
vanilla javascript carousel not sliding
// var & event-listener buttons
document.querySelector(".left").addEventListener("click", slideLeft);
document.querySelector(".right").addEventListener("click", slideRight);
let marginLeft = 0;
const slides = document.querySelector('.glide__slides');
// Function slide left
function slideLeft() {
marginLeft += 264;
slides.style.marginLeft = marginLeft + 'px';
console.log(getComputedStyle(slides).marginLeft);
}
// Function slide Right
function slideRight() {
marginLeft -= 264;
slides.style.marginLeft = marginLeft + 'px';
console.log(getComputedStyle(slides).marginLeft);
}
现在轮播已手动移动 1 张幻灯片。 仍然不完全理解为什么我上面的代码不起作用。如果有人可以向我解释,那就太好了。
我还有一些问题:
-
在幻灯片末尾自动滑动和循环播放。
-
让活动滑块自动更改背景。此时它只改变onclick。
-
找到一种方法来整理函数调用和函数。
【问题讨论】:
-
我对这个问题的回答 [link]stackoverflow.com/questions/63861444/… 可能很有趣 - 它是纯 javascript/css 并允许无限滚动。明天我会回来更详细地查看您的问题。
-
我已经给出了部分答案,这是一种在运行时创建令人讨厌的代码并使维护滑块更简单的方法 - 添加、删除或更改幻灯片的顺序。今天晚些时候,我将研究使用原生 JavaScript 创建无限滑块。同时,您能说一下您希望在单击幻灯片时发生什么,如果滑块已经自动移动,当单击箭头时会发生什么?
-
谢谢@A Haworth,我会查看您上面的链接。
-
谢谢,@A Haworth,我会查看您上面的链接。我会说当单击幻灯片时 .hero 背景图像应该改变。单击按钮时,幻灯片应朝该方向移动一张幻灯片。最佳的做法是让滑块在幻灯片或 btn 悬停时暂停滚动。看看 portfolioprime.github.io/Nature%20carousel/…>。我让它在这里自动滑动,但在最后一张幻灯片后它没有重置滑块。而且也不会暂停。
-
总结:滑块从右到左自动开始,当一个人到达左边时会有一个暂停,此时背景图像应该改变(?)。如果用户悬停在幻灯片或 btn 上(这是箭头之一吗?),滑块会暂停。单击箭头会沿箭头方向移动一张幻灯片(并停止任何自动滑动??)。整个事情应该是一个连续的循环。这一切都可以用 CSS 动画来完成——相当简单。我将在大约 2 小时内更新我的答案。
标签: javascript typescript