【问题标题】:How to use CSS animations to create a cube's opening like in the picture?如何使用 CSS 动画创建如图所示的立方体开口?
【发布时间】:2017-05-16 09:52:59
【问题描述】:

在我的项目中,当主页打开时,它应该运行 CSS 动画,以便打开立方体的面。动画完成后,人脸应该和图片中的一样(我需要有一个图片中第一个开口的结果)。

这是我的代码,

.sk-folding-cube {
  margin: 20px auto;
  width: 40px;
  height: 40px;
  position: relative;
}
.sk-folding-cube .sk-cube {
  float: left;
  width: 50%;
  height: 50%;
  position: relative;
  -webkit-transform: scale(1.1);
  -ms-transform: scale(1.1);
  transform: scale(1.1);
}
.sk-folding-cube .sk-cube:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #000000;
  -webkit-animation: sk-foldCubeAngle 2.4s 0.5 linear both;
  animation: sk-foldCubeAngle 2.4s 0.5 linear both;
  -webkit-transform-origin: 100% 100%;
  -ms-transform-origin: 100% 100%;
  transform-origin: 100% 100%;
}
.sk-folding-cube .sk-cube2 {
  -webkit-transform: scale(1.1) rotateZ(90deg);
  transform: scale(1.1) rotateZ(90deg);
}
.sk-folding-cube .sk-cube3 {
  -webkit-transform: scale(1.1) rotateZ(180deg);
  transform: scale(1.1) rotateZ(180deg);
}
.sk-folding-cube .sk-cube4 {
  -webkit-transform: scale(1.1) rotateZ(270deg);
  transform: scale(1.1) rotateZ(270deg);
}
.sk-folding-cube .sk-cube5 {
  -webkit-transform: scale(1.1) rotateZ(360deg);
  transform: scale(1.1) rotateZ(360deg);
}
.sk-folding-cube .sk-cube5 {
  -webkit-transform: scale(1.1) rotateZ(360deg);
  transform: scale(1.1) rotateZ(360deg);
}
.sk-folding-cube .sk-cube2:before {
  -webkit-animation-delay: 0.3s;
  animation-delay: 0.3s;
}
.sk-folding-cube .sk-cube3:before {
  -webkit-animation-delay: 0.6s;
  animation-delay: 0.6s;
}
.sk-folding-cube .sk-cube4:before {
  -webkit-animation-delay: 0.9s;
  animation-delay: 0.9s;
}
.sk-folding-cube .sk-cube5:before {
  -webkit-animation-delay: 1.2s;
  animation-delay: 1.2s;
}
.sk-folding-cube .sk-cube6:before {
  -webkit-animation-delay: 1.5s;
  animation-delay: 1.5s;
}
@-webkit-keyframes sk-foldCubeAngle {
  0%, 10% {
    -webkit-transform: perspective(140px) rotateX(-180deg);
    transform: perspective(140px) rotateX(-180deg);
    opacity: 0;
  }
  25%,
  75% {
    -webkit-transform: perspective(140px) rotateX(0deg);
    transform: perspective(140px) rotateX(0deg);
    opacity: 1;
  }
  90%,
  100% {
    -webkit-transform: perspective(140px) rotateY(180deg);
    transform: perspective(140px) rotateY(180deg);
    opacity: 0;
  }
}
@keyframes sk-foldCubeAngle {
  0%, 10% {
    -webkit-transform: perspective(140px) rotateX(-180deg);
    transform: perspective(140px) rotateX(-180deg);
    opacity: 0;
  }
  25%,
  75% {
    -webkit-transform: perspective(140px) rotateX(0deg);
    transform: perspective(140px) rotateX(0deg);
    opacity: 1;
  }
  90%,
  100% {
    -webkit-transform: perspective(140px) rotateY(180deg);
    transform: perspective(140px) rotateY(180deg);
    opacity: 0;
  }
}
<html>

<head>
  <link href="style.css" rel="stylesheet">
  <title>Open Cube</title>
  <h1>Apertura Cubo</h1>
</head>

<body>
  <div class="sk-folding-cube">
    <a href="http://google.com"><div class="sk-cube1 sk-cube"></div></a>
    <div class="sk-cube2 sk-cube"></div>
    <div class="sk-cube4 sk-cube"></div>
    <div class="sk-cube3 sk-cube"></div>
  </div>
</body>

</html>

我该怎么做?

【问题讨论】:

    标签: html css css-animations css-shapes


    【解决方案1】:

    从描述、sn-p 和所提供的图片来看,您似乎正在尝试创建一个平面立方体打开动画,其中立方体的每个面一个接一个地打开,最终呈现出如图所示的外观图片中的第一个样本。

    也许可以通过增强你当前的代码来达到这个效果,但我发现它有点混乱,所以我使用了我自己的平面立方体版本。

    说明:

    • 首先创建一个有六个面的立方体(每个面一个div 元素)。我将 front 面作为 left 面元素的子元素,因为正面最终应该在 left 脸。
    • 每个面都是一个 50 x 50 像素的正方形,其 transformtransform-origin 属性设置为创建一个立方体。
    • 然后将打开动画附加到每个面,并根据每个面何时打开而添加延迟。在demo中,面先开,所以没有延迟,面第二开,所以有1s的延迟(相当于动画right 面的时间),top 面第三张打开,因此有 2s 的延迟(等于前两张面的组合动画时间)等等。
    • back 面没有附加任何动画,因为它根本不需要打开 ;)

    .cube {
      position: relative;
      margin: 100px;
      transform-style: preserve-3d;
    }
    .cube div {
      position: absolute;
      height: 50px;
      width: 50px;
      transform-style: preserve-3d;
    }
    .back {
      background: rebeccapurple;
    }
    .right {
      background: tomato;
      transform: rotateY(90deg);
      transform-origin: right;
      animation: open-y 1s ease-in-out forwards;
    }
    .bottom {
      background: crimson;
      transform: rotateX(270deg);
      transform-origin: bottom;
      animation: open-x 1s 1s ease-in-out forwards;
    }
    .top {
      background: indianred;
      transform: rotateX(90deg);
      transform-origin: top;
      animation: open-x 1s 2s ease-in-out forwards;
    }
    .left {
      background: yellowgreen;
      transform: rotateY(270deg);
      transform-origin: left;
      animation: open-y 1s 3s ease-in-out forwards;
    }
    .front {
      background: chocolate;
      transform: rotateY(270deg);
      transform-origin: right;
      animation: open-y 1s 3s ease-in-out forwards;
    }
    @keyframes open-y {
      to {
        transform: rotateY(180deg);
      }
    }
    @keyframes open-x {
      to {
        transform: rotateX(180deg);
      }
    }
    <div class="cube">
      <div class="back"></div>
      <div class="right"></div>
      <div class="bottom"></div>
      <div class="top"></div>
      <div class="left">
        <div class="front"></div>
      </div>
    </div>

    注意:也很有可能以其他方式实现类似的效果,此外还可以使它们看起来更逼真,但这很可能涉及大量的翻译转换,额外的动画等的关键帧设置 - 简而言之,是更复杂的代码。

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 2017-04-21
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多