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

如何实现登录按钮Hover时切换锁形图标(含动效需求)

实现带锁形切换动画的登录按钮

核心实现思路

借助Heroicons的lock-closed和lock-open原生SVG图标,通过CSS :hover伪类控制图标显隐,搭配过渡动画实现平滑切换;如果需要更逼真的“逐步打开”效果,可拆分锁的部件单独做动画,两种方案都无需额外依赖。


方案一:双图标切换(简洁高效)

直接用两个完整的锁图标,hover时切换显示并添加动效:

<button class="login-btn">
  <!-- 闭合锁图标 -->
  <svg class="icon lock-closed" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
    <path stroke-linecap="round" stroke-linejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" />
  </svg>
  <!-- 打开锁图标 -->
  <svg class="icon lock-open" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
    <path stroke-linecap="round" stroke-linejoin="round" d="M13.5 10.5V6.75a4.5 4.5 0 119 0v3.75M3.75 21.75h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H3.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" />
  </svg>
  <span>登录</span>
</button>
.login-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.75rem 1.5rem;
  background-color: #3b82f6;
  color: #fff;
  border: none;
  border-radius: 0.5rem;
  cursor: pointer;
  position: relative; /* 为绝对定位图标提供参考 */
  transition: background-color 0.2s ease;
}

.login-btn:hover {
  background-color: #2563eb;
}

.icon {
  width: 1.5rem;
  height: 1.5rem;
  transition: all 0.3s ease;
}

/* 初始状态:显示闭合锁,隐藏打开锁 */
.lock-closed {
  opacity: 1;
}
.lock-open {
  opacity: 0;
  position: absolute;
  left: 1.5rem; /* 与闭合锁位置对齐 */
}

/* hover时切换图标状态,添加旋转动效增强质感 */
.login-btn:hover .lock-closed {
  opacity: 0;
  transform: rotate(-10deg);
}

.login-btn:hover .lock-open {
  opacity: 1;
  transform: rotate(10deg);
}

方案二:锁舌单独动画(逼真打开效果)

如果不想切换整个图标,可把锁的SVG拆分为锁身和锁舌,单独给锁舌做旋转动画:

<button class="login-btn-advanced">
  <svg class="icon lock-icon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
    <!-- 锁身 -->
    <path stroke-linecap="round" stroke-linejoin="round" d="M-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" />
    <!-- 锁舌:单独分组,方便控制动画 -->
    <g class="lock-latch">
      <path stroke-linecap="round" stroke-linejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75" />
    </g>
  </svg>
  <span>登录</span>
</button>
.login-btn-advanced {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.75rem 1.5rem;
  background-color: #3b82f6;
  color: #fff;
  border: none;
  border-radius: 0.5rem;
  cursor: pointer;
  transition: background-color 0.2s ease;
}

.login-btn-advanced:hover {
  background-color: #2563eb;
}

.lock-icon {
  width: 1.5rem;
  height: 1.5rem;
}

/* 锁舌动画设置 */
.lock-latch {
  transform-origin: center bottom; /* 以锁舌底部为旋转中心 */
  transition: transform 0.3s ease;
}

/* hover时锁舌向上旋转,模拟开锁动作 */
.login-btn-advanced:hover .lock-latch {
  transform: rotate(-45deg) translateY(-2px);
}

关键说明

  • 两种方案均基于Heroicons原生SVG,无需额外引入资源
  • 双图标方案实现简单,适合快速开发;锁舌动画方案更贴近真实开锁效果
  • 所有过渡动画可通过调整transition的时长和缓动函数,自定义动画节奏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:32:03