如何在没有Jquery的情况下在CSS Flexbox中创建可点击的动画下拉列表?

How to create a clickable animated dropdown in CSS Flexbox without Jquery?

提问人:Alim Gölcük 提问时间:12/8/2022 更新时间:12/9/2022 访问量:122

问:

Main Page

我有几个一个接一个的锚标签,你可以看到,当我点击其中一个时,一个div会出现在它下面,如下所示:

Second One

HTML、CSS 和 JS 代码:

[HTML全文]

我刚刚得到了第一个锚标签,其他的都是一样的。

       <div class="category2">
         <a href="#" class="items2" id="itemOne">
             Elektrikli El Aletleri  
         </a>
         <div class="subCategory" id="subListOne">
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
        </div>

       ...
     </div>

CSS的

.category2 {
    
    flex-direction: column;
    display:none;
    
   }
@media screen and (max-width:1220px) {
    
    .category2 {
        display: flex;
    }

    .category2 > a {
        height: 50px;
    }
}
.items2 {
    border:1px solid white; 
    background-color: black;
    color: white;
    display: flex;
    justify-content: center;
    align-items: center;
    border-radius: 20px;
    font-size:20px;
    
}
 .subCategory {
    flex-direction: column;
    background-color: darkslategrey;
    display: none;
    
 }

通过单击ID为“itemOne”的锚标记,将此“.active”类添加到“.subCategory”旁边。因此,div 变得可见。

.active {
    display:flex
}

JS系列

    let itemOne = document.getElementById('itemOne');
    let subListOne = document.getElementById('subListOne');

    

    itemOne.addEventListener('click', () => {
         subListOne.classList.toggle('active');
     })

我想做的是将这个事件动画化。我想让 div 在几毫秒内向下滑动。顺便说一句,当我这样做时,我想保护这个 div 的显示作为 flex。

首先,我尝试使用 height 属性来执行此操作,因此而不是

.subCategory {
    flex-direction: column;
    background-color: darkslategrey;
    display: none;

 }

我做到了:

.subCategory {
    flex-direction: column;
    background-color: darkslategrey;
    display: flex;
    height:0px;
    transition: all 0.7s ease

 }

“.active”是:

.active {
    height:"auto";
}

但它没有成功。

任何帮助将不胜感激。提前致谢。

javascript css flexbox css-animations css-transitions

评论


答:

0赞 daniel 12/8/2022 #1

使用 max-height 属性而不是 height。将 subCategory 的溢出设置为隐藏。然后将其初始 max-height 设置为 0。

然后,在悬停或聚焦时,您将最大高度设置为一个大且不可能的数字,例如 9999px。

 <div class="category2" tabindex="1">
         <a href="#" class="items2" id="itemOne">
             Elektrikli El Aletleri  
         </a>
         <div class="subCategory" id="subListOne"> 
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
            <a href="#">Lorem ipsum dolor sit.</a>
        </div>

     </div>

.category2 {
    
    flex-direction: column;
    display: flex;    
  }




@media screen and (max-width:1220px) {
    
    .category2 {
        display: flex;
    }

    .category2 > a {
        height: 50px;
    }
}

.items2 {
    border:1px solid white; 
    background-color: black;
    color: white;
    display: flex;
    justify-content: center;
    align-items: center;
    border-radius: 20px;
    font-size:20px;
    
}
 .subCategory {
    flex-direction: column;
    background-color: darkslategrey; 
    transition: .5s ease-in-out;
    max-height: 0;
    overflow: hidden;
 }

.category2:hover .subCategory{
    max-height: 999px;
}

看看我在这里做了什么

0赞 Gerard 12/8/2022 #2

您可以对属性进行动画处理max-height

let itemOne = document.getElementById('itemOne');
let subListOne = document.getElementById('subListOne');

itemOne.addEventListener('click', () => {
  subListOne.classList.toggle('active');
})
.category2 {
  display: flex;
  flex-direction: column;
}

.category2>a {
  height: 50px;
}

.items2 {
  border: 1px solid white;
  background-color: black;
  color: white;
  display: flex;
  justify-content: center;
  align-items: center;
  border-radius: 20px;
  font-size: 20px;
}

.subCategory {
  flex-direction: column;
  background-color: darkslategrey;
  display: flex;
  max-height: 0px;
  overflow: hidden;
  transition: max-height 0.7s ease
}

.subCategory > a {
  color: white;
  text-decoration: none;
}

.active {
  max-height: 400px;
}
<div class="category2">
  <a href="#" class="items2" id="itemOne">Elektrikli El Aletleri</a>
  <div class="subCategory" id="subListOne">
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
    <a href="#">Lorem ipsum dolor sit.</a>
  </div>
</div>

评论

0赞 Alim Gölcük 12/9/2022
但是在第一次点击时,动画不会像第二次点击那样发生。第一个直接打开。@Gerard
0赞 Gerard 12/9/2022
@AlimGölcük Aplologies。我已经适应了课堂.9999像素影响了动画。max-heightactive
0赞 Alim Gölcük 12/9/2022
有没有办法解决这个问题?@Gerard
0赞 Gerard 12/9/2022
@AlimGölcük 立即运行代码。我相信它在更改后可以正常工作。
0赞 Alim Gölcük 12/9/2022
是的,在你的第一条评论之后,我已经尝试过了。但我想我们不能以动态的方式处理它。因为随着 div 内容的越大,高度可能还不够,我们必须始终手动更改它。@Gerard