使用JavaScript触发CSS动画淡入淡出 - 仅适用于一个方向?

问题描述:

我正尝试构建一个淡入淡出的菜单。这是代码:使用JavaScript触发CSS动画淡入淡出 - 仅适用于一个方向?

HTML

<div id="trigger">CLICK</div> 

<ul data-status="shown" id="navi"> 
    <li><a href="#">Link</a></li> 
    <li><a href="#">Link</a></li> 
</ul> 

CSS

@keyframes fade { 
    0% { opacity: 0; } 
    100% { opacity: 1; display: block; } 
} 

ul { 
    background: grey; 
} 

ul[data-status="shown"] { 
    opacity: 1; 
    animation: fade 2s; 
} 

ul[data-status="hidden"] { 
    opacity: 0; 
    animation: fade 2s; 
    animation-direction: reverse; 
} 

ul[data-status="removed"] { 
    display: none; 
} 

的JavaScript

function myMenu() { 
    var trigger = document.getElementById('trigger'), 
     menu = document.getElementById('navi'), 
     state = menu.getAttribute('data-status'); 

    if (state == 'shown') { 
     menu.removeAttribute('data-status'); 
     menu.setAttribute('data-status', 'removed'); 
     state = menu.getAttribute('data-status'); 
    } 

    var toggle = function() { 
     if (state == 'shown') { 
      menu.removeAttribute('data-status'); 
      menu.setAttribute('data-status', 'hidden'); 
      setTimeout(function() { 
       menu.removeAttribute('data-status'); 
       menu.setAttribute('data-status', 'removed'); 
       state = menu.getAttribute('data-status'); 
      }, 2000); 
     } 

     if (state == 'removed') { 
      menu.removeAttribute('data-status'); 
      menu.setAttribute('data-status', 'shown'); 
      state = menu.getAttribute('data-status'); 
     } 
    }; 

    trigger.addEventListener('click', toggle, false); 

} 

myMenu(); 

例子:http://jsbin.com/avUWUnO/1/edit

淡入作品如预期,但淡化o ut实际上不存在,菜单就消失了。或者,也许是因为我点击得太快?然后在那里有一些奇怪的延迟,错误可能是我使用setTimeout,但我不能发现那里有什么问题。

的状态设置为隐藏,则CSS动画火灾,两秒钟后,当动画完成后,菜单将被删除。为什么这不能按预期工作?

+0

Jacedc是正确的,但在一个侧面说明,你应该添加某种超时的JavaScript或使用'label'和一个隐藏的'把它变成完整的CSS输入' –

+0

@Zeaklous对不起,我不知道你的意思是什么,应该是隐藏领域的价值? – Sven

+0

这是调用[** checkbox hack **](http://css-tricks.com/the-checkbox-hack/)。我经常在纯CSS项目中使用它 –

您错过了css属性中的供应商前缀。我改变了任何和所有animationkeyframe选择器,并添加了-webkit-(铬和safari),它的工作。

供应商前缀是-webkit-(Safari和Chrome浏览< 27我认为),-o-是歌剧< 17,IE10是第一个浏览器尼克斯供应商前缀,所以你不必担心,并-moz-是Firefox浏览器。一定要包含前缀版本和非前缀版本。

因此,举例来说,我只是改变了-webkit-

@-webkit-keyframes fade { 
    0% { opacity: 0; } 
    100% { opacity: 1; display: block; } 
} 

@keyframes fade { 
    0% { opacity: 0; } 
    100% { opacity: 1; display: block; } 
} 

ul { 
    background: grey; 
} 

ul[data-status="shown"] { 
opacity: 1; 
-webkit-animation: fade 2s; 
animation: fade 2s; 
} 

ul[data-status="hidden"] { 
    opacity: 0; 
    -webkit-animation: fade 2s; 
    -webkit-animation-direction: reverse; 
    animation: fade 2s; 
    animation-direction: reverse; 
} 

ul[data-status="removed"] { 
    display: none; 
} 

但你也可能要添加前缀的其余部分。

JSBin(感谢Zeaklous这一点。)

+0

当然你是对的,这些前缀已经丢失,但我已经在Firefox 24中测试过了,它不需要任何前缀,只有淡入功能可以正常工作。 – Sven

+0

它确实在FF工作,如果你添加回原来的属性http://jsbin.com/avUWUnO/7/edit @Jacedc随时更新你的答案吧 –

+0

@Zeaklous啊是的,谢谢你。 –