如何实现TailWind CSS购物车悬停下拉菜单移出后延迟2秒隐藏
实现方案
改动说明
- 下拉容器默认添加
hidden类实现初始隐藏 - 给购物车外层相对定位容器添加
id="cartWrapper"用于JS元素选择 - 新增原生JS逻辑实现悬停显隐+延迟隐藏效果,鼠标重新移入会取消待执行的隐藏任务,避免用户操作下拉时菜单意外消失
完整实现代码
<div class="p-5"> <div class="flex h-64 justify-center"> <!-- 给外层容器加id方便选择 --> <div class="relative" id="cartWrapper"> <div class="flex flex-row cursor-pointer truncate p-2 px-4 rounded"> <div></div> <div class="flex flex-row-reverse ml-2 w-full"> <div slot="icon" class="relative"> <div class="absolute text-xs rounded-full -mt-1 -mr-2 px-1 font-bold top-0 right-0 bg-red-700 text-white">3</div> <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-shopping-cart w-6 h-6 mt-2"> <circle cx="9" cy="21" r="1"></circle> <circle cx="20" cy="21" r="1"></circle> <path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path> </svg> </div> </div> </div> <!-- 下拉容器加hidden默认隐藏 --> <div class="absolute w-full rounded-b border-t-0 z-10 hidden" id="cartDropdown"> <div class="shadow-xl w-64"> <div class="p-2 flex bg-white hover:bg-gray-100 cursor-pointer border-b border-gray-100" style=""> <div class="p-2 w-12"><img src="https://dummyimage.com/50x50/bababa/0011ff&text=50x50" alt="img product"></div> <div class="flex-auto text-sm w-32"> <div class="font-bold">Product 1</div> <div class="truncate">Product 1 description</div> <div class="text-gray-400">Qt: 2</div> </div> <div class="flex flex-col w-18 font-medium items-end"> <div class="w-4 h-4 mb-6 hover:bg-red-200 rounded-full cursor-pointer text-red-700"> <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-trash-2 "> <polyline points="3 6 5 6 21 6"></polyline> <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path> <line x1="10" y1="11" x2="10" y2="17"></line> <line x1="14" y1="11" x2="14" y2="17"></line> </svg> </div> $12.22</div> </div> <div class="p-2 flex bg-white hover:bg-gray-100 cursor-pointer border-b border-gray-100" style=""> <div class="p-2 w-12"><img src="https://dummyimage.com/50x50/bababa/0011ff&text=50x50" alt="img product"></div> <div class="flex-auto text-sm w-32"> <div class="font-bold">Product 2</div> <div class="truncate">Product 2 long description</div> <div class="text-gray-400">Qt: 2</div> </div> <div class="flex flex-col w-18 font-medium items-end"> <div class="w-4 h-4 mb-6 hover:bg-red-200 rounded-full cursor-pointer text-red-700"> <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-trash-2 "> <polyline points="3 6 5 6 21 6"></polyline> <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path> <line x1="10" y1="11" x2="10" y2="17"></line> <line x1="14" y1="11" x2="14" y2="17"></line> </svg> </div> $12.22</div> </div> <div class="p-2 flex bg-white hover:bg-gray-100 cursor-pointer border-b border-gray-100" style=""> <div class="p-2 w-12"><img src="https://dummyimage.com/50x50/bababa/0011ff&text=50x50" alt="img product"></div> <div class="flex-auto text-sm w-32"> <div class="font-bold">Product 3</div> <div class="truncate">Product 3 description</div> <div class="text-gray-400">Qt: 2</div> </div> <div class="flex flex-col w-18 font-medium items-end"> <div class="w-4 h-4 mb-6 hover:bg-red-200 rounded-full cursor-pointer text-red-700"> <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-trash-2 "> <polyline points="3 6 5 6 21 6"></polyline> <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path> <line x1="10" y1="11" x2="10" y2="17"></line> <line x1="14" y1="11" x2="14" y2="17"></line> </svg> </div> $12.22</div> </div> <div class="p-4 justify-center flex"> <button class="text-base undefined hover:scale-110 focus:outline-none flex justify-center px-4 py-2 rounded font-bold cursor-pointer hover:bg-teal-700 hover:text-teal-100 bg-teal-100 text-teal-700 border duration-200 ease-in-out border-teal-600 transition">Checkout $36.66</button> </div> </div> </div> </div> </div> <div class="h-32"></div> </div> <script> // 购物车下拉显隐逻辑 const cartWrapper = document.getElementById('cartWrapper') const cartDropdown = document.getElementById('cartDropdown') let hideTimer = null // 鼠标移入:清除待执行的隐藏任务,显示下拉 cartWrapper.addEventListener('mouseenter', () => { clearTimeout(hideTimer) cartDropdown.classList.remove('hidden') }) // 鼠标移出:2秒后隐藏下拉 cartWrapper.addEventListener('mouseleave', () => { hideTimer = setTimeout(() => { cartDropdown.classList.add('hidden') }, 2000) }) </script>
可调整说明
代码中setTimeout的2000对应2秒延迟,可根据业务需求自行修改数值调整等待时长。
内容的提问来源于stack exchange,提问作者Ciniminis
相关产品推荐
相关产品推荐

