You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

下拉菜单Hover动画在Firefox/Chrome正常,Safari仅首次生效求助

Safari下拉菜单Hover动画仅首次生效的修复方案

问题:下拉菜单的Hover动画在Firefox和Chrome中每次悬停都能正常触发,但Safari仅首次悬停生效,代码如下:

#nav ul li:hover ul  {
    box-shadow: 0 8px 25px rgba(38, 51, 54, .1);
    border-radius: 0 0 15px 15px;
    background: #fff;
    animation-duration: .8s;
    animation-name: updown; 
}
@keyframes updown {
  0% {
    transform: translateY(30%);
  }

  100% {
    transform: translateY(0%);
  }
}

修复方法

Safari的动画触发逻辑与其他浏览器存在差异:动画完成后元素会保留最终状态,再次hover时,浏览器检测不到状态变化,因此不会重新启动动画。以下两种方案可解决该问题:

方案1:重置非hover状态的初始属性

给下拉菜单的默认状态添加初始transform值,确保每次hover时都能从初始状态触发动画:

#nav ul li ul {
    /* 添加上拉菜单默认状态的初始transform */
    transform: translateY(30%);
    /* 可选:默认隐藏下拉菜单,根据布局调整 */
    opacity: 0;
    pointer-events: none;
}

#nav ul li:hover ul  {
    box-shadow: 0 8px 25px rgba(38, 51, 54, .1);
    border-radius: 0 0 15px 15px;
    background: #fff;
    animation-duration: .8s;
    animation-name: updown;
    /* hover时显示下拉菜单 */
    opacity: 1;
    pointer-events: auto;
}

@keyframes updown {
  0% {
    transform: translateY(30%);
  }

  100% {
    transform: translateY(0%);
  }
}

方案2:用transition替代animation(更简洁)

若动画逻辑简单,使用transition替代animation能获得更好的多浏览器兼容性,同时避免Safari的触发问题:

#nav ul li ul {
    box-shadow: 0 8px 25px rgba(38, 51, 54, .1);
    border-radius: 0 0 15px 15px;
    background: #fff;
    transform: translateY(30%);
    opacity: 0;
    pointer-events: none;
    transition: transform 0.8s ease, opacity 0.8s ease;
}

#nav ul li:hover ul {
    transform: translateY(0%);
    opacity: 1;
    pointer-events: auto;
}

说明

  • 方案1通过明确初始状态,让Safari每次hover都能检测到属性变化,从而重新触发动画。
  • 方案2使用过渡属性更符合CSS交互的常规写法,代码更简洁,浏览器适配性更强。

内容的提问来源于stack exchange,提问作者Peggy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:09:26