使用 CSS3 的动画立方体(只有两个面)效果

Posted

技术标签:

【中文标题】使用 CSS3 的动画立方体(只有两个面)效果【英文标题】:Animated cube-like (only two faces) effect with CSS3 【发布时间】:2013-05-13 12:04:45 【问题描述】:

我想复制这个基于this awesome tutorial 准备的jsfiddle(请查看the demo)。但我不想要按键功能,只需要悬停即可。

http://jsfiddle.net/b5rmW/5/

但这仅使用 2 个面(正面和背面)。

我试过了,像这样:

    #cube 
      position: relative;
      margin: 100px auto 0;
      height: 300px;
      width: 300px;
      -webkit-transition: -webkit-transform .5s linear;
      -webkit-transform-style: preserve-3d;

      -moz-transition: -moz-transform .5s linear;
      -moz-transform-style: preserve-3d;
    

    .face 
      position: absolute;
      height: 300px;
      width: 300px;
      padding: 0px;
      background-color: rgba(50, 50, 50, 1);
      font-size: 27px;
      line-height: 1em;
      color: #fff;
      border: 1px solid #555;
      border-radius: 3px;
    

    #cube .one  
      -webkit-transform: rotateX(90deg) translateZ(150px);
      -moz-transform: rotateX(90deg) translateZ(150px);
      background:red;
    

    #cube .two 
      -webkit-transform: translateZ(150px);
      -moz-transform: translateZ(150px);
    background:gold;
    

    #cube .three 
      -webkit-transform: rotateY(90deg) translateZ(150px);
      -moz-transform: rotateY(90deg) translateZ(150px);
    background:blue;
    

    #cube .four 
      -webkit-transform: rotateY(180deg) translateZ(150px);
      -moz-transform: rotateY(180deg) translateZ(150px);
    background:green;
    

    #cube .five 
      -webkit-transform: rotateY(-90deg) translateZ(150px);
      -moz-transform: rotateY(-90deg) translateZ(150px);
    background:orange;
    

    #cube .six 
      -webkit-transform: rotateX(-90deg) rotate(180deg) translateZ(150px);
      -moz-transform: rotateX(-90deg) rotate(180deg) translateZ(150px);
    
#cube:hover
   transform:rotateY(90deg); 


http://jsfiddle.net/5XTeU/1/

但是效果好像不太一样。

你认为实现这个第一小提琴所需的最小 div 是多少?

谢谢。

【问题讨论】:

我现在有点怀疑我的答案,因为问题中实际上有 2 个 jsFiddle 演示。第一个小提琴没有frontback,它实际上是一个frontside。那么你想要帮助哪个小提琴?另外,你想要 frontback 旋转吗? 第二个。我是否无法从小提琴 1 中删除不需要的 div(效果很好),所以我需要第二个小提琴的帮助;仅使用 2 个面。谢谢! 好的,感谢您的澄清。那么应该是哪2张脸呢?您要旋转连接的 2 个面 - frontside - 还是 frontback哪些没有连接? 我已经更新了与其他演示小提琴匹配的 frontside 面旋转的答案。 【参考方案1】:

更新:所以对于哪些人脸需要存在有点误解……所以这次更新是针对正面侧面面的旋转。

但是,在下面的原始答案中,第 1) 点和第 2) 点仍然是代码的有效问题。第 3) 点和第 4) 点不再适用,因为它们与 背面 面有关。可以删除剩余的 CSS 规则。您还可以引入 perspective 包装器,为立方体提供“不那么平坦”的外观 - 请参阅 updated demo

HTML

<div id="experiment">
    <div class="cube">
        <div class="face front">
            front face
        </div>
        <div class="face side">
            side face
        </div>
    </div>
</div>

CSS

#experiment 
    -webkit-perspective: 800;
    -webkit-perspective-origin: 50% 200px;

    -moz-perspective: 800;
    -moz-perspective-origin: 50% 200px;


.cube 
    position: relative;
    margin: 100px auto 0;
    height: 300px;
    width: 300px;
    -webkit-transition: -webkit-transform .5s linear;
    -webkit-transform-style: preserve-3d;

    -moz-transition: -moz-transform .5s linear;
    -moz-transform-style: preserve-3d;


