【问题标题】:Cube rotation with css立方体旋转与css
【发布时间】:2015-04-20 14:59:04
【问题描述】:

我在旋转立方体时遇到了一点问题。我想让它跨浏览器,所以我正在改变立方体的每一面。当我从左到右旋转时,侧面在所有浏览器 Chrome、Firefox 和 IE 上完美对齐,但是当立方体从上到下旋转时,侧面仅在 Chrome 上对齐(如果我在 Chrome 上使动画变慢,侧面是和其他浏览器一样坏了,所以我认为正常工作是一个错误:D)。我在 jsfiddle 上提供了一个示例:

http://jsfiddle.net/0n9bnxe5/

HTML:

<div class="flip-card-content">
  <div class="flip-card-side-a" style="background:red">
    FRONT 
  </div>
  <div class="flip-card-side-b" style="background:green">
    BACK
  </div>
  <div class="flip-card-side-c" style="background:aqua">
    LEFT
  </div>
</div>
<button id="button">Flip-top</button>
<button id="button2">Filp-right</button>

CSS:

.flip-card-content {
    position: relative;
    margin: 100px;
    width: 200px;
    height: 200px;
    transform-style: preserve-3d;
    perspective:1000px;
}

.flip-card-side-a,
.flip-card-side-b,
.flip-card-side-c{
    width: 100%;
    position: absolute;
    height: 100%;
    backface-visibility: hidden;
    transform-origin:50% 50% 0px;
    transition: all .5s ease-in-out;
}

.flip-card-side-a {
  transform: rotateY(0deg) translateZ(100px);
  z-index: 1;
}
.flip-card-side-b {
  transform: rotateX(90deg) translateZ(100px);
}
.flip-card-side-c {
  transform: rotateY(-90deg) translateZ(100px);
}

.flip .flip-card-side-a {

  transform: rotateX(-90deg) translateZ(100px);
}
.flip .flip-card-side-b {
  display:block;
  transform: rotateY(0deg) translateZ(100px);
  z-index: 1;
}
.flip-right .flip-card-side-a {
  transform: rotateY(90deg) translateZ(100px);
}
.flip-

right .flip-card-side-b {
  display:none;
}
.flip-right .flip-card-side-c {
  transform: rotateY(0deg) translateZ(100px);
  z-index:1;
}

查询:

$("#button").on('click', function(){
  $(".flip-card-content").removeClass("flip-right");
  setTimeout(function(){
    $(".flip-card-content").toggleClass("flip");
   },500);
});

$("#button2").on('click', function(){
  $(".flip-card-content").removeClass("flip");
  setTimeout(function(){
    $(".flip-card-content").toggleClass("flip-right");
  },500);

});

欢迎任何建议!

【问题讨论】:

  • 为什么你的立方体只有 3 个面?

标签: html css


【解决方案1】:

您的translateZ 并没有按您预期的方式工作。看看我是如何在这里定位立方体上的面并将其与您自己的进行比较。最终,我发现旋转立方体等项目的最简单方法是定位所有元素,然后旋转容器。

为了更好地缩放字体、图像等。最好让正面保持自然大小而不是放大(即在 3d 空间中向后移动所有内容):

.box {
    height: 100%;
    position: relative;
    transform: rotateX(0deg);
    transform-origin: 50% 50% -100px;
    transform-style: preserve-3d;
    transition: all 1s;
    width: 100%;
}

.box--rotate-top {
    transform: rotateX(-90deg);
}

.box--rotate-left {
    transform: rotateY(90deg);
}

.box__face {
    backface-visibility: hidden;
    height: 100%;
    left: 0;
    position: absolute;
    top: 0;
    width: 100%;
}

.box__face--front {
    background: #f90;
}

.box__face--top {
    background: #369;
    transform: rotateX(90deg) translateZ(200px);
    transform-origin: 0 100% 0;
}

.box__face--left {
    background: #867;
    transform: rotateY(-90deg) translateZ(200px);
    transform-origin: 100% 0 0;
}

Here is the fiddle.

【讨论】:

  • 是的,我也认为这是最简单的方法,旋转容器,但是IE还没有preserve-3d关键字,我也需要它在IE中工作。
  • 明白了,你仍然可以将相同的过渡 CSS 从容器应用到每个单独的子元素(即所有过渡的旋转位置)。主要问题是您应用 translateZ 的方式。
【解决方案2】:

3d 空间中的过渡很棘手,不同的浏览器处理它们的方式也不同。

在这里,您的fiddle 已更正。

最好的办法是不要给浏览器留下任何想象

所以,而不是改变

  transform: rotateY(0deg) translateZ(100px);

  transform: rotateX(-90deg) translateZ(100px);

让改变发生在

  transform: rotateX(0deg) rotateY(0deg) translateZ(100px);

  transform: rotateX(-90deg) rotateY(0deg)  translateZ(100px);

请注意,我没有从数学角度更改变换;但现在每个属性都匹配一个相似的属性。

注意以防万一您想知道,在第一种情况下,IE 正在进行以下转换:将旋转角度从 0 更改为 -90 度。同时,将旋转轴从 Y 更改为 X。因此,在过渡的中间,旋转是错误的(从您的角度来看),但在数学意义上,两种理解过渡的方式都是有意义的.

【讨论】:

  • 太棒了!非常感谢!
  • 小提琴在三星 Galaxy S3、Cynogenmod 11 和谷歌浏览器上无法正常工作。因为从左到上我可以看到3个独立的平原。
  • @martijnn2008 从 lefttop 的转换不打算工作,它会在所有浏览器中中断。但我不认为 OP 是在问这个问题。
猜你喜欢
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2021-08-04
相关资源
最近更新 更多