【问题标题】:Removing class from element isn't triggering css animation从元素中删除类不会触发 CSS 动画
【发布时间】:2018-11-09 17:54:57
【问题描述】:

我正在为我的网站构建一个轮播(幻灯片)效果,但我没有什么问题。在每次图像更改时,我都想制作淡入淡出效果。所以我为它添加了一个带有动画的类。问题来了。

此函数每 3 秒触发一次 (setInterval)

let sliderInterval = setInterval(nextImg, 3000);

function nextImg() {
    imgChange(sliderNum + 1);
}

const heroImg = document.querySelector('.hero__image');

function imgChange(x) {
    heroImg.classList.remove("fade");
    sliderNum = (x + imgLocations.length) % imgLocations.length;
    heroImg.src = imgLocations[sliderNum];
    heroImg.classList.add("fade");
}

淡化效果:

.fade {
    animation: fade 1.5s ease-in-out;
}

@keyframes fade {
    from {opacity: .4}
    to {opacity: 1}
}

<div class="hero">
<img class="hero__image" src="photo1">
</div>

它仅适用于第一个图像切换。尽管在函数开始时它应该删除类 fade 我在函数中看到它留在元素中并且不会消失。如果我尝试将此效果放在hero 部分或img 中,这并不重要。

【问题讨论】:

标签: javascript css class animation


【解决方案1】:

问题是带有关键帧的 css 动画在默认情况下只会运行一次。可以更改它们运行的​​次数,但这会使它们不断地循环运行,这是不可取的。

相反,需要重置动画。为此,需要删除元素的动画名称(在这种情况下为fade)。这可以通过animation-name: none; 完成,但是,当fade 被删除时,规则需要放置在元素上。请注意选择器的更改,以使淡入淡出动画名称在应用时优先。

除此之外,重要的是要注意,如果您在函数中删除和添加相同的类,由于浏览器的工作方式,什么都不会发生。为了让浏览器识别所做的任何更改,必须重新绘制页面 (here is a list of what makes that happen)。为了强制页面重绘,我选择使用offsetHeight,这就是为什么你看到代码中使用了heroImg.offsetHeight(注意它只需要读取,不必使用或赋值) .

为方便起见,我用 div 模拟了您的图像。

let sliderInterval = setInterval(imgChange, 3000);

const heroImg = document.querySelector('.imgMock');

function imgChange() {
    heroImg.classList.remove("fade");
    heroImg.offsetHeight; // force repaint to recognize `animation-name: none;`
    heroImg.classList.add("fade");
}
.imgMock.fade {
    animation: fade 1.5s ease-in;
}

@keyframes fade {
    from {opacity: .4}
    to {opacity: 1}
}

.imgMock {
    height:50px;
    width:50px;
    background-color:black;
    animation-name: none;
}
<div class="hero">
 <div class="imgMock"></div>
</div>

【讨论】:

  • 谢谢!那是一种解决方案。但是现在对于整个图像持续时间(3 秒),动画每 1.5 秒触发一次。所以最终目标是,如何设置动画只为图像转换工作?所以它会用动画改变图像并在下一张幻灯片改变时触发?
  • @icelandico - 抱歉,您说得对,无限设置不准确,因此无法正确维持动画持续时间。请查看我的编辑,以及处理这种情况的改进的更准确的方法。我希望你觉得它满意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 2011-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
相关资源
最近更新 更多