24

我有 id='mainmenu' 的 div。我在单击按钮后通过 JavaScript 向它添加 CSS3 过渡(通过将“过渡”添加到 #mainmenu 并创建将添加到 div 元素的类 .fadein 和 .fadeout )。代码:

<div id='mainmenu'></div>
<button id="btn1">Click me1</button>
<button id="btn2">Click me2</button>

#mainmenu {
    width:100px; 
    height:100px; 
    background:#eee; 
    -webkit-transition: opacity 1s; 
    -moz-transition: opacity 1s; 
    transition: opacity 1s; 
}

.fadeout {
    opacity:0;
}
.fadein {
    opacity:1;
}


var menu = document.getElementById('mainmenu'),
    btn1 = document.getElementById('btn1'),
    btn2 = document.getElementById('btn2');

btn1.addEventListener('click', function() {
    menu.className = 'fadeout';
}
btn2.addEventListener('click', function() {
    menu.className = 'fadein';
}

问题是现在我想添加 display none 和 block 到淡出和淡入选项。所以在淡出动画 div 之后应该显示无,并且在淡入显示块之后:

btn1.addEventListener('click', function() {
    menu.className = 'fadeout';
    menu.style.display = 'none';
}
btn2.addEventListener('click', function() {
    menu.className = 'fadein';
    menu.style.display = 'block';
}

不幸的是, display none 和 block 与动画一起执行,所以动画不起作用(元素得到 display none,没有不透明动画)。我首先想要具有不透明度的动画,然后显示元素的无/块。有什么办法吗?我只能使用纯 JavaScript(没有 jQuery 等)。

4

4 回答 4

17

您需要使用setTimeout()withmenu.style.display = "none";以便在触发之前让 fade 完成它的工作style.display

btn1.addEventListener('click', function() {
    menu.className = 'fadeout';
    setTimeout(function() {
        $(menu).css('display', 'none');
    }, 1000);
}
btn2.addEventListener('click', function() {
    menu.className = 'fadein';
    setTimeout(function() {
        $(menu).css('display', 'block');
    }, 1000);
}
于 2013-09-03T21:22:39.247 回答
11

我在这里可能是错的,但是我相信您需要添加一个转换结束触发器来执行 display:block / display:none 更改。

请参阅:CSS3 过渡事件

于 2013-09-03T21:21:11.063 回答
10

虽然这是一篇旧文章,但为了将来的访问者,您可以使用 transitionend 事件。您可以使用:

/*For when object has fully faded*/
menu.addEventListener("transitionend", function() {
  if (this.className == "fadeout") {
    this.style.display = "none";
  }
}.bind(menu));

/*Show before animation starts*/
menu.addEventListener("click", function() {
  this.style.display = "block";
}.bind(menu));

于 2016-08-18T23:08:43.347 回答
8

在某些情况下,我使用 height 0 而不是 display none ,但它可能适用于您的需要,也可能不适用于您的需要。无论如何,这是代码:

1)使用过渡(看起来像 jQuerys fadeOut):

.fadeOut{
  opacity : 0;
  height : 0;
  transition : opacity 800ms, height 0 800ms;
}

如果你愿意,你也可以添加宽度 0。

.fadeOut{
  opacity : 0;
  width : 0;
  height : 0;
  transition : opacity 800ms, height 0 800ms, width 0 800ms;
}

2)使用动画(它有效,但过渡更好):

.fadeOut{
  animation : fadeout 800ms linear forwards;
}
@keyframes fadeout{
  99%{
    opacity : 0;
    height : initial;
  }
  100%{
    opacity : 0;
    height : 0;
  }
}
于 2014-04-10T12:44:14.587 回答