JavaScript 淡入淡出使用 CSS 不透明过渡

标签 javascript css

我正在尝试使用 JavaScript 隐藏/显示元素。使用类似问题的代码作为引用。淡出正常工作,但出于某种原因,淡入不是:

function hidePages() {
  var pages = document.getElementsByClassName('page');
  for(var i = 0; i < pages.length; i++) {
    current = pages[i];
    current.style.opacity = 0;
    setTimeout(function(current) {
      current.style.display = 'none';
    }, 500, current);
  }
}

function navigate(page) {
  hidePages();
  var current = document.getElementById(page);
  setTimeout(function(current) {
    current.style.display = 'block';
    current.style.opacity = 1;
  }, 500, current);
}
.page {
  opacity: 1;
  -webkit-transition: opacity 0.5s;
  -o-transition: opacity 0.5s;
  transition: opacity 0.5s;
}
<a href="#" onclick="navigate('page1')">1</a> 
<a href="#" onclick="navigate('page2')">2</a> 
<a href="#" onclick="navigate('page3')">3</a>
<div class="page" id="page1">Page 1</div>
<div class="page" id="page2" style="display: none">Page 2</div>
<div class="page" id="page3" style="display: none">Page 3</div>        

JSFiddle:https://jsfiddle.net/z2svo5uu/

如您所见,一旦元素淡出,它就会立即出现。不过,我也想要淡入淡出的淡入淡出过渡。

我知道我可以使用 jQuery 更轻松地完成此操作,但我只是想知道为什么转换没有按预期进行?有人知道吗?

最佳答案

您正面临异步问题,因为您编写代码的方式在 hidePagesnavigate 内几乎同时运行,并且超时不是标准的先执行,因为超时值总是近似的。有时,设置为 500ms 的超时可能会在 496ms503ms 之后执行。

此外,尝试在 navigate 中的当前超时内使用嵌套超时,以将 display 中的更改与 opacity 中的更改分开。 1-10ms 范围内的时间可以正常工作以确保动画流畅运行。

片段:

function hidePages() {
  var pages = document.getElementsByClassName('page');
  for (var i = 0; i < pages.length; i++) {
    current = pages[i];
    current.style.opacity = 0;
    setTimeout(function(current) {
      current.style.display = 'none';
    }, 500, current);
  }
}

function navigate(page) {
  hidePages();
  var current = document.getElementById(page);
  setTimeout(function(current) {
    current.style.display = 'block';
    setTimeout(function(current) {
      current.style.opacity = 1;
    }, 10, current);
  }, 500, current);
}
.page {
  opacity: 1;
  -webkit-transition: opacity 0.5s;
  -o-transition: opacity 0.5s;
  transition: opacity 0.5s;
}
<a href="#" onclick="navigate('page1')">1</a>
<a href="#" onclick="navigate('page2')">2</a>
<a href="#" onclick="navigate('page3')">3</a>
<div class="page" id="page1">Page 1</div>
<div class="page" id="page2" style="display: none">Page 2</div>
<div class="page" id="page3" style="display: none">Page 3</div>

关于JavaScript 淡入淡出使用 CSS 不透明过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48686024/

相关文章:

javascript - PHP Post 与 JavaScript Ajax 请求

javascript - 我如何从 CasperJS 获取样式表列表?

css - 如何用 CSS 重新排列这些元素?

html - 覆盖 div 不显示背景颜色

html - Materialise CSS Modal 将正文内容向右移动

html - 表格列太宽

javascript - 将 Groovy DSL 移植到 Clojure

javascript - 无法读取 HTMLImageElement 处未定义的属性 'remove' - 切换内容

javascript - 在成员函数回调中获取对象

javascript - javascript在单线程时如何在请求后接收回调?