在浏览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:
我创建了没有-webkit-前缀的每个属性的副本.我做错了吗?接下来我该怎么办?
首先,拖动和交互通常意味着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);