.face 
    position: absolute;
    height: 300px;
    width: 300px;
    padding: 0px;
    font-size: 27px;
    line-height: 1em;
    color: #fff;
    border: 1px solid #555;
    border-radius: 3px;


.cube .front 
    -webkit-transform: translateZ(150px);
    -moz-transform: translateZ(150px);
    background-color:red;


.cube .side 
    -webkit-transform: rotateY(-90deg) translateZ(150px);
    -moz-transform: rotateY(-90deg) translateZ(150px);
    background-color:orange;


.cube:hover
    -webkit-transform:rotateY(90deg);     


原答案

demo代码有4个问题,我们分别看一下,看看每个问题的解决方法是什么:

1) htmlfront 面有一个错字 - 它缺少 r

&lt;div class="face font"&gt; 而不是&lt;div class="face front"&gt;

2) 对于 Webkit 浏览器,您需要使用 transform 的前缀属性

-webkit-transform:rotateY(90deg); 而不是transform:rotateY(90deg);

3) 你选择的back脸是错误的脸。您无意中改变了 left 脸的用途。 front 面是正确的,它是一个&lt;div&gt; 向外翻译为150px。所以对应的 back 脸应该是向内翻译的-150px。但是,如果我们只是这样做,位置将是正确的,但是当围绕立方体的中心旋转时,背面最终会向后。所以正确的 back 面是最初围绕Y 轴旋转 180° 的面。然而,通过围绕Y 轴旋转,沿Z 的平移仍然需要为+150px 而不是-150px

.cube .back
  -webkit-transform: rotateY(180deg) translateZ(150px);
  -moz-transform: rotateY(180deg) translateZ(150px);
   background:orange;

4) 使 back 面进入 front 开始位置的旋转应该是 180° 而不是 90°

.cube:hover
    -webkit-transform:rotateY(180deg);

将所有这些更改放在一起得到this demo

HTML

<div class="cube">
    <div class="face front">
        front face
    </div>
    <div class="face back">
        back face
    </div>
</div>

CSS

.cube 
    position: relative;
    margin: 100px auto 0;
    height: 300px;
    width: 300px;
    -webkit-transition: -webkit-transform .5s linear;
    -webkit-transform-style: preserve-3d;
    -moz-transition: -moz-transform .5s linear;
    -moz-transform-style: preserve-3d;


.face 
    position: absolute;
    height: 300px;
    width: 300px;
    padding: 0px;
    font-size: 27px;
    line-height: 1em;
    color: #fff;
    border: 1px solid #555;
    border-radius: 3px;


.cube .front 
    -webkit-transform: translateZ(150px);
    -moz-transform: translateZ(150px);
    background-color: red;


.cube .back 
    -webkit-transform: rotateY(180deg) translateZ(150px);
    -moz-transform: rotateY(180deg) translateZ(150px);
    background:orange;


.cube:hover
    -webkit-transform:rotateY(180deg);
    -moz-transform: rotateY(180deg);
    transform:rotateY(180deg);

【讨论】:

非常感谢!多么详尽的答案和解决方案(您添加的微小 3d 效果)比我要求的更好! (它似乎在 FF 中不起作用,但我想当我将它转换为 compas mixins 时它会) 乐于助人!哪个部分在 FF 中不起作用?我现在无法测试 FF,但可以看看我明天能做什么。 @andyb:您似乎对 css3-stuff 了解很多,您知道是否可以在与观察者不平行的面上添加阴影?看看我的问题:***.com/questions/17903674/css3-3d-box-with-shadows 享受你的新徽章 ;) 只是一个注释,你的悬停将在 Firefox 中失败

以上是关于使用 CSS3 的动画立方体(只有两个面)效果的主要内容,如果未能解决你的问题,请参考以下文章

如何css制作3d旋转立方体效果?

纯css实现3d立方体旋转相册

css3总结立方体动画web字体字体图标弹性布局多列布局伸缩盒子

css3 - 3d效果立方体

css3实现立方体,并且自转效果

css3实现立方体,并且自转效果