svg+css实现三种图标点击状态变化动画效果代码

代码语言:html

所属分类:动画

代码描述:svg+css实现三种图标点击状态变化动画效果代码,包含点赞、手册、金币支付三种图标。

代码标签: svg css 三种 图标 点击 状态 变化 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="zh-CN">

<head>

  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">

<style>
    :root {
  /* 自定义颜色变量 方便统一切换图标颜色 */
  --color: #fb7299;
  /* --color: #00aeec; */
}
* {
  /* 初始化基础元素 */
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  /* 解决手机浏览器点击有选框的问题 */
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
  /* 上下左右居中 */
  display: flex;
  justify-content: center;
  align-items: center;
  /* 元素的距离 */
  gap: 100px;
  /* 临时改成竖着居中 */
  /* flex-direction: column; */
  /* 超出部分隐藏 */
  overflow: hidden;

  min-height: 100vh;
}

.box {
  /* 内部元素上下左右居中 */
  display: flex;
  justify-content: center;
  align-items: center;

  width: 200px;
  height: 200px;
  /* 50% 的圆角就是 ○ */
  border-radius: 50%;
  /* 鼠标放上去是小手 */
  cursor: pointer;

  position: relative;
}

.box .icon {
  width: 150px;
  height: 150px;

  /* svg 的填充颜色 */
  fill: #ddd;
  /* svg 的描边线宽 */
  stroke-width: 1;
  /* svg 的描边颜色 */
  stroke: var(--color);
  /* svg 的描边线框样式 */
  stroke-dasharray: 100;
  /* svg 的描边偏移量,也就是描边开始到结束的距离 */
  stroke-dashoffset: 100;
  /* svg 的描边两头的形状,是圆的 */
  stroke-linecap: round;

  z-index: 10;
}

.box span,
.box span::before {
  width: 20px;
  height: 20px;
  background-color: transparent;
  border-radius: 50%;
  /* 利用盒子阴影来实现小圆点绕着中心的效果 */
  box-shadow: 0 -120px 0 var(--color), 0 120px 0 var(--color),
    -120px 0 0 var(--color), 120px 0 0 var(--color);

  /* 元素居中 */
  position: absolute;
  top: 50%;
  left: 50%;
  /* scale(0) 是先把小圆点隐藏起来,下面动画再显示 */
  transform: translate(-50%, -50%) scale(0);
}
.box span::before {
  content: "";

  /* 利用伪元素复制一份小圆点,rotate(45deg) 旋转 45° */
  transform: translate(-50%, -50%) rotate(45deg) scale(0);
}

.box input[type="checkbox"] {
  /* 隐藏默认复选框样式 */
  display: none;

  position: absolute;
}

.box input[type="checkbox"]:checked ~ .icon path {
  /* 给 svg 图标添加动画 */
  animation: 1s animate-fill linear forwards;
}
@keyframes animate-fill {
  /* 动画主要修改 svg 的描边偏移量和填充颜色,要掌握好动画的时间 */
  0% {
    stroke-dashoffset: 100;
  }
  80% {
    stroke-dashoffset: 0;
    fill: #ddd;
  }
  100% {
    stroke-dashoffset: 0;
    fill: var(--color);
  }
}

.box input[type="checkbox"]:checked ~ span {
  /* 给图标周围的小圆点添加动画 */
  animation: 0.5s animate-flash ease-in-out forwards 0.85s;
}
@keyframes animate-flash {
  0% {
    /* 通过 scale(0.5) 放大缩小控制圆点距离 */
    transform: translate(-50%, -50%) scale(0.5);
    /* 控制圆点的显示和隐藏 */
    opacity: 0.8;
  }
  50% {
    transform: translate(-50%, -50%) scale(1);
    opacity: 0.8;
  }
  100% {
    transform: translate(-50%, -50%) scale(1.5);
    opacity: 0;
  }
}

.box input[type="checkbox"]:checked ~ span::before {
  /* 同上一步一样,只不过伪元素需要单独添加旋转的 45° */
  animation: 0.5s animate-flash-before ease-in-out forwards 0.85s;
}
@keyframes animate-flash-before {
  0% {
    transform: translate(-50%, -50%) rotate(45deg) scale(0.5);
    opacity: 0.8;
  }
  50% {
    transform: translate(-50%, -50%) rotate(45deg) scale(1);
    opacity: 0.8;
  }
  100% {
    transform: translate(-50%, -50%) rotate(45deg) scale(1.5);
    opacity: 0;
  }
}

/* 下面是分别为三个图标添加不一样的动画,原理一样,掌握好动画时间即可 */
.like input[type="checkbox"]:checked ~ .icon {
  animation: 1s animate-like ease-in-out forwards 0.85s;
}
@keyframes animate-like {
  0%,
  100% {
    transform: rotate(0);
  }
  30% {
    transform: rotate(-30deg);
  }
  60% {
    transform: rotate(10deg);
  }
  80% {
    transform: rotate(-20deg);
  }
}

.coin input[type="checkbox"]:checked ~ .icon {
  animation: 1s animate-coin ease-in-out forwards;
}
@keyframes animate-coin {
  0%,
  100% {
    transform: translateY(0);
  }
  30% {
    transform: translateY(-20px);
  }
  60% {
    transform: translateY(10px);
  }
  80% {
    transform: translateY(-10px);
  }
}

.collect input[type="checkbox"]:checked ~ .icon {
  animation: 1s animate-collect ease-in-out forwards;
}
@keyframes animate-collect {
  0%,
  100% {
    transform: scale(1);
  }
  70% {
    transform: scale(1);
  }
  80% {
    transform: scale(1.5);
  }
}

</style>

</head>
.........完整代码请登录后点击上方下载按钮下载查看

网友评论0