将 jQuery 可见性和不透明度动画替换为纯 Javascript

Replace jQuery visibility and opacity animation with pure Javascript

我正在尝试从一个旧网站中删除 jQuery,但我无法使用他们提供的动画。

我只能复制不透明度淡入淡出,但我似乎无法缓慢地转换可见性它只是变为 1 或 0,我怎样才能顺利地完成这两项工作?

$("#square").css({ opacity: 0.0, visibility: "visible" }).animate({ opacity: 1.0 }, 200);

$("#square").css({ opacity: 1.0, visibility: "hidden" }).animate({ opacity: 0.0 }, 200);

此处最简单(也是迄今为止性能最高)的选项是对动画使用 CSS。 JS 动画应该尽可能避免,因为它很慢而且没有硬件加速。

要执行 CSS 中的要求,要应用的关键规则是 transition。您可以使用它来控制要设置动画的属性、它们的延迟、执行时间等。更多信息请访问 MDN

这是一个基本示例。请注意,JS 仅用于添加 class 来触发动画 - 它根本不控制动画。

let square = document.querySelector('#square');

document.querySelector('button').addEventListener('click', () => {
  square.classList.toggle('show');
});
#square {
  width: 200px;
  height: 200px;
  background-color: #C00;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.2s, visibility 0.2s;
  pointer-events: none;
}
#square.show {
  opacity: 1.0;
  visibility: visible;
}
<button>Toggle the square...</button>
<div id="square"></div>

在我看来,@RoryMcCrossan 的回答一语中的。我仍然不清楚的是:为什么我们需要设置 visibilty ?我复制并修改了他的代码片段并删除了其中对 visibility 的所有引用,它似乎以同样的方式工作。我错过了什么?真的是多余的吗?

let square = document.querySelector('#square');

document.querySelector('button').addEventListener('click', () => {
  square.classList.toggle('show');
});
#square {
  width: 200px;
  height: 200px;
  background-color: #C00;
  opacity: 0;
  transition: 1s;
}
#square.show {
  opacity: 1.0;
}
<button>Toggle the square...</button>
<div id="square"></div>