使用 JavaScript 更改元素的变换 属性 时过渡不起作用
Transitions not working while changing the transform property of an element using JavaScript
我一直在尝试创建一个包含多个项目的简单轮播。
想法是使用变换 属性 向左或向右移动轮播幻灯片,具体取决于用户单击哪个按钮。我使用append和prepend方法来实现“无限滑动”的效果。
我的主要问题是过渡 属性 没有触发,轮播只是一直捕捉到下一个项目。此外,控制台还记录了一条错误消息,类似于“加载转换值时出现错误”(我没有粘贴整个错误,因为我的浏览器不使用英语作为默认语言)。我不确定这个错误是什么意思,因为尽管有错误,轮播仍在移动。
这些是用于使用轮播的功能:
const slideWidth = document.querySelector('.carouselItem').clientWidth;
let distance = 0;
function moveToPrevious() {
distance += slideWidth;
carouselSlide.prepend(carouselSlide.lastElementChild);
carouselSlide.style.transform = 'translateX(' + distance + 'px)';
}
function moveToPrevious() {
distance += slideWidth;
carouselSlide.prepend(carouselSlide.lastElementChild);
carouselSlide.style.transform = 'translateX(' + distance + 'px)';
}
我认为最好使用一个css变量而不是改变整个属性值,我认为这样更清楚:
.carouselSlide {
display: flex;
height: 100%;
--translate-x: 0px;
transition: 0.5s all ease-in;
transform: translateX(var(--translate-x));
}
function moveToPrevious() {
distance += slideWidth;
document
.querySelector('.carouselSlide')
.prepend(carouselSlide.lastElementChild);
carouselSlide.style.setProperty('--translate-x', distance + 'px');
}
看到我正在设置 --translate-x
的值而不是更改 style.transform
。
使用您的代码,如果您检查元素,transform
属性 甚至不会改变。
虽然您首先要解决另一个问题,但在解决 translateX 的过渡之后,您在删除元素时遇到了问题。一旦您删除第一个元素并将其放在旋转木马的末尾,内容就会向左移动,因为您删除了一个元素,并且不会有任何过渡。
你的算法应该更复杂。假设您想移动到下一个元素,所以:
- 首先你做 translateX
- 然后,当过渡结束时,您要做两件事:
-
- 重置翻译X
-
- 将第一个元素移到末尾
您可以通过收听 transitionEnd
活动来做到这一点。
我建议简化逻辑的一件事是始终在左侧有一个额外的元素,在右侧有一个额外的元素,这样您就可以始终通过更改 translateX 值然后调整元素(如果显示前 3 个元素,则必须使用更复杂的算法才能返回上一张幻灯片)
我一直在尝试创建一个包含多个项目的简单轮播。
想法是使用变换 属性 向左或向右移动轮播幻灯片,具体取决于用户单击哪个按钮。我使用append和prepend方法来实现“无限滑动”的效果。
我的主要问题是过渡 属性 没有触发,轮播只是一直捕捉到下一个项目。此外,控制台还记录了一条错误消息,类似于“加载转换值时出现错误”(我没有粘贴整个错误,因为我的浏览器不使用英语作为默认语言)。我不确定这个错误是什么意思,因为尽管有错误,轮播仍在移动。
这些是用于使用轮播的功能:
const slideWidth = document.querySelector('.carouselItem').clientWidth;
let distance = 0;
function moveToPrevious() {
distance += slideWidth;
carouselSlide.prepend(carouselSlide.lastElementChild);
carouselSlide.style.transform = 'translateX(' + distance + 'px)';
}
function moveToPrevious() {
distance += slideWidth;
carouselSlide.prepend(carouselSlide.lastElementChild);
carouselSlide.style.transform = 'translateX(' + distance + 'px)';
}
我认为最好使用一个css变量而不是改变整个属性值,我认为这样更清楚:
.carouselSlide {
display: flex;
height: 100%;
--translate-x: 0px;
transition: 0.5s all ease-in;
transform: translateX(var(--translate-x));
}
function moveToPrevious() {
distance += slideWidth;
document
.querySelector('.carouselSlide')
.prepend(carouselSlide.lastElementChild);
carouselSlide.style.setProperty('--translate-x', distance + 'px');
}
看到我正在设置 --translate-x
的值而不是更改 style.transform
。
使用您的代码,如果您检查元素,transform
属性 甚至不会改变。
虽然您首先要解决另一个问题,但在解决 translateX 的过渡之后,您在删除元素时遇到了问题。一旦您删除第一个元素并将其放在旋转木马的末尾,内容就会向左移动,因为您删除了一个元素,并且不会有任何过渡。
你的算法应该更复杂。假设您想移动到下一个元素,所以:
- 首先你做 translateX
- 然后,当过渡结束时,您要做两件事:
-
- 重置翻译X
-
- 将第一个元素移到末尾
您可以通过收听 transitionEnd
活动来做到这一点。
我建议简化逻辑的一件事是始终在左侧有一个额外的元素,在右侧有一个额外的元素,这样您就可以始终通过更改 translateX 值然后调整元素(如果显示前 3 个元素,则必须使用更复杂的算法才能返回上一张幻灯片)