如何为单个按钮实现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; }
关键说明
- 悬停逻辑:在默认平移基础上,再向左上移动4px,同时翻倍阴影层级,强化弹出视觉效果。
- 点击逻辑:将平移值调整为比默认状态右移下移2px,同时缩小阴影,模拟按压下沉的质感。
- 状态一致性:所有状态的
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
相关产品推荐
相关产品推荐

