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

如何为单个按钮实现CSS加载、悬停弹出及点击按压动画?

解决方案

你的:active样式无效,核心原因是按钮加载动画结束后,transform已经是translateX(-8px) translateY(-8px) rotateZ(5deg) rotateX(10deg) rotateY(-15deg)状态,而你写的:active代码直接覆盖了这个状态,相当于回到初始旋转位置再平移,视觉变化被抵消。以下是修复后的完整代码,同时实现悬停弹出和点击按压效果:

/* 页面加载时的弹出动画 */
.shadow-pop-br {
  animation: shadow-pop-br 300ms cubic-bezier(0.175, 0.885, 0.320, 1.275) both;
}

@keyframes shadow-pop-br {
  0% {
    box-shadow: 0 0 #3e3e3e, 0 0 #3e3e3e, 0 0 #3e3e3e, 0 0 #3e3e3e, 0 0 #3e3e3e, 0 0 #3e3e3e, 0 0 #3e3e3e, 0 0 #3e3e3e;
    transform: translateX(0) translateY(0) rotateZ(5deg) rotateX(10deg) rotateY(-15deg);
  }
  100% {
    box-shadow: 1px 1px #3e3e3e, 2px 2px #3e3e3e, 3px 3px #3e3e3e, 4px 4px #3e3e3e, 5px 5px #3e3e3e, 6px 6px #3e3e3e, 7px 7px #3e3e3e, 8px 8px #3e3e3e;
    transform: translateX(-8px) translateY(-8px) rotateZ(5deg) rotateX(10deg) rotateY(-15deg);
  }
}

/* 按钮基础样式 */
.button2 {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  border: 3px solid #000000;
  border-radius: 0px;
  padding: 0;
  text-decoration: none;
  color: #000000;
  position: relative;
  overflow: hidden;
  /* 明确动画结束后的默认状态,与动画100%帧保持一致 */
  transform: translateX(-8px) translateY(-8px) rotateZ(5deg) rotateX(10deg) rotateY(-15deg);
  transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275),
              box-shadow 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  height: 130px;
  width: 130px;
  cursor: pointer;
  animation: shadow-pop-br 300ms cubic-bezier(0.175, 0.885, 0.320, 1.275) both;
}

/* 悬停时进一步弹出效果 */
.button2:hover {
  transform: translateX(-12px) translateY(-12px) rotateZ(5deg) rotateX(10deg) rotateY(-15deg);
  box-shadow: 2px 2px #3e3e3e, 4px 4px #3e3e3e, 6px 6px #3e3e3e, 8px 8px #3e3e3e, 10px 10px #3e3e3e, 12px 12px #3e3e3e, 14px 14px #3e3e3e, 16px 16px #3e3e3e;
}

/* 点击按压效果 */
.button2:active {
  transform: translateX(-6px) translateY(-6px) rotateZ(5deg) rotateX(10deg) rotateY(-15deg);
  box-shadow: 0.5px 0.5px #3e3e3e, 1px 1px #3e3e3e, 1.5px 1.5px #3e3e3e, 2px 2px #3e3e3e, 2.5px 2.5px #3e3e3e, 3px 3px #3e3e3e, 3.5px 3.5px #3e3e3e, 4px 4px #3e3e3e;
}

关键说明

  1. 悬停逻辑:在默认平移基础上,再向左上移动4px,同时翻倍阴影层级,强化弹出视觉效果。
  2. 点击逻辑:将平移值调整为比默认状态右移下移2px,同时缩小阴影,模拟按压下沉的质感。
  3. 状态一致性:所有状态的transform都保留完整的旋转参数,避免3D倾斜效果丢失,已设置的transition会自动处理状态间的平滑过渡。

如果想简化代码维护,可以用CSS变量统一管理旋转和平移参数:

:root {
  --btn-rotate: rotateZ(5deg) rotateX(10deg) rotateY(-15deg);
  --btn-default-translate: translateX(-8px) translateY(-8px);
}

/* 按钮基础样式的transform */
transform: var(--btn-default-translate) var(--btn-rotate);

/* 悬停时 */
.button2:hover {
  transform: translateX(-12px) translateY(-12px) var(--btn-rotate);
}

/* 点击时 */
.button2:active {
  transform: translateX(-6px) translateY(-6px) var(--btn-rotate);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:25:17