CSS3 - 3D立方体 - IE变换风格:保留-3d解决方法

 _Vision_破晓 发布于 2023-02-08 17:20

在浏览IE10的开发人员博客后,我发现他们不支持preserve-3d设置.

我发现这个立方体最初是由Paul Hayes制作的,它使用触摸屏而且非常受欢迎.

Altough preserve-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:


MELABA!

3D cube

By Paul Hayes

3D cube built using css, webkit-perspective and webkit-transform. Rotation via webkit-transition.

Use arrow keys to navigate, or click and hold mouse. On touch screens, use one finger to rotate. Press ESC to reset.

Read more »

Learn how to make a cube

By Paul Hayes

“A 3D cube can be created solely in CSS, with all six faces.”

Article: Cube explanation

I design and build websites in Brighton

Nothing down here.

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

1 个回答
  • 首先,拖动和交互通常意味着JavaScript.是的,有CSS黑客,我自己使用和滥用它们,但在这种情况下,不使用JS绝对是疯了.

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

    你可以通过几种方式实现这一目标.在这种情况下,我使用了face元素的style属性,但您也可以将样式插入到样式元素中.

    无论如何...

    演示

    相关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);
    

    2023-02-08 17:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有