【问题标题】:CSS3 - 3D Cube- IE transform-style: preserve-3d workaroundCSS3 - 3D Cube- IE 变换样式:preserve-3d 解决方法
【发布时间】:2013-12-22 01:11:51
【问题描述】:

浏览IE10的developer blog后发现不支持preserve-3d设置。

我发现这个立方体最初是由 Paul Hayes 制作的,它与触摸屏一起使用并且很受欢迎。

虽然保留 3d 设置是一个已知问题,但我无法实现建议的解决方法,因为在父元素中似乎没有转换属性可大量应用于子元素。 这是我到目前为止简化的链接:http://jsfiddle.net/cC4Py/1/

CSS:

.viewport {

    perspective: 800px;
    perspective-origin: 50% 200px;
    transform: scale(0.75,0.75);

    -webkit-perspective: 800;
    -webkit-perspective-origin: 50% 200px;
    -webkit-transform: scale(0.75,0.75);

    -moz-perspective: 800;
    -moz-perspective-origin: 50% 200px;
    -moz-transform: scale(0.75,0.75);


}

.cube {
    position: relative;
    margin: 0 auto;
    height: 400px;
    width: 400px;


    transition: transform 50ms linear;
     transform-style: preserve-3d;

    -webkit-transition: -webkit-transform 50ms linear;
    -webkit-transform-style: preserve-3d;


    -moz-transition: -moz-transform 50ms linear;
    -moz-transform-style: preserve-3d;

}


.cube > div {
    position: absolute;
    height: 360px;
    width: 360px;
    padding: 20px;
    background-color: rgba(50, 50, 50, 1);
    font-size: 1em;
    line-height: 1em;
    color: #fff;
    border: 1px solid #555;
    border-radius: 3px;
    transition: -webkit-transform 50ms linear;
}

.cube > div:first-child  {

transform: rotateX(90deg) translateZ(200px);


    -webkit-transform: rotateX(90deg) translateZ(200px);
    -moz-transform: rotateX(90deg) translateZ(200px);
}

.cube > div:nth-child(2) {
transform:  translateZ(200px);

    -webkit-transform: translateZ(200px);
    -moz-transform: translateZ(200px);
}

.cube > div:nth-child(3) {
transform:  rotateY(90deg) translateZ(200px);

    -webkit-transform: rotateY(90deg) translateZ(200px);
    -moz-transform: rotateY(90deg) translateZ(200px);
    text-align: center;
}

.cube > div:nth-child(4) {
transform: rotateY(180deg) translateZ(200px);

    -webkit-transform: rotateY(180deg) translateZ(200px);
    -moz-transform: rotateY(180deg) translateZ(200px);
}

.cube > div:nth-child(5) {
transform: rotateY(-90deg) translateZ(200px);

    -webkit-transform: rotateY(-90deg) translateZ(200px);
    -moz-transform: rotateY(-90deg) translateZ(200px);
}

.cube > div:nth-child(5) p {
    text-align: center;
    font-size: 2.77em;
    margin: 40px;
    line-height: 60px;
}

.cube > div:nth-child(6) {
transform: rotateX(-90deg) rotate(180deg) translateZ(200px);

    -webkit-transform: rotateX(-90deg) rotate(180deg) translateZ(200px);
    -moz-transform: rotateX(-90deg) rotate(180deg) translateZ(200px);
}

object {
    opacity: 0.9;
}

object:hover {
    opacity: 1;
}

HTML:

<body class="experiment">
<div class="viewport">
    <section class="cube" style="transition: 500ms; -webkit-transition: 500ms;">
        <div>MELABA!</div>
        <div>
            <h2>3D cube</h2>
            <time>28th September 2010</time>
            <p>By Paul Hayes</p>
            <p>3D cube built using css, webkit-perspective and webkit-transform. Rotation via webkit-transition.</p>
            <p>Use arrow keys to navigate, or click and hold mouse. On touch screens, use one finger to rotate. Press ESC to reset.</p>
            <p><a href="http://www.paulrhayes.com/2010-09/3d-css-cube-ii-touch-gestures-click-and-drag/" target="_top">Read more »</a></p>
        </div>
        <div>
            <object width="360" height="360"><param name="movie" value="http://www.youtube.com/v/MY5PkidV1cM?fs=1&amp;hl=en_GB&amp;rel=0"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/MY5PkidV1cM?fs=1&amp;hl=en_GB&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="360" height="360">
            </object>
            </div>
        <div>
            <h2><a href="http://www.paulrhayes.com/2009-07/animated-css3-cube-interface-using-3d-transforms/" target="_top">Learn how to make a cube</a></h2>
            <time>17th July 2009</time>
            <p>By Paul Hayes</p>
            <p>“A 3D cube can be created solely in CSS, with all six faces.”</p>
            <p>Article: <a href="http://www.paulrhayes.com/2009-07/animated-css3-cube-interface-using-3d-transforms/" target="_top">Cube explanation</a></p>
        </div>
        <div>
            <p>I design and build websites in Brighton</p>
        </div>
        <div>
            <small>Nothing down here.</small>
        </div>
    </section>
