【问题标题】:Color transition not working with setTimeout. Element should appear smoothy [duplicate]颜色过渡不适用于 setTimeout。元素应该看起来很平滑[重复]
【发布时间】:2018-07-02 07:00:30
【问题描述】:

颜色过渡有效,如果我不隐藏元素然后让它出现。

const name = document.querySelector(".name");

setTimeout(() => {
  name.classList.remove("hide");
  name.classList.add("color-blue")
  // name.style.color = "blue";
}, 2000)
.name {
  background-color: orange;
  display: inline-block;
  padding: 5px;
  transition: color 10s;
  color: transparent;
}
.color-blue { color: blue; }

.hide { display: none }
<div class="name hide">
  Lebron James
</div>

如果我不使用类 hide 并且以后不将其删除,则过渡有效。通过隐藏它,它不起作用。

不知道发生了什么

感谢您的帮助

【问题讨论】:

  • hide改成opacity:0试试

标签: javascript css settimeout transition


【解决方案1】:

这是工作代码

const name = document.querySelector(".name");

setTimeout(() => {
  name.classList.remove("hide");
  name.classList.add("color-blue")
  // name.style.color = "blue";
}, 2000)
.name {
  background-color: orange;
  display: inline-block;
  padding: 5px;
  transition: color 10s;
  color: transparent;
}
.color-blue { color: blue; }

.hide { opacity: 0 }
<div class="name hide">
  Lebron James
</div>

http://jsfiddle.net/Aravi/39pdLarn/2/

显示在动画方面有限制,但您可以使用可见性和不透明度进行过渡。

【讨论】:

  • 嘿...链接失效了
【解决方案2】:

使用opacity 设置opacity:0 隐藏元素。

了解opacity:https://www.w3schools.com/css/css_image_transparency.asp

const name = document.querySelector(".name");

setTimeout(() => {
  name.classList.remove("hide");
  name.classList.add("color-blue")
  // name.style.color = "blue";
}, 2000)
.name {
  background-color: orange;
  display: inline-block;
  padding: 5px;
  transition: color 10s;
  color: transparent;
}
.color-blue { color: blue; }

.hide { opacity:0; }
<div class="name hide">
  Lebron James
</div>

【讨论】:

  • 我不明白为什么我的策略是错误的。为什么从 display none 到 display inline-block 不起作用
【解决方案3】:

那是因为你使用的是display: none;

如果您将display 设置为none,CSS 将无法显示动画。您可以使用opacity: 0 隐藏元素,但记得将其添加到transition,否则它不会显示任何颜色过渡。

const name = document.querySelector(".name");

setTimeout(() => {
  name.classList.add("hide");
  name.classList.add("color-blue")
  // name.style.color = "blue";
}, 2000);
.name {
  background-color: orange;
  display: inline-block;
  padding: 5px;
  transition: color 10s, opacity 10s;
  color: transparent;
}

.color-blue {
  color: blue;
}

.hide {
  opacity: 0;
}
<div class="name">
  Lebron James
</div>

或者,如果您想使用display: none(即从 DOM 中删除元素),那么您可以按如下方式更新您的 JS 代码:

const name = document.querySelector(".name");

setTimeout(() => {
  setTimeout(() => {
    name.classList.add("hide");
  }, 10000);
  name.classList.add("color-blue")
  // name.style.color = "blue";
}, 2000)
.name {
  background-color: orange;
  display: inline-block;
  padding: 5px;
  transition: color 10s;
  color: transparent;
}

.color-blue {
  color: blue;
}

.hide {
  display: none
}
<div class="name">
  Lebron James
</div>

【讨论】:

  • 1) 令人惊讶的是,从一开始就 opacity: 0,元素不占用 DOM 中的空间,所以我不需要额外的 setTimeout 2) 我觉得很奇怪我摆脱了这个类hide with display none,因为这样 display 的值是 inline-block。我不明白为什么显示器不能与动画一起使用
  • 3) 如果我想让它起作用,我需要使用 opacity !important。为什么?
猜你喜欢
  • 2013-11-19
  • 2014-02-11
  • 2022-12-25
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多