做者:首席填坑官∙蘇南
來源:@IT·平頭哥聯盟
公衆號:honeyBadger8
css
最近在寫《點點動畫系列》文章,上一期分享了< 手把手教你如何繪製一輛會跑的車 >,本期給你們帶來是結合CSS3畫出來的一個立體3d魔方
,結合了js
讓你爲所欲爲想怎麼轉,就怎麼轉,這裏是 @IT·平頭哥聯盟,我是首席填坑官
∙蘇南(South·Su),咱們先來看看效果,而後再分解它的實現過程吧html
好吧,gif圖看着好像有點不是很清晰,想在線預覽的同窗,可點擊在線預覽 👈,廢話很少扯了,先來分析一下,看如何實現這個功能吧。前端
-webkit-perspective
-透視、preserve-3d
-三維空間,這個兩個是重點哦,固然還有transform-origin
、transition
、transform
等,先來回故一下 API 怎麼是講的吧:perspective 取值 :css3
- none :不指定透視 ;
- length :指定觀察者與「z=0」平面的距離,使具備三維位置變換的元素產生
透視效果
。「z>0」的三維元素比正常大,而「z<0」時則比正常小,大小程度由該屬性的值決定,不容許負值。transform-style 取值 :git
- flat :指定子元素位於此元素所在平面內;
- preserve-3d :指定子元素定位在三維空間內,當該屬性值爲
preserve-3
d時,元素將會建立局部堆疊上下文;小結 :決定一個變換元素看起來是處在三維空間仍是平面內,須要該元素的父元素上定義 <' transform-style '> 屬性,也就是說想某元素有三維效果,須要設定它的父級有
preserve-3d
。githubtransform-origin 取值 :web
- percentage:用百分比指定座標值。能夠爲負值;
- length:用長度值指定座標值。能夠爲負值;
- left:指定原點的橫座標爲left;
- center①:指定原點的橫座標爲center;
- right:指定原點的橫座標爲right;
- top:指定原點的縱座標爲top;
- center②:指定原點的縱座標爲center;
- bottom:指定原點的縱座標爲bottom;
transform、transition等,就不介紹了ruby
/* perspective 使用示例:*/
div{
-webkit-perspective:600px;
perspective:600px;
}
/*transform-style 使用示例:*/
.preserve{
transform-style:preserve-3d;
-webkit-transform-style:preserve-3d;
}
/*transform-origin 使用示例:*/
.preserve{
-webkit-transform-origin:50% 50% -100px; or
-webkit-transform-origin:bottom; or
-webkit-transform-origin:top;
…………
}
複製代碼
<div class="cube">
<div class="cube-inner running">
<p class="single-side s1"><span>最</span></p>
<p class="single-side s2"><span>懂</span></p>
<p class="single-side s3"><span>你</span></p>
<p class="single-side s4"><span>的</span></p>
<p class="single-side s5"><span>魔</span></p>
<p class="single-side s6"><span>方</span></p>
</div>
</div>
複製代碼
rotate
,加個它再來看看效果吧:.cube{
width:200px;
height:200px;
margin:10px auto;
padding:260px;
position:relative;
-webkit-perspective:600px;
perspective:600px;
transition: .5s ;
}
.cube-inner{
width:200px;
height:200px;
position:relative;
-webkit-transform-style:preserve-3d;
transition:.3s;
-webkit-transform-origin:50% 50% -100px;
transform: rotateX(45deg);
}
.cube:hover{
/*鼠標通過時,把 perspective 過渡到100 */
-webkit-perspective:100px;
perspective:100px;
}
複製代碼
preserve-3d
,也就是6個面的父級要設置 transform-style
樣式;radial-gradient
)——不想手寫的同窗推薦一個網站可在線設置你要的效果,複製樣式便可,先來一睹風采,爲了便於觀察,總體角度旋轉了10deg:hue-rotate
,它能在你初始的顏色基礎上旋轉元素的色調及其內容,從而達到不一樣的效果。瞭解更多hue-rotate : The hue-rotate() CSS function rotates the hue of an element and its contents. Its result is a .ide
最
":.cube-inner .single-side.s1{
/*s1頂部*/
left:0;top:-200px;
background: radial-gradient(circle, rgba(255,255,255,.88), #00adff);
background: -webkit-radial-gradient(circle, rgba(255,255,255,.88), #00adff);
transform-origin:bottom;
-webkit-transform-origin:bottom;
transform:rotateX(90deg);
-webkit-transform:rotateX(90deg);
}
複製代碼
正面 - "懂
":佈局
下面 - "你
":
.cube-inner .single-side.s3{
/*s3底部*/
left:0;top:200px;
background: radial-gradient(circle, rgba(255,255,255,.88), #100067);
background: -webkit-radial-gradient(circle, rgba(255,255,255,.88), #100067);
transform-origin:top;
-webkit-transform-origin:top;
transform:rotateX(-90deg);
-webkit-transform:rotateX(-90deg);
}
複製代碼
的
":
.cube-inner .single-side.s4{
/*s4背部*/
z-index:2;
left:0;top:0;
background: radial-gradient(circle, rgba(255,255,255,.88), #F0C);
background: -webkit-radial-gradient(circle, rgba(255,255,255,.88), #F0C);
transform:translateZ(-200px) rotateX(180deg) ;
-webkit-transform:translateZ(-200px) rotateX(180deg) ; /*rotateZ(-180deg) 左右旋轉的時候,Z軸旋轉180°,由於字是倒着的*/
}
複製代碼
魔
":
.cube-inner .single-side.s5{
/*s5左側*/
left:-200px;top:0;
background: radial-gradient(circle, rgba(255,255,255,.88),rgba(33,33,33,1));
background: -webkit-radial-gradient(circle, rgba(255,255,255,.88),rgba(33,33,33,1));
transform-origin:right;
-webkit-transform-origin:right;
transform:rotateY(-90deg)
-webkit-transform:rotateY(-90deg)
}
複製代碼
方
":
.cube-inner .single-side.s6{
/*s6右側*/
right:-200px;top:0;
transform-origin:left;
-webkit-transform-origin:left;
background: radial-gradient(circle, rgba(255,255,255,.88), #f00);
background: -webkit-radial-gradient(circle, rgba(255,255,255,.88), #f00);
transform:rotateY(90deg);
-webkit-transform:rotateY(90deg);
}
複製代碼
小結 : 嗯,以上魔方的6個面的繪製過程,基本已經完成,主要在在於
transform-origin
、rotate
、translate
等屬性的應用,但爲了讓它更炫酷一些,咱們還要給邊角加一些光感。
p
標籤裏,都多套了一層span
,就是爲高光光感,埋下的伏筆,一個平面正方形有四個邊,after、before只有兩,那麼確定要再套一層,固然方法不少,好比直接用border也是能夠的,但比較麻煩,我就選擇瞭如今要講的這種:animation
的動畫,讓它360度旋轉,每一個角都能看到,這樣會顯的很666;keyframes
使用,請看代碼示例:.cube .cube-inner{
/*-webkit-transform:rotateX(180deg) rotateY(0deg) ;*/
animation: elfCube 10s infinite ease-in-out;
-webkit-animation: elfCube 10s infinite ease alternate;
}
@keyframes elfCube {
0% {
transform: rotateX(0deg) rotateY(0deg);
}
50% {
transform: rotateX(360deg) rotateY(360deg);
}
100% {
transform: rotateX(0deg) rotateY(0deg);
}
}
@-webkit-keyframes elfCube {
0% {
-webkit-transform: rotateX(0deg) rotateY(0deg);
}
50% {
-webkit-transform: rotateX(360deg) rotateY(360deg);
}
100% {
transform: rotateX(0deg) rotateY(0deg);
}
}
複製代碼
mouseover
、mousemove
、mouseout
,鼠標進入時,暫停css的動畫,否則會相互打架哦!……
getAxisX(e){
let left = this.cubeEle.offsetLeft;
return e.pageX - left - (this.cubeW/2) * (this.cubeW>this.cubeH ? this.cubeH/this.cubeW : 1);
}
getAxisY(e){
let top = this.cubeEle.offsetTop;
return e.pageY - top - (this.cubeH/2) * (this.cubeH>this.cubeW ? this.cubeW/this.cubeH : 1);
}
…………
複製代碼
…………
run(){
this.cubeEle.addEventListener('mouseover',(e)=>this.hoverOut(e),false);
this.cubeEle.addEventListener('mousemove',(e)=>this.move(e),false);
this.cubeEle.addEventListener('mouseout',(e)=>this.hoverOut(e),false);
}
hoverOut(e){
//進入/離開
e.preventDefault();
this.axisX = this.getAxisX(e),
this.axisY = this.getAxisY(e);
if(e.type == 'mouseout'){ //離開
this.axisX=0;
this.axisY = 0;
console.log("離開")
this.cubeInner.className="cube-inner running";
}else{
this.cubeInner.className="cube-inner";
console.log("進入")
};
let rotate = `rotateX(${-this.axisY}deg) rotateY(${-this.axisX}deg)`;
this.cubeInner.style.WebkitTransform = this.cubeInner.style.transform = rotate;
}
……
複製代碼
公衆號
。做者:蘇南 - 首席填坑官
交流羣:912594095,公衆號:
honeyBadger8
本文原創,著做權歸做者全部。商業轉載請聯繫
@IT·平頭哥聯盟
得到受權,非商業轉載請註明原連接及出處。