</div>


<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>

<script src="http://www.paulrhayes.com/experiments/cube-3d/js/experiment.js?13"></script>
</body>

我创建了没有 -webkit- 前缀的每个属性的副本。我做错什么了吗?接下来我该怎么做?

【问题讨论】:

    标签: html internet-explorer css 3d


    【解决方案1】:

    首先,拖动和交互通常指的是 JavaScript。是的,有一些 CSS hack,我自己也使用过和滥用过它们,但在这种情况下,不使用 JS 绝对是疯了。

    这意味着您需要通过 JavaScript 将祖先的所有变换(即立方体本身的旋转以及您通常在立方体父级上设置的透视图)链接到立方体的面上。

    您可以通过几种方式做到这一点。在本例中,我使用了 face 元素的 style 属性,但您也可以将样式插入到 style 元素中。

    无论如何...

    demo

    相关HTML

    <div class='cube'>
      <div class='face'></div>
      <!-- five more faces -->
    </div>
    

    相关CSS

    由于我将通过 JS 更改转换值,因此我没有费心在 CSS 中设置它们。

    .cube, .cube * {
      position: absolute;
      top: 50%; left: 50%;
    }
    
    .face {
      margin: -8em;
      width: 16em; height: 16em;
    }
    

    JS

    下面的代码又快又脏,可以改进。

    var faces = document.querySelectorAll('.face'), 
        n = faces.length, 
        styles = [], 
        _style = getComputedStyle(faces[0]), 
        factor = 3, 
        side = parseInt(_style.width.split('px')[0], 10), 
        max_amount = factor*side, 
        unit = 360/max_amount,
        flag = false, 
        tmp, p = 'perspective(32em) ';
    
    for(var i = 0; i < n; i++) {
      tmp = ((i < 4) ? 'rotateY(' + i*90 + 'deg)' : 
                       'rotateX(' + Math.pow(-1, i)*90 + 'deg)') + 
        ' translateZ(' + side/2 + 'px)';
      
      faces[i].style.transform = p + tmp;
      faces[i].style['-webkit-transform'] = p + tmp;
      
      styles.push(tmp);
    }
    
    var drag = function(e) {
      var p1 = { 'x': e.clientX - p0.x, 'y': e.clientY - p0.y }, 
          angle = {'x': -p1.y*unit, 'y': p1.x*unit};
      
      for(var i = 0; i < n; i++) {
        tmp = 'rotateX(' + angle.x + 'deg)' + 
          'rotateY(' + angle.y + 'deg)' + styles[i];
        
        faces[i].style.transform = p + tmp;
        faces[i].style['-webkit-transform'] = p + tmp;
      }
    };
    
    window.addEventListener('mousedown', function(e) {
      var t = e.target;
      
      if(t.classList.contains('face')){
        p0 = { 'x': e.clientX, 'y': e.clientY };
        flag = true;
            
        window.addEventListener('mousemove', drag, false);
      }
      else {
        flag = false;
      }
    }, false);
    
    window.addEventListener('mouseup', function(e) {
      if(flag) {
        for(var i = 0; i < n; i++) {
          _style = faces[i].style;
          tmp = _style.transform || _style['-webkit-transform'];
          styles[i] = tmp.replace('perspective(32em) ', '');
        }
      }
      
      flag = false;
      
      window.removeEventListener('mousemove', drag, false);
    }, false);
    

    【讨论】:

    • 我现在在手机上。虽然我没有得到整个代码,但你的解释似乎很合理。我会尽快让你知道结果!
    • 它工作得很好!我认为这是 IE 网络上唯一有效的代码。非常感谢!
    • 还有一点,绘制人脸时出现问题。它将最终的 div 绘制到最顶部。尝试将伽玛设置为 1 并拖动。我没办法。
    • 如果你想让面部完全不透明,那么还要在它们上面设置backface-visibility: hidden。我已经在实际演示的 CSS 中的注释中添加了它。
    • 是的,我的错,对不起。我不敢相信我是怎么错过的。我想我不知道 hidden 正在为此工作。这就是为什么它没有引起我的注意。 Thnaks 一次又一次。
    【解决方案2】:

    就个人而言,我更喜欢使用 CSS @keyframes 并以这种方式设置动画,而不是使用 JS。 JS 倾向于引入 jank 和冻结页面。 CSS,尤其是在 Firefox 和 Chrome 中,对于 3d 可视化和动画来说非常快速和流畅。 IE 不包含preserve-3d 存在问题。在此之前,我不会担心事情在 IE 中是否符合预期。如果您必须支持 IE,请尝试确保存在可接受的优雅降级。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2023-03-23
      • 2017-05-04
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      相关资源
      最近更新 更多