html CSS动画不播放,直到我点击标签

dldeef67  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(109)

我有一个React应用程序,它可以创建存在5秒的元素并销毁它们。每个元素都有相同的CSS动画分配:

animation: move-up 5s linear;

这个想法是,元素在5秒内从屏幕底部移动到顶部。应用程序会收到关于何时创建这些元素之一的消息。它总是会在创建后5秒销毁它们。
当我打开标签页时,这很好用。但是,如果我在另一个标签页上,CSS动画将不会播放,直到我重新打开标签页。这是非常明显的,因为元素将在飞到屏幕顶部之前被销毁。它在5秒后被正确销毁,但CSS动画不会立即播放,只有在我重新打开标签页后才开始。
有没有什么方法可以在不同的标签上启动CSS动画?

vd2z7a6w

vd2z7a6w1#

我认为你应该尝试用JavaScript创建你的动画,比如:

function moveUp() {
        setTimeout(function () {
            document.getElementById("yourAnim").animate([
                { color: "red" },
                { color: "black" },
                { color: "red" },
            ], {
                duration: 5000
            });

        }, 5000)
    }

moveUp()

它也许能解决你的问题

tv6aics1

tv6aics12#

你需要确保你的动画元素是渲染的,而不是设置为display: none。你可以设置为visibility: hidden,它仍然应该在幕后动画。
例如,在下面的代码片段中,如果你快速点击三次“添加”,你会得到三个动画-一个总是可见的,一个是display: none,一个是visibility: hidden。两秒钟后,两个不总是可见的动画将变为可见。你会看到visibility: hidden的动画在显示时将部分显示在顶部,但是display: none的一个将从底部开始(然后在大约一半的地方被移除)。

let i = 0;
document.getElementById('add').addEventListener('click', function() {
    const div = document.createElement('div');
    div.classList.add('a');
    div.innerHTML = 'test';
    if (i % 3 == 1) {
        div.style.display = 'none';
        div.innerHTML += ': display none';
        setTimeout(() => {
            div.style.display = 'block';
        }, 2000);
    }
    else if (i % 3 == 2) {
        div.style.visibility = 'hidden';
        div.innerHTML += ': visibility hidden';
        setTimeout(() => {
            div.style.visibility = 'visible';
        }, 2000);
    }
    i++
    document.getElementById('container').appendChild(div);
    setTimeout(() => {
        div.remove()
    }, 5000);
});
.a {
    animation: move-up 5s linear;
    position: absolute;
}

#container {
    border: solid 1px black;
    height: 200px;
    width: 200px;
}

@keyframes move-up {
   from { top: 200px    }
   to   { top: 50px }
}
<button id="add">Add</button>

<div id="container"></div>

相关问题