2016-12-15 18 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>

還要注意的是,你可以讓你的JS更簡潔的使用forEach()遍歷的下拉菜單:

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

是的。如果您需要嘗試使用「高度」進行動畫製作。 –