javascript 使用tailwindcss平滑显示移动的菜单

pokxtpni  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(179)

我想流畅地显示移动的菜单。现在我使用的是tailwindcss,当我点击汉堡图标时,菜单立即出现。我试着添加延迟,但它没有做任何事情。当我点击汉堡菜单时,我如何使移动的菜单顺利显示

<body>
    <nav class="flex items-center justify-between flex-wrap bg-teal-500 p-6">
        <div class="flex items-center flex-shrink-0 text-white mr-6">
          <svg class="fill-current h-8 w-8 mr-2" width="54" height="54" viewBox="0 0 54 54" xmlns="http://www.w3.org/2000/svg"><path d="M13.5 22.1c1.8-7.2 6.3-10.8 13.5-10.8 10.8 0 12.15 8.1 17.55 9.45 3.6.9 6.75-.45 9.45-4.05-1.8 7.2-6.3 10.8-13.5 10.8-10.8 0-12.15-8.1-17.55-9.45-3.6-.9-6.75.45-9.45 4.05zM0 38.3c1.8-7.2 6.3-10.8 13.5-10.8 10.8 0 12.15 8.1 17.55 9.45 3.6.9 6.75-.45 9.45-4.05-1.8 7.2-6.3 10.8-13.5 10.8-10.8 0-12.15-8.1-17.55-9.45-3.6-.9-6.75.45-9.45 4.05z"/></svg>
          <span class="font-semibold text-xl tracking-tight">Menu</span>
        </div>
        <div class="block lg:hidden">
          <button class="flex items-center px-3 py-2 border rounded text-teal-200 border-teal-400 hover:text-white hover:border-white" id="show-menu">
            <svg class="fill-current h-3 w-3" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z"/></svg>
          </button>
        </div>
        <div class="w-full block flex-grow lg:flex lg:items-center lg:w-auto mobile-menu">
          <div class="text-sm lg:flex-grow">
            <a href="#responsive-header" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4">
              Docs
            </a>
            <a href="#responsive-header" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4">
              Examples
            </a>
            <a href="#responsive-header" class="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white">
              Blog
            </a>
          </div>
          <div>
            <a href="#" class="inline-block text-sm px-4 py-2 leading-none border rounded text-white border-white hover:border-transparent hover:text-teal-500 hover:bg-white mt-4 lg:mt-0">Download</a>
          </div>
        </div>
      </nav>

    <!-- JavaScript -->
    <script src="script.js"></script>
</body>

js

const btn = document.getElementById("show-menu");
const menu = document.querySelector(".mobile-menu");
btn.addEventListener("click", () => {
  menu.classList.toggle("hidden");
  menu.classList.toggle("transition")
  menu.classList.toggle("delay-150")
  menu.classList.toggle("duration-300")
});
roejwanj

roejwanj1#

解决方案

因为你不能动画元素CSS widthheight时,它设置为auto。查看this thread关于这个问题。
1.已将overflow-hidden添加到您的div.mobile-menu
1.添加max-h-0作为初始高度。
1.切换max-h-0max-h-40以设置菜单高度的动画。
Codesandbox上查看

DOM元素大小动画的现代方法

计算并保存元素默认(自动)宽度或高度使用:
1.使用ResizeObserver API
1.使用getBoudingClientRect()
请记住设置overflow: hidden;来剪辑它们的内容。然后,可以通过以下方式设置它们的动画:
1.使用Javascript在默认值和0之间设置它们的宽度或高度值。
1.将CSS Transition设置为将被设置动画的元素。在默认值和0之间切换它们的宽度或高度。

au9on6nz

au9on6nz2#

.mobile-menu {
  transition-property: max-height;
  max-height: 0;
  overflow: hidden;
}

.mobile-menu.transition-all {
  transition-duration: 300ms;
}
const btn = document.getElementById("show-menu");
const menu = document.querySelector(".mobile-menu");
btn.addEventListener("click", () => {
  menu.classList.toggle("hidden");
  menu.classList.toggle("transition-all");
  menu.classList.toggle("duration-300");
});

相关问题