创建立方体打开动画

时间:2016-12-06 13:36:15

标签: css css3 css-animations css-shapes css-transforms

我有以下HTML和CSS代码来绘制多维数据集的顶部。所以它向下移动,我希望它能够像开放一样动画。我无法弄清楚如何转换顶部以便它看起来像是打开了。

我已经包含了多维数据集的整个代码。关于这一点,我希望顶部开放。

.pers500 {
  perspective: 500px;
  -webkit-perspective: 500px;
  -moz-perspective: 500px;
}
/* Define the container div, the cube div, and a generic face */

.container {
  width: 25%;
  margin: 0 auto;
  margin-top: 2em;
  border: none;
  animation-name: moveDown;
  animation-duration: 2s;
  animation-timing-function: linear;
  transform: translate(0px, 110px);
}
.cube {
  width: 70%;
  height: 70%;
  backface-visibility: visible;
  perspective-origin: 150% 150%;
  transform-style: preserve-3d;
  -webkit-backface-visibility: visible;
  -webkit-perspective-origin: 150% 150%;
  -webkit-transform-style: preserve-3d;
}
.face {
  display: block;
  position: absolute;
  border: none;
  line-height: 100px;
  font-family: sans-serif;
  font-size: 60px;
  color: white;
  text-align: center;
}
/* Define each face based on direction */

.front {
  width: 3.64em;
  height: 3.43em;
  background-color: rgba(0, 255, 0, 0.7);
  transform: translateZ(50px) translateX(171px) translateY(222px);
  -webkit-transform: translateZ(50px) translateX(171px) translateY(222px);
  -moz-transform: translateZ(50px) translateX(171px) translateY(222px);
}
.left {
  width: 2em;
  height: 3.4em;
  background-color: rgba(0, 0, 255, 0.7);
  margin: 70px;
  transform: skewY(40deg) translateZ(50px);
  -webkit-transform: skewY(40deg) translateZ(50px) translateY(65px) translateX(-20px);
  -moz-transform: skewY(40deg) translateZ(50px) translateY(62px) translateX(-20px);
}
.top {
  width: 3.65em;
  height: 1.7em;
  background-color: rgba(255, 0, 0, 0.7);
  margin: 100px;
  transform: skewX(50deg) translateZ(50px) translateX(-14px) translateY(20px);
  -webkit-transform: skewX(50deg) translateZ(50px) translateX(-14px) translateY(20px);
  ;
  -moz-transform: skewX(50deg) translateZ(50px) translateX(-14px) translateY(20px);
  ;
  animation-name: openTop;
  animation-duration: 2s;
  animation-timing-function: linear;
}
@-webkit-keyframes moveDown {
  0% {
    transform: translate(0px, 10px);
  }
  50% {
    transform: translate(0px, 55px);
  }
  100% {
    transform: translate(0px, 110px);
  }
}
@keyframes moveDown {
  0% {
    transform: translate(0px, 10px);
  }
  50% {
    transform: translate(0px, 55px);
  }
  100% {
    transform: translate(0px, 110px);
  }
}
@keyframes openTop {
  /*0% {transform:rotateX(30deg);}
	50% {transform:rotateX(30deg);}
	100% {transform:rotateX(30deg);} commented code here doesn't work*/
}
<div class="container">
  <div class="cube pers500">
    <div class="face front"></div>
    <div class="face top"></div>
    <br>
    <br>
    <br>
    <div class="face left"></div>
  </div>
</div>

2 个答案:

答案 0 :(得分:2)

要打开多维数据集,首先需要将transform-origin属性(如另一个答案中所述)设置为top。此设置将使.face.top的顶边在执行旋转时保持固定。然后,您需要使用rotateX()添加轮播。这将旋转顶面以产生打开效果。请注意,transform属性应包含完整的转换列表,以便正确打开它。您不能仅在动画中添加rotateX()

.pers500 {
  perspective: 500px;
}
/* Define the container div, the cube div, and a generic face */

.container {
  width: 25%;
  margin: 0 auto;
  margin-top: 2em;
  border: none;
  animation-name: moveDown;
  animation-duration: 2s;
  animation-timing-function: linear;
  transform: translate(0px, 110px);
}
.cube {
  width: 70%;
  height: 70%;
  backface-visibility: visible;
  perspective-origin: 150% 150%;
  transform-style: preserve-3d;
}
.face {
  display: block;
  position: absolute;
  border: none;
  line-height: 100px;
  font-family: sans-serif;
  font-size: 60px;
  color: white;
  text-align: center;
  border: 1px solid brown; /* just for testing */
}
/* Define each face based on direction */

.front {
  width: 3.64em;
  height: 3.43em;
  background-color: rgba(0, 255, 0, 0.7);
  transform: translateZ(50px) translateX(171px) translateY(222px);
}
.left {
  width: 2em;
  height: 3.43em;
  background-color: rgba(0, 0, 255, 0.7);
  margin: 70px;
  transform: skewY(40deg) translateZ(50px) translateY(64px) translateX(-20px);
}
.top {
  width: 3.65em;
  height: 1.69em;
  background-color: rgba(255, 0, 0, 0.7);
  margin: 100px;
  transform: skewX(50deg) translateZ(50px) translateX(-74px) translateY(20px) rotateX(0deg);
  transform-origin: top;
  animation-name: openTop;
  animation-duration: 2s;
  animation-timing-function: linear;
  animation-fill-mode: forwards;
}
@-webkit-keyframes moveDown {
  0% {
    transform: translate(0px, 10px);
  }
  50% {
    transform: translate(0px, 55px);
  }
  100% {
    transform: translate(0px, 110px);
  }
}
@keyframes moveDown {
  0% {
    transform: translate(0px, 10px);
  }
  50% {
    transform: translate(0px, 55px);
  }
  100% {
    transform: translate(0px, 110px);
  }
}
@keyframes openTop {
  0% {
    transform: skewX(50deg) translateZ(50px) translateX(-74px) translateY(20px) rotateX(0deg);
  }
  100% {
    transform: skewX(50deg) translateZ(50px) translateX(-74px) translateY(20px) rotateX(200deg);
  }
}
<div class="container">
  <div class="cube pers500">
    <div class="face front"></div>
    <div class="face top"></div>
    <br>
    <br>
    <br>
    <div class="face left"></div>
  </div>
</div>

注意:

  • 设置transform-origin会影响演示中顶面的位置,因此您在顶面使用translateX()translateY()时所使用的值需要修改有点像上面的演示。
  • 应始终在标准属性之前添加供应商前缀版本的属性,以便将来证明。
  • 我已删除了上述代码段中的供应商前缀版本,只是为了简单起见。

答案 1 :(得分:1)

使用

将变换原点设置为多维数据集的边缘
transform-origin: 0 50% 0;

然后围绕z轴旋转:

transform: rotateZ(90deg);

我希望这适合你,我没有机会测试它。