2016-12-15 1 views
-1

オープニングとクローズのアニメーションを追加する方法がわかりません。私はこのスクリプトがあまり良くないと知っていますが、ドロップされたブロックの外側をクリックすると自動クローズが可能な他のメニュースクリプトは見つかりませんでした。ありがとうございました。ここでは、コードJavaScriptのdivの外観をアニメーション化する

/* When the user clicks on the button, 
 
toggle between hiding and showing the dropdown content */ 
 
function myFunction() { 
 
    document.getElementById("myDropdown").classList.toggle("show"); 
 
} 
 

 
// Close the dropdown if the user clicks outside of it 
 
window.onclick = function(event) { 
 
    if (!event.target.matches('.dropbtn')) { 
 
    var dropdowns = document.getElementsByClassName("dropdown-content"); 
 
    var i; 
 
    for (i = 0; i < dropdowns.length; i++) { 
 
     var openDropdown = dropdowns[i]; 
 
     if (openDropdown.classList.contains('show')) { 
 
     openDropdown.classList.remove('show'); 
 
     } 
 
    } 
 
    } 
 
}
.dropbtn { 
 
    background-color: #4CAF50; 
 
    color: white; 
 
    padding: 16px; 
 
    font-size: 16px; 
 
    border: none; 
 
    cursor: pointer; 
 
} 
 
.dropbtn:hover, 
 
.dropbtn:focus { 
 
    background-color: #3e8e41; 
 
} 
 
.dropdown { 
 
    float: right; 
 
    position: relative; 
 
    display: inline-block; 
 
} 
 
.dropdown-content { 
 
    display: none; 
 
    position: absolute; 
 
    background-color: #f9f9f9; 
 
    min-width: 160px; 
 
    box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); 
 
    right: 0; 
 
    -webkit-transition: all 0.3s; 
 
    -moz-transition: all 0.3s; 
 
    -ms-transition: all 0.3s; 
 
    -o-transition: all 0.3s; 
 
    transition: all 0.3s; 
 
    max-height: 0; 
 
    overflow: hidden; 
 
    opacity: 0; 
 
    -webkit-animation-duration: 0.55s; 
 
    animation-duration: 0.55s; 
 
    -webkit-animation-timing-function: ease; 
 
    animation-timing-function: ease; 
 
} 
 
.dropdown-content a { 
 
    color: black; 
 
    padding: 12px 16px; 
 
    text-decoration: none; 
 
    display: block; 
 
} 
 
.dropdown a:hover { 
 
    background-color: #f1f1f1 
 
} 
 
.show { 
 
    display: block; 
 
    max-height: 200px; 
 
    opacity: 1; 
 
}
<div class="dropdown"> 
 
    <button onclick="myFunction()" class="dropbtn">Dropdown</button> 
 
    <div id="myDropdown" class="dropdown-content"> 
 
    <a href="#home">Home</a> 
 
    <a href="#about">About</a> 
 
    <a href="#contact">Contact</a> 
 
    </div> 
 
</div>
あなたがしたいトランジションの種類を指定していない

+0

あなたは明確になるでしょうか?スニペットでは、メニューの外側をクリックするとサブメニューが閉じます。それはあなたの後ろの機能ですね。 –

+1

あなたはどんな種類のアニメーションを見ていますか?スライドアップ/ダウン?フェードイン/アウト? –

+0

'.dropdown-content'で' display:none; 'を削除すると、それは動作します – Brewal

答えて

2

ですが、あなただけではCSSを使用してそれらのほとんどを達成することができます。

私の例では、フェードイン/アウトを使用しました。 transitionをすでに定義していましたが、opacityプロパティで動作するように構文を修正する必要がありました。また、必須ではないanimationを設定します。また、要素のmin-heightを設定すると、クラスがトグルされてすぐに消えてしまいますので、削除しました。ここで

は作業例です:

function myFunction() { 
 
    document.getElementById("myDropdown").classList.toggle("show"); 
 
} 
 

 
window.onclick = function(event) { 
 
    if (!event.target.matches('.dropbtn')) { 
 
    var dropdowns = document.getElementsByClassName("dropdown-content"); 
 
    for (var i = 0; i < dropdowns.length; i++) { 
 
     dropdowns[i].classList.remove('show'); 
 
    } 
 
    } 
 
}
.dropbtn { 
 
    background-color: #4CAF50; 
 
    color: white; 
 
    padding: 16px; 
 
    font-size: 16px; 
 
    border: none; 
 
    cursor: pointer; 
 
} 
 
.dropbtn:hover, 
 
.dropbtn:focus { 
 
    background-color: #3e8e41; 
 
} 
 
.dropdown { 
 
    float: right; 
 
    position: relative; 
 
    display: inline-block; 
 
} 
 
.dropdown-content { 
 
    position: absolute; 
 
    background-color: #f9f9f9; 
 
    min-width: 160px; 
 
    box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); 
 
    right: 0; 
 
    -webkit-transition: opacity 0.5s; 
 
    -moz-transition: opacity 0.5s; 
 
    -ms-transition: opacity 0.5s; 
 
    -o-transition: opacity 0.5s; 
 
    transition: opacity 0.5s; 
 
    overflow: hidden; 
 
    opacity: 0; 
 
} 
 
.dropdown-content a { 
 
    color: black; 
 
    padding: 12px 16px; 
 
    text-decoration: none; 
 
    display: block; 
 
} 
 
.dropdown a:hover { 
 
    background-color: #f1f1f1 
 
} 
 
.show { 
 
    opacity: 1; 
 
}
<div class="dropdown"> 
 
    <button onclick="myFunction()" class="dropbtn">Dropdown</button> 
 
    <div id="myDropdown" class="dropdown-content"> 
 
    <a href="#home">Home</a> 
 
    <a href="#about">About</a> 
 
    <a href="#contact">Contact</a> 
 
    </div> 
 
</div>

はまた、あなたがドロップダウンをループにforEach()を使用して、あなたのJSをより簡潔にすることができますのでご注意:

if (!event.target.matches('.dropbtn')) { 
    [].forEach.call(document.getElementsByClassName("dropdown-content"), function(dd) { 
    dd.classList.remove('show'); 
    }); 
} 

が可能ES2015をサポートしていないブラウザーでは動作しないことに注意してください。 IE8以下。

+0

ありがとう!できます。また、より簡潔なjsコードに感謝します。 – faik371

+0

私はこの方法のマイナスを見つけました。不透明度が0の場合、ブロックされている要素と対話できません。 – faik371

+0

真。必要な場合は、代わりに 'height'をアニメーション化してみてください。 –

関連する問題