html元素做3d变换,CSS3 3D变换之综合运用 - 3D box

先上效果图吧javascript

bVxSTl

点击'roll'按钮,会出现旋转的动画css

代码以下html

div#camera{

width: 500px;

height: 500px;

outline: 1px solid black;

margin:100px auto;

position: relative;

perspective: 1000px;

}

div#camera>div{

width: 400px;

height: 400px;

position: absolute;

top:calc(50% - 200px);

left:calc(50% - 200px);

outline: 1px solid black;

transition: all 1s linear;

background-color: #fff;

}

div#camera>div:nth-child(1){

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

z-index: 99;

}

div#camera>div:nth-child(2){

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

}

div#camera>div:nth-child(3){

transform: rotateY(180deg) translateZ(200px);

}

div#camera>div:nth-child(4){

transform: rotateY(270deg) translateZ(200px);

}

div#camera>div>img{

width: 100%;

}

button{

margin: 10px auto;

display: block;

}

102342_40949584.png
102342_40949584.png
102342_40949584.png
102342_40949584.png

roll

$(document).ready(function() {

(function() {

var count=0, reversedCount=4;

var changeRotateY = function($ele, deg) {

var index = $ele.index()+1+count;

var deg = deg*index;

$ele[0].setAttribute('style','transform:rotateY('+deg+'deg) translateZ(200px);')

}

$('button[value="roll"]').on('click', function() {

$('div#camera>div').each(function() {

changeRotateY($(this), 90);

});

// changeRotateY($('div#camera>div:nth-child(1)'), 90);

// changeRotateY($('div#camera>div:nth-child(2)'), 90);

// changeRotateY($('div#camera>div:nth-child(3)'), 90);

// changeRotateY($('div#camera>div:nth-child(4)'), 90);

count++;

reversedCount--;

$('div#camera>div').eq(reversedCount%4).css({'z-index':'99'}).siblings().css({'z-index':'0'});

if(reversedCount==0){

reversedCount=4;

}

});

})();

});

稍微解析一下:java

CSS部分用来生成静态的三维盒子,#camera下的四个子div分别旋转0°、90°、180°、270°后再以自身旋转后的坐标系为基准translateZ(200px), 至关于四个子div分别向前(也就是正对屏幕的方向)、向右、向后(也就是背向屏幕的方向)、向左移动了200px,因为div自己的尺寸就是400px*400px, 所以作此变换后四个div就围成了一个立体的盒子。此时从上往下看,效果图以下:jquery

bVxSWI

这里的transform的顺序很重要,若是是先rotateY再translateZ, 那么translateZ是以rotate之后的坐标轴进行平移,这样才能达到先后左右平移的效果; 若是先translateZ再rotateY, 那么全部元素都会先平移,而后在一个位置上进行旋转了!segmentfault

changeRotateY函数用来改变div的旋转角度,根据该元素的eq和传入的count值(按钮被点击的次数)来设置元素的rotateY的值。因为遇到了动态获取transform值的问题这里的函数灵活性不高,有点遗憾。 第一次点击的时候,count为0,index()为0的元素的rotateY会从0°增长到90°,index()为1的元素的rotateY会从90°增长到180°,and so on; 第二次点击,count为1, 上述值会各增长90°,完成无限旋转的效果;函数

遇到的一个很大的问题就是转到后面的元素依旧会显示出来。 试过background-color和backface-visibility:hidden都不怎么好用,尤为是backface-visibility, 转到90度的时候仍是显示的,在90.01°时才会隐藏backface, 若是想用backface-visibility来隐藏后面元素的话得fine-tune, 还会引发稍微的错位问题,遂放弃;动画

最后使用的是z-index来隐藏后面的元素, 动态设置转到最前面的元素的z-index为较大值。注意z-index属性不对position为static的元素起做用。 固然咱们这里的div们都是absolute,因此就能应用得很好啦~this

要显示的元素的eq值分别为三、二、一、0,固然直接用递增的count变量+switch/if else语句也能作,但陡减可读性; 取而代之的是增长了一个递减的reversedCount变量,它来负责匹配每次要设置z-index的元素。spa

欢迎转载,请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值