2017-02-20 144 views
2

这可能是一个愚蠢的问题,但我很挣扎。我想要一个由javascript触发的小屏幕幻灯片导入菜单。这是我目前有:反向Javascript触发CSS动画

HTML

<nav class="responsive"> 
    <ul class="nav-list unstyled"> 
    <li class="nav-item"><a href="#">Shop</a></li> 
    <li class="nav-item"><a href="#">Our Story</a></li> 
    <li class="nav-item"><a href="#">Information</a></li> 
    <li class="nav-item"><a href="#">Magazine</a></li> 
    <li class="nav-item"><a href="#">Contact</a></li> 
    </ul> 
</nav> 

SCSS

nav.responsive { 
    ul { 
    text-align: center; 
    list-style-type: none; 
    padding: 0; 
    margin: 0; 
    display: none; 
    transform: translateX(-100%); 
    background-color: #fafafa; 
    li { 
     a { 
     display: block; 
     padding: 12px; 
     border-bottom: 1px solid #dadada; 
     } 
    } 
    &.menu-list-active { 
     display: block; 
     animation: slide-in 0.5s forwards; 
    } 
    } 

    @media only screen and (min-width: 720px) { 
    ul { 
     display: block; 
     transform: none; 
     li { 
     display: inline-block; 
     a { 
      border-bottom: none; 
     } 
     } 
    } 
    } 

    div.nav-mobile { 
    display: block; 
    height: 48px; 
    width: 48px; 
    position: absolute; 
    top: 0; 
    right: 0; 
    background-color: #999999; 
    cursor: pointer; 
    &.menu-button-active { 
     background-color: #555555; 
    } 
    @media only screen and (min-width: 720px) { 
     display: none; 
    } 
    } 
} 

@keyframes slide-in { 
    100% { transform: translateX(0); } 
} 

的Javascript

// Create the mobile navigation toggle button 

var mobile = document.createElement('div'); 
mobile.className = 'nav-mobile'; 
document.querySelector('nav.responsive').appendChild(mobile); 

// Set some variables 

var mobileNav = document.querySelector('.nav-mobile'); 
var navList = document.querySelector('.nav-list'); 

// Handle showing the menu 
mobileNav.onclick = function() { 
    this.classList.toggle('menu-button-active'); 
    navList.classList.toggle('menu-list-active'); 
}; 

这很好,菜单正在滑入,如我所愿。但是,我也希望它在单击nav-mobile按钮时再次滑出。我曾尝试最初动画ul,但这意味着当屏幕尺寸减小时,您会看到我不想要的菜单滑出。理想情况下,当页面加载到一个小屏幕上时,菜单应该不可见。

有没有办法让这个工作,因为我想?

编辑

Codepen这里:

http://s.codepen.io/mikehdesign/debug/wgLxYp/bZMQWyLvZYVA

+0

您应该在这里使用'transition'而不是'animation',这将解决您的问题。所以'动画:幻灯片.5s'应该只是你自己的ul上的'transition:transform .4s'。然后它总是整洁地过渡动画。 – somethinghere

回答

0

您应该考虑使用的transition而不是animation这里。下面是一个简单的例子:

document.querySelector('div').addEventListener('click', function(){ 
 
    this.classList.toggle('active'); 
 
})
div { 
 
    width: 100px; 
 
    height: 200px; 
 
    background: red; 
 
    position: absolute; 
 
    left: 0; 
 
    top: 0; 
 
    transform: translateX(-100%); 
 
    transition: transform .4s; 
 
} 
 

 
div:after { 
 
    content: ''; 
 
    width: 20px; 
 
    height: 20px; 
 
    display: block; 
 
    position: absolute; 
 
    left: 100%; 
 
    top: 0; 
 
    background: blue; 
 
} 
 

 
div.active { 
 
    transform: translate(0); 
 
}
<div>My Nav</div>

正如你所看到的,这并不相同类型的动画和你的,但它可以被打断。 Sidenote,使用:before:after并单击它将它标识为JS中的父节点,因此您可以在纯CSS中创建按钮,并直接检查包装器上的点击而不是包含在其中的链接(if(event.target === this){ ... Open and close ... }),它是一个有用的系统,可以减少HTML中的混乱程度,并在CSS中完全设计菜单。

+0

感谢您的回答,但这并不是我想要的。我已经在这里分配了我的codepen,并且实施了您的建议:http://codepen.io/mikehdesign/pen/ggNqqb。当您调整屏幕的大小时,您会看到菜单由于初始转换而滑出。我不希望这样 - 我希望它消失并显示触发器,然后控制幻灯片输入 –

+0

@MikeHarrison这是用纯CSS可以控制的最可控制的,并且您的站点的常规用户是不会调整您的网站的大小,并且会看到其中一个,而且从来没有 - 如果有什么非常活泼的 - 过渡。没有办法使用'动画'预测这项工作。您可以添加JS来检测屏幕更改并在一段时间内添加非过渡类,但我确定这种麻烦肯定不值得。 – somethinghere

+0

好的,谢谢 - 我会继续试验,看看我能不能找到一些东西。我认为你可能不可能做到这一点,但是想要拍摄最好的我可以 –