pug+scss实现三维魔方旋转动画效果代码

代码语言:html

所属分类:动画

代码描述:pug+scss实现三维魔方旋转动画效果代码

代码标签: pug scss 三维 魔方 旋转 动画

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

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum=1.0,minimum=1.0,user-scalable=0" />
  
    
      
<style type = 'text/scss'>
body {
  display: grid;
  place-items: center;
  height: 100vh;
  margin: 0;
  background: #434343;
  
  perspective: 90vh;

  * {
    transform-style: preserve-3d;
    box-sizing: border-box;
  }
}

.cube {
  --cube-size: 40vh;
  --color-1: #413B3B;
  --color-2: #FCE932;
  
  @media screen and (orientation: portrait) {
    --cube-size: 40vw;
  }

  position: relative;
  width: calc(var(--cube-size) + 20vh);
  height: calc(var(--cube-size) + 20vh);
  
  transform: rotateX(-20deg) rotateY(20deg) rotateZ(0deg);
  animation: animCube 40s infinite alternate ease-in-out;
  
  border: 1px solid rgba(white, 0);
  background-color: rgba(white, 0);
  border-radius: 1vh;
  transition: border 250ms ease-in-out, background-color 250ms ease-in-out;
  
  &:active {
    border: 1px solid rgba(white, .1);
    background-color: rgba(white, .03);
  }
}

.block {
  --block-size: calc(var(--cube-size) / 3);
  --block-x: calc(var(--block-size) / 2 * -1); // -50%;
  --block-y: calc(var(--block-size) / 2 * -1); // -50%;
  --block-z: 0;
  --block-rx: 0deg;
  --block-ry: 0deg;
  --block-rz: 0deg;
  --block-radius: 0px;
  --block-filter: 0px;
  
  position: absolute;
  top: 50%;
  left: 50%;
  
  width: var(--block-size);
  height: var(--block-size);
  
  transform-origin: 0 0;
  transform:
    rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(var(--block-rz))
    translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z));
  
  transition: transform 1s ease-in-out;
  
  @for $i from 1 through 27 {
    &:nth-child(#{$i}) {
      animation: animBlock#{$i} 10s infinite alternate ease-in-out;
    }
  }
  
  &:hover {
    --block-radius: 3vh;
    --block-filter: sepia(50%);
    
    @media screen and (orientation: portrait) {
      --block-radius: 3vw;
    }
  }
  
  &:nth-child(-n + 9) { // 1 - 9
    --block-z: var(--block-size);
  }
  
  &:nth-child(n + 19) { // 19 - 27
    --block-z: calc(var(--block-size) * -1);
  }
  
  &:nth-child(n + 1):nth-child(-n + 3), // 1 - 3
  &:nth-child(n + 10):nth-child(-n + 12),
  &:nth-child(n + 19):nth-child(-n + 21) {
    --block-y: calc(var(--block-size) * -1.5);
  }
  
  &:nth-child(n + 7):nth-child(-n + 9),
  &:nth-child(n + 16):nth-child(-n + 18),
  &:nth-child(n + 25):nth-child(-n + 27) {
    --block-y: calc(var(--block-size) * .5);
  }
  
  &:nth-child(3n - 2) {
    --block-x: calc(var(--block-size) * -1.5);
  }
  
  &:nth-child(3n) {
    --block-x: calc(var(--block-size) * .5);
  }
  
  &__side {
    --side-size: var(--block-size);
    // --side-size: calc(var(--block-size) - 10px);
    
    position: absolute;
    top: 0;
    left: 0;
    
    width: var(--side-size);
    height: var(--side-size);
    background: var(--color-1);
    
    border-radius: var(--block-radius);
    transition: filter 500ms ease-in-out, border-radius 500ms ease-in-out;
    filter: none;
    
    &:hover {
      filter: var(--block-filter);
    }
    
    &:nth-child(1) {
      transform: translateZ(calc(var(--side-size) / 2));
    }
    
    &:nth-child(2) {
      transform: rotateY(90deg) translateZ(calc(var(--side-size) / 2));
    }
    
    &:nth-child(3) {
      transform: rotateY(-180deg) translateZ(calc(var(--side-size) / 2));
    }
    
    &:nth-child(4) {
      transform: rotateY(-90deg) translateZ(calc(var(--side-size) / 2));
    }
    
    &:nth-child(5) {
      background: var(--color-2);
      transform-origin: 0 0;
      transform: rotateX(90deg) translateY(-50%);
    }
    
    &:nth-child(6) {
      background: var(--color-2);
      transform-origin: 0 100%;
      transform: rotateX(90deg) translateY(50%);
    }
  }
}

@keyframes animCube {
  0% { transform: rotateX(-20deg) rotateY(20deg) rotateZ(90deg); }
  25% { transform: rotateX(20deg) rotateY(20deg) rotateZ(-90deg); }
  50% { transform: rotateX(20deg) rotateY(-120deg) rotateZ(0deg); }
  75% { transform: rotateX(-120deg) rotateY(-20deg) rotateZ(0deg); }
  100% { transform: rotateX(-20deg) rotateY(20deg) rotateZ(0deg); }
}

@keyframes animBlock1 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  75% { transform: rotateX(180deg) rotateY(90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(180deg) rotateY(90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock2 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  75% { transform: rotateX(180deg) rotateY(90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(180deg) rotateY(90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock3 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  75% { transform: rotateX(180deg) rotateY(90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(180deg) rotateY(90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock4 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  75% { transform: rotateX(180deg) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(180deg) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock5 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock6 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  75% { transform: rotateX(-180deg) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(-180deg) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock7 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(-90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  75% { transform: rotateX(-180deg) rotateY(-90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(-180deg) rotateY(-90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock8 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(-90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  75% { transform: rotateX(-180deg) rotateY(-90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(-180deg) rotateY(-90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock9 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(-90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  75% { transform: rotateX(-180deg) rotateY(-90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(-180deg) rotateY(-90deg) rotateZ(180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock10 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(-180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(90deg) rotateZ(-180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(var(--block-rx)) rotateY(90deg) rotateZ(-180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock11 {
  25% { transform: rotateX(var(--block-rx)) rotateY(var(--block-ry)) rotateZ(-180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  50% { transform: rotateX(var(--block-rx)) rotateY(90deg) rotateZ(-180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
  100% { transform: rotateX(var(--block-rx)) rotateY(90deg) rotateZ(-180deg) translateX(var(--block-x)) translateY(var(--block-y)) translateZ(var(--block-z)); }
}

@keyframes animBlock12 {
  25% { transform: rotateX(var(-.........完整代码请登录后点击上方下载按钮下载查看

网友评论0