svg三维动态表情效果

代码语言:html

所属分类:动画

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


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">

<style>
.feedback {
  --normal: #ECEAF3;
  --normal-shadow: #D9D8E3;
  --normal-mouth: #9795A4;
  --normal-eye: #595861;
  --active: #F8DA69;
  --active-shadow: #F4B555;
  --active-mouth: #F05136;
  --active-eye: #313036;
  --active-tear: #76b5e7;
  --active-shadow-angry: #e94f1d;
  margin: 0;
  padding: 0;
  list-style: none;
  display: -webkit-box;
  display: flex;
}
.feedback li {
  position: relative;
  border-radius: 50%;
  background: var(--sb, var(--normal));
  box-shadow: inset 3px -3px 4px var(--sh, var(--normal-shadow));
  -webkit-transition: background .4s, box-shadow .4s, -webkit-transform .3s;
  transition: background .4s, box-shadow .4s, -webkit-transform .3s;
  transition: background .4s, box-shadow .4s, transform .3s;
  transition: background .4s, box-shadow .4s, transform .3s, -webkit-transform .3s;
  -webkit-tap-highlight-color: transparent;
}
.feedback li:not(:last-child) {
  margin-right: 20px;
}
.feedback li div {
  width: 40px;
  height: 40px;
  position: relative;
  -webkit-transform: perspective(240px) translateZ(4px);
          transform: perspective(240px) translateZ(4px);
}
.feedback li div svg, .feedback li div:before, .feedback li div:after {
  display: block;
  position: absolute;
  left: var(--l, 9px);
  top: var(--t, 13px);
  width: var(--w, 8px);
  height: var(--h, 2px);
  -webkit-transform: rotate(var(--r, 0deg)) scale(var(--sc, 1)) translateZ(0);
          transform: rotate(var(--r, 0deg)) scale(var(--sc, 1)) translateZ(0);
}
.feedback li div svg {
  fill: none;
  stroke: var(--s);
  stroke-width: 2px;
  stroke-linecap: round;
  stroke-linejoin: round;
  -webkit-transition: stroke .4s;
  transition: stroke .4s;
}
.feedback li div svg.eye {
  --s: var(--e, var(--normal-eye));
  --t: 17px;
  --w: 7px;
  --h: 4px;
}
.feedback li div svg.eye.right {
  --l: 23px;
}
.feedback li div svg.mouth {
  --s: var(--m, var(--normal-mouth));
  --l: 11px;
  --t: 23px;
  --w: 18px;
  --h: 7px;
}
.feedback li div:before, .feedback li div:after {
  content: '';
  z-index: var(--zi, 1);
  border-radius: var(--br, 1px);
  background: var(--b, var(--e, var(--normal-eye)));
  -webkit-transition: background .4s;
  transition: background .4s;
}
.feedback li.angry {
  --step-1-rx: -24deg;
  --step-1-ry: 20deg;
  --step-2-rx: -24deg;
  --step-2-ry: -20deg;
}
.feedback li.angry div:before {
  --r: 20deg;
}
.feedback li.angry div:after {
  --l: 23px;
  --r: -20deg;
}
.feedback li.angry div svg.eye {
  stroke-dasharray: 4.55;
  stroke-dashoffset: 8.15;
}
.feedback li.angry.active {
  -webkit-animation: angry 1s linear;
          animation: angry 1s linear;
}
.feedback li.angry.active div:before {
  --middle-y: -2px;
  --middle-r: 22deg;
  -webkit-animation: toggle .8s linear forwards;
          animation: toggle .8s linear forwards;
}
.feedback li.angry.active div:after {
  --middle-y: 1px;
  --middle-r: -18deg;
  -webkit-animation: toggle .8s linear forwards;
          animation: toggle .8s linear forwards;
}
.feedback li.sad {
  --step-1-rx: 20deg;
  --step-1-ry: -12deg;
  --step-2-rx: -18deg;
  --step-2-ry: 14deg;
}
.feedback li.sad div:before, .feedback li.sad div:after {
  --b: var(--active-tear);
  --sc: 0;
  --w: 5px;
  --h: 5px;
  --t: 15px;
  --br: 50%;
}
.feedback li.sad div:after {
  --l: 25px;
}
.feedback li.sad div svg.eye {
  --t: 16px;
}
.feedback li.sad div svg.mouth {
  --t: 24px;
  stroke-dasharray: 9.5;
  stroke-dashoffset: 33.25;
}
.feedback li.sad.active div:before, .feedback li.sad.active div:after {
  -webkit-animation: tear .6s linear forwards;
          animation: tear .6s linear forwards;
}
.feedback li.ok {
  --step-1-rx: 4deg;
  --step-1-ry: -22deg;
  --step-1-rz: 6deg;
  --step-2-rx: 4deg;
  --step-2-ry: 22deg;
  --step-2-rz: -6deg;
}
.feedback li.ok div:before {
  --l: 12px;
  --t: 17px;
  --h: 4px;
  --w: 4px;
  --br: 50%;
  box-shadow: 12px 0 0 var(--e, var(--normal-eye));
}
.feedback li.ok div:after {
  --l: 13px;
  --t: 26px;
  --w: 14px;
  --h: 2px;
  --br: 1px;
  --b: var(--m, var(--normal-mouth));
}
.feedback li.ok.active div:before {
  --middle-s-y: .35;
  -webkit-animation: toggle .2s linear forwards;
          animation: toggle .2s linear forwards;
}
.feedback li.ok.active div:after {
  --middle-s-x: .5;
  -webkit-animation: toggle .7s linear forwards;
          animation: toggle .7s linear forwards;
}
.feedback li.good {
  --step-1-rx: -14deg;
  --step-1-rz: 10deg;
  --step-2-rx: 10deg;
  --step-2-rz: -8deg;
}
.feedback li.good div:before {
  --b: var(--m, var(--normal-mouth));
  --w: 5px;
  --h: 5px;
  --br: 50%;
  --t: 22px;
  --zi: 0;
  opacity: .5;
  box-shadow: 16px 0 0 var(--b);
  -webkit-filter: blur(2px);
          filter: blur(2px);
}
.feedback li.good div:after {
  --sc: 0;
}
.feedback li.good div svg.eye {
  --t: 15px;
  --sc: -1;
  stroke-dasharray: 4.55;
  stroke-dashoffset: 8.15;
}
.feedback li.good div svg.mouth {
  --t: 22px;
  --sc: -1;
  stroke-dasharray: 13.3;
  stroke-dashoffset: 23.75;
}
.feedback li.good.active div svg.mouth {
  --middle-y: 1px;
  --middle-s: -1;
  -webkit-animation: toggle .8s linear forwards;
          animation: toggle .8s linear forwards;
}
.feedback li.happy div {
  --step-1-rx: 18deg;
  --step-1-ry: 24deg;
  --step-2-rx: 18deg;
  --step-2-ry: -24deg;
}
.feedback li.happy div:before {
  --sc: 0;
}
.feedback li.happy div:after {
  --b: var(--m, var(--normal-mouth));
  --l: 11px;
  --t: 23px;
  --w: 18px;
  --h: 8px;
  --br: 0 0 8px 8px;
}
.feedback li.happy div svg.eye {
  --t: 14px;
  --sc: -1;
}
.feedback li.happy.active div:after {
  --middle-s-x: .95;
  --middle-s-y: .75;
  -webkit-animation: toggle .8s linear forwards;
          animation: toggle .8s linear forwards;
}
.feedback li:not(.active) {
  cursor: pointer;
}
.feedback li:not(.active):active {
  -webkit-transform: scale(0.925);
          transform: scale(0.925);
}
.feedback li.active {
  --sb: var(--active);
  --sh: var(--active-shadow);
  --m: var(--active-mouth);
  --e: var(--active-eye);
}
.feedback li.active div {
  -webkit-animation: shake .8s linear forwards;
          animation: shake .8s linear forwards;
}

@-webkit-keyframes shake {
  30% {
    -webkit-transform: perspective(240px) rotateX(var(--step-1-rx, 0deg)) rotateY(var(--step-1-ry, 0deg)) rotateZ(var(--step-1-rz, 0deg)) translateZ(10px);
            transform: perspective(240px) rotateX(var(--step-1-rx, 0deg)) rotateY(var(--step-1-ry, 0deg)) rotateZ(var(--step-1-rz, 0deg)) translateZ(10px);
  }
  60% {
    -webkit-transform: perspective(240px) rotateX(var(--step-2-rx, 0deg)) rotateY(var(--step-2-ry, 0deg)) rotateZ(var(--step-2-rz, 0deg)).........完整代码请登录后点击上方下载按钮下载查看

网友评论0