【问题标题】:Why does a transition apply when the class is removed? [duplicate]为什么删除类时会应用转换? [复制]
【发布时间】:2018-08-28 10:37:46
【问题描述】:

Here is an example of my problem

我有一个div 和一个button。每次单击按钮时,div 会将其 background-color 更改为随机颜色。

button.addEventListener('click', function(e){
    e.preventDefault();
    setRandomColor();
});

默认情况下,div 有一个名为transition-on 的类,它将转换应用于background-color

<div class="block transition-on"></div>
<button>Change</button>

CSS:

.transition-on {
  transition: background-color 0.5s
}

如果我在应用随机 background-color 之前删除该类,然后重新应用该类,则转换仍然适用。

我的目的是在应用随机颜色时暂时移除过渡。

button.addEventListener('click', function(e){
    e.preventDefault();
    block.classList.remove('transition-on');
    setRandomColor();
    block.classList.add('transition-on');
});

有人知道为什么会这样吗?

编辑:

参考@ths 的答案-使用setTimeout 确实会产生我需要的结果,但现在我想知道为什么需要使用超时。

真的需要超时来临时禁用 CSS 转换吗?

  • 移除过渡类
  • 将颜色应用于块
  • 重新添加过渡类

这应该在没有过渡的情况下从逻辑上改变颜色

【问题讨论】:

  • 当你再次添加类时应用转换,而不是当你删除它时
  • @Jackson 看看我的回答,它可能会对你有所帮助。
  • 超时不会禁用过渡,超时会使颜色更改在您添加类之前发生,因此您将类添加到颜色已更改的元素(无过渡)..没有超时两者将同时发生,时间,您添加颜色并且类在那里,因此转换将工作
  • @TemaniAfif - 它们可能(不太可能)或可能不会“同时”发生,DOM 事件的执行队列更有可能是一组同步事件?更多信息请访问stackoverflow.com/q/779379/125981
  • @MarkSchultheiss 我使用了 same time 这个词,因为我无法以不同的方式表达它,因为它有点复杂,而您提供的链接是我正在尝试的问题之一找到重复...所以我猜他可以知道理解背后的复杂逻辑并理解我的意思 same time

标签: javascript css


【解决方案1】:

从 id="remove_trans" 元素中移除“transition-on”类:

  function changecolor()
    {
//add this code 
       var element = document.getElementById("remove_trans");

       element.classList.remove("transition-on");
        setRandomColor();
        element.classList.add('transition-on');
     }

    changecolor();

html

div id="remove_trans" class="block transition-on"></div>
<button onClick="changecolor()">Change</button>

在html标签中添加id属性

【讨论】:

  • 我看不出这实际上是如何回答为什么会发生过渡的问题。请添加详细解释,可能带有显示转换不会发生的工作示例代码,以及与 OP 问题代码相比为什么会出现这种情况。
【解决方案2】:

据我了解,您想使用JavaScript 动态更改background-color 而不会看到任何转换。为此,您需要将添加transition-on 类的表达式添加到setTimeout 方法中的div 元素,并将transition-duration 传递给第二个参数(在您的情况下,transition-duration 等于0.5s) .

这里有一个可运行的 sn-p 来说明:

var block = document.querySelector('.block');
var button = document.querySelector('button');

function setRandomColor() {
  var letters = '0123456789ABCDEF';
  var color = '#';
  for (var i = 0; i < 6; i++) {
    color += letters[Math.floor(Math.random() * 16)];
  }
  block.style.backgroundColor = color;
}

button.addEventListener('click', function(e){
  e.preventDefault();
  block.classList.remove('transition-on');
  setRandomColor();
  // the next line executes after 500 ms, thus the div element gets the transition-on class after 500 ms and no transition will happen.
  setTimeout(function() {
    block.classList.add('transition-on');
  }, 500); // 500 ms = 0.5 s => the transition-duration of the transition-on class
});
setRandomColor();
.block {
  width: 40px;
  height: 40px;
}
.transition-on {
  transition: background-color 0.5s
}
<div class="block transition-on"></div>
<button>Change</button>

【讨论】:

  • 似乎是一个很好的解决方案,但奇怪的是,如果我将超时时间从500ms 更改为1ms,它会得到相同的结果。当然,将超时设置为非常小的数字与根本不设置超时相同。
  • @Jackson 但我告诉过它必须与 transition-on 类中的过渡持续时间相同?!
  • @Jackson 是的,不需要和转换一样,任何小的值都会有相同的结果,因为它都将延迟执行
  • @ths 您示例中的超时不需要与转换持续时间相同。在超时中使用 1ms 与使用 500ms 相同,这并不能解释为什么首先需要设置超时。
  • @TemaniAfif 我的意思是让事情保持有序,我知道将延迟设置为小于 500 会产生相同的结果。关于JavaScript 及其行为,这是一个很长的故事。所以为了简单起见,我说“必须相同”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
  • 2016-02-20
  • 2014-10-07
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2014-05-01
相关资源
最近更新 更多