2017-02-20 17 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をアニメーション化しようとしましたが、それは画面サイズが縮小されたときに、私が望まないメニューをスライド表示することを意味します。ページが小さな画面に読み込まれるとき、メニューが表示されないようにするのが理想的です。

私が望むようにこれを動作させる方法はありますか?ここ

EDIT

Codepen:

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

+0

ここでは 'animation'ではなく' transition'を使用してください。問題が解決します。ですから、 'アニメーション:slide-in .5s'はあなたのulそのものに' transition:transform .4s'とすべきです。その後、常にトランジションがきれいにアニメーション化されます。 – somethinghere

答えて

0

代わりに、ここでanimationtransitionを使用することを検討すべきです。ここでは簡単な例である:それは中断することができます以外

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

あなたの答えをありがとうが、それは私が望むようにはかなり動作していません。私はあなたの提案が実装された状態で、ここに私のコードをフォークしました:http://codepen.io/mikehdesign/pen/ggNqqb。最初のトランジションのためにメニューが滑り落ちるように画面のサイズを小さくすると、表示されます。私はそれを望んでいません - 私はちょうど消えて、トリガーを表示して、スライドインアウトを制御したいです –

+0

@MikeHarrisonこれは、あなたが純粋なCSSでそれを得る最も制御可能であり、あなたのサイトのサイズを変更することはなく、いずれかまたは他のものを見ることになります。アニメーションを使ってこの作業を予測可能にする方法はありません。 JSを追加して画面の変化を検出し、しばらくの間、非遷移クラスを追加することもできますが、その面倒は確かに価値がないと確信しています。 – somethinghere

+0

OKありがとう - 私は実験を続けて何かを得ることができるかどうかを見極めるつもりです。私はそれが可能ではないかもしれないというあなたの要点を取るが、私ができる最高のために撮影したい –

関連する問題