话不多说,代码上来,有些知识点直接就在注释里
HTML
<div class="list-down"> <button id="btn">选择项</button> <ul id="list-chooses" style="display: none;"> <li><a href="#">Python</a></li> <li><a href="#">JavaScript</a></li> <li><a href="#">Java</a></li> <li><a href="#">PHP</a></li> <li><a href="#">C++</a></li> <li><a href="#">C语言</a></li> <li><a href="#">Android</a></li> <li><a href="#">微信小程序</a></li> <li><a href="#">Node.js</a></li> <li><a href="#">Bootstrap</a></li> <li><a href="#">HTML && CSS</a></li> <li id="close"><a href="#">关闭</a></li> </ul> </div>
CSS
<style type="text/css"> * { margin: 0; padding: 0; font-size: 16px; /* 消除按钮点击之后默认出现的蓝色边框 */ outline: none; } ul { list-style: none; } .list-down { width: 150px; margin: 10px auto; text-align: center; } .list-down button { width: 150px; height: 40px; cursor: pointer; background-color: #ea6f5a; border: none; color: #ccc; } .list-down button:hover { color: #fff; font-size: 17px; font-style: 2000; } .list-down button:focus { border: none; } .list-down #list-chooses { border-top: 1px solid #ddd; } .list-down #list-chooses li { width: 150px; height: 0; line-height: 40px; background-color: #ea6f5a; } .list-down #list-chooses li a { color: #ccc; text-decoration: none; } .list-down #list-chooses li:hover a { color: #fff; font-size: 17px; font-style: 2000; } .list-down #list-chooses li#close { border-top: 1px solid #ddd; } </style>
JavaScript
<script type="text/javascript"> window.onload = () => { const listBtn = document.getElementById('btn') const lists = document.getElementById('list-chooses'); const listsLis = lists.querySelectorAll('li'); const listsCloseBtn = document.getElementById('close'); // 列表选项从上而下出现 let listDown = () => { let startHeight = 0; let stopHeight = 40; let timeId = setInterval(() => { startHeight++; // 注意:forEach() 方法在 IE8 以下不支持 listsLis.forEach((item) => { item.style.height = startHeight + 'px'; }); if (startHeight >= stopHeight) { clearInterval(timeId); } }, 10); lists.style.display = 'block'; }; // 列表选项从下而上消失 let listUp = () => { let startHeight = 40; let stopHeight = 0; let timeId = setInterval(() => { startHeight--; listsLis.forEach((item) => { item.style.height = startHeight + 'px'; }); if (startHeight <= stopHeight) { clearInterval(timeId); } }, 10); // 这里,如果不延时的话,会直接消失,而没有上拉的效果 setTimeout(() => { lists.style.display = 'none'; }, 350); }; // 如果列表选项为隐藏,点击则显示;如果列表选项为显示,点击则隐藏 listBtn.addEventListener('click', () => { if (lists.style.display == 'none') { listDown(); } else { listUp(); } }); listsCloseBtn.addEventListener('click', () => { listUp(); }); }; </script>