【问题标题】:CSS3 transition fails to animate when inside setInterval在 setInterval 内时,CSS3 过渡无法设置动画
【发布时间】:2023-03-26 18:58:01
【问题描述】:

首先我会说我已经使用 JQuery .animate 让它工作,但我想提高性能并尝试使用 CSS3 过渡。

当我添加“过渡:不透明度 0.6s;”时到标签并使用jquery更改css值,单词正确生成但淡入淡出动画消失了。原来的 JQuery 方法是这样的:

start 4 animations to opacity:0
for loop that generates 4 new words inside a setTimeout
start 4 animations to opacity:1

我觉得奇怪的是,动画只有在我完全注释掉 setTimeout 和 setInterval 后才开始工作。将其中任何一个放入其中都会使其停止工作。这让我觉得很奇怪,因为它们在这里的使用是无关的(afaik)。我四处搜索,看到人们提到了与 css3 转换相关的这些功能,但我找不到任何可以解释这里可能发生的事情的东西。

function printWords() {
    var words = ["list","of","random","words"];

    var selectors = ['div#northSlogan', 'div#eastSlogan', 'div#southSlogan', 'div#westSlogan'];

    /* populate array with numbers 0 through # of elements in 'words' array */
    var nums = [];
    for (var i=0; i < words.length; i++) {nums[i] = i;}

    /* fade out all slogan divs */
    for(var i=0; i < 4; i++) {
        //$(selectors[i]).animate({opacity:0}, 600);
        $(selectors[i]).css({opacity: 0});
    }

    /* generate random index and fill slogan div with chosen text */
    //setTimeout(function() {
        for (var i=0; i < 4; ++i) {
            var index = Math.floor(Math.random()*nums.length);
            document.querySelector(selectors[i]).innerHTML = words[nums[index]];
            nums.splice(index, 1);
        }
    //}, 600);

    /* fade in all slogan divs */
    for(var i=0; i < 4; i++) {
        //$(selectors[i]).animate({opacity:0.5}, 600);
        $(selectors[i]).css({opacity: 1});
    }
}

printWords();
setInterval(printWords, 5000);

所以我的问题是,干扰这些转换的 setInterval 和 setTimeout 函数是什么?我正在做的事情是可能的,还是我以完全错误的方式去做?

PS:我最初在那里有 setTimeout 函数,所以单词生成将在动画到 opacity:0 发生之后发生,否则你可以在淡入淡出开始之前看到变化。因为我同时启动了 4 个动画,所以我不想在 for 循环中使用回调。

【问题讨论】:

  • 小提琴可以帮上忙 - jsfiddle.net
  • 你是 100% 正确的。小提琴可以提供帮助。问题是两个动画同时运行,导致什么也没有发生。这就是你整天不休息时会发生的事情。感谢您帮助指出我的疏忽。

标签: javascript jquery css


【解决方案1】:

您正在寻找这样的东西吗? http://jsfiddle.net/dJQ5t/

    var selectors = ['div#northSlogan', 'div#eastSlogan', 'div#southSlogan', 'div#westSlogan'];
    var words = ["list","of","random","words"];
function printWords() {

    /* populate array with numbers 0 through # of elements in 'words' array */
    var nums = [];
    for (var i=0; i < words.length; i++) {nums[i] = i;}

    /* fade out all slogan divs */
    for(var i=0; i < 4; i++) {
        $(selectors[i]).removeClass('opaque');
    }

    /* generate random index and fill slogan div with chosen text */
    setTimeout(function() {
        for (var i=0; i < 4; ++i) {
            var index = Math.floor(Math.random()*nums.length);
            document.querySelector(selectors[i]).innerHTML = words[nums[index]];
            nums.splice(index, 1);
        }
        /* fade in all slogan divs */
        for(var i=0; i < 4; i++) {
            $(selectors[i]).addClass('opaque');    
        }
    }, 600);


}

printWords();
setInterval(printWords, 5000);

div#northSlogan,div#eastSlogan,div#southSlogan,div#westSlogan{
    opacity:0;
    transition: opacity 0.6s;
}
.opaque{
    opacity: 1 !important;
}

【讨论】:

  • 是的,我是!实际上,就在两分钟前,我使用相同的方法修复了我的示例,减去了!important。我完全没有注意到我没有等到第一个动画完成后才开始第二个。感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 2013-11-12
  • 2023-03-18
  • 2012-06-01
  • 2015-02-09
相关资源
最近更新 更多