學習了妙味課堂扇形展開效果
知識點預備:
【1】CSS3中特別重要的transform中的rotate(),現在transform可以將元素進行2D和3D變形。
2D transform常用的transform-function的功能:
translate()
:用來移動元素,可以根據X軸和Y軸坐標重新定位元素位置。在此基礎上有兩個擴展函數:translateX()
和translateY()
。
scale()
:用來縮小或放大元素,可以使用元素尺寸發生變化。在此基礎上有兩個擴展函數:scaleX()
和scaleY()
。rotate()
:用來旋轉元素。
skew()
:用來讓元素傾斜。在此基礎上有兩個擴展函數:skewX()
和skewY()
。
matrix()
:定義矩陣變形,基於X軸和Y軸坐標重新定位元素位置。
3D transform常用的transform-function的功能:
translate3d()
:移元素元素,用來指定一個3D變形移動位移量translate()
:指定3D位移在Z軸的位移量。
scale3d()
:用來縮放一個元素。scaleZ()
:指定Z軸的縮放向量。
rotate3d()
:指定元素具有一個三維旋轉的角度。
rotateX()
、rotateY()
和rotateZ()
:讓元素具有一個旋轉角度。
perspective()
:指定一個透視投影矩陣。
matrix3d()
:定義矩陣變形。
這里我們只需要2D中的rotate()屬性用來旋轉元素,
注意:旋轉的角度以順時針方向為正(按順勢正方向角度增大)
其他屬性的用法可以參考這里W3cplus
【2】transfrom-origin
指定變形的原點,默認是在元素的中心,可以接受一到三個參數,分別表示變形原點X軸、Y軸、Z軸的位置(可以實現許多有趣的旋轉)
【3】transition
過渡transition是一個復合屬性,包括transition-property、transition-duration、transition-timing-function、transition-delay這四個子屬性。通過這四個子屬性的配合來完成一個完整的過渡效果
transition-property: 過渡屬性(默認值為all)
transition-duration: 過渡持續時間(默認值為0s)
transiton-timing-function: 過渡函數(默認值為ease函數)
transition-delay: 過渡延遲時間(默認值為0s)
想要詳細了解該屬性可以參考深入理解CSS過渡transition
【4】CSS3 :nth-of-type(n) 選擇器
選擇器匹配屬於父元素的特定類型的第 N 個子元素的每個元素
好暈,還是來看個例子:
1 #box div:nth-of-type(2)
這句代碼的意思是選擇在#box下的第2個div
注意:如果在第一個div里嵌套了一個div,那么會選擇嵌套在第一個div里的那個div(-_-!)。
好了,准備工作做完了,開始實現扇形展開效果
第一步
基本樣式布局,直接看代碼
結構:
1 <div id="box"> 2 <div></div> 3 <div></div> 4 <div></div> 5 <div></div> 6 <div></div> 7 <div></div> 8 <div></div> 9 <div></div> 10 <div></div> 11 <div></div> 12 </div>
樣式:
1 *{ 2 margin: 0; 3 padding: 0; 4 } 5 body{ 6 background: #666; 7 } 8 #box{ 9 width: 1200px; 10 height: 700px; 11 background: url(img/bg.png) no-repeat; 12 position: relative; 13 margin: 100px auto; 14 } 15 #box div{ 16 width: 400px; 17 height: 100px; 18 border-radius: 9px; 19 position: absolute; 20 left: 555px; 21 top: 444px; 22 /* 23 24 */ 25 background: url(img/logo.png) no-repeat 280px 56px; 26 transform-origin: 35px 50px; 27 transition: 1s; 28 } 29 #box div:nth-of-type(1){ 30 background-color: #417191; 31 } 32 #box div:nth-of-type(2){ 33 background-color: #ce8298; 34 } 35 #box div:nth-of-type(3){ 36 background-color: #f78992; 37 } 38 #box div:nth-of-type(4){ 39 background-color: #fbc0a5; 40 } 41 #box div:nth-of-type(5){ 42 background-color: #f8988f; 43 } 44 #box div:nth-of-type(6){ 45 background-color: #f16273; 46 } 47 #box div:nth-of-type(7){ 48 background-color: #9c9fcd; 49 } 50 #box div:nth-of-type(8){ 51 background-color: #bae2d3; 52 } 53 #box div:nth-of-type(9){ 54 background-color: #43bab8; 55 } 56 #box div:nth-of-type(10){ 57 background-color: #678d95;
第二步
寫扇形的展開函數go()和閉合函數back()
go()函數
1 //使扇形打開 2 function go(){ 3 for(var i = 0;i<divs.length;i++){ 4 //"rotate("+345-(i*15)+"deg)" 5 //不行,因為這樣會先算"rotate("+345 6 divs[i].style.transform = "rotate("+(342-(i*15))+"deg)"; 7 } 8 }
我們要讓每個div都按一定的角度分開不至於重疊,用(i*15)可以實現這個小目標。342是定義第一個div的位置。
back()函數
1 //是扇形合並 2 function back(){ 3 for(var i=0;i<divs.length;i++){ 4 divs[i].style.transform = "rotate(0deg)"; 5 } 6 } 7 }
第三步
當點擊最后一個div時,扇形收起或者打開
divs[9].onclick = function(){ if(jilu){ back(); } else{ go(); } jilu = !jilu; }
jilu這個變量的初始值是true,用jilu這個變量是為了當點擊最后一個div時,通過判斷jilu的值,扇形可以收起或者打開
第四步
當點擊每個div時(除了最后一個div),被點擊的div旋轉到270度,並且在他左右邊的div距離他的位置加大。
1 //為每個div添加點擊事件 2 for(var i=0;i<divs.length - 1;i++){ 3 divs[i].index = i; 4 divs[i].onclick = function(){ 5 for(var i = 0;i < divs.length;i++){ 6 //當第i個div被點擊,其他div的角度 7 if(this.index > i){ 8 divs[i].style.transform = "rotate("+(342-(i*15) + this.index*15-72+10)+"deg)"; 9 } 10 if( this.index < i){ 11 divs[i].style.transform = "rotate("+(342-(i*15) + this.index*15-72-10)+"deg)"; 12 } 13 } 14 //被點擊div的角度 15 divs[this.index].style.transform = "rotate("+(342-(this.index*15) + this.index*15-72)+"deg)"; 16 17 } 18 }
我們可以先看被點擊div的角度,此時(342-(this.index*15) + this.index*15-72)等於270度,那我們將其他的div的角度都加10度,就可以了。
這個效果還是挺簡單的,角度的計算那里有點繞,自己用瀏覽器看看每個div的角度,就會理解為什么這么寫了。
源碼:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style> 7 *{ 8 margin: 0; 9 padding: 0; 10 } 11 body{ 12 background: #666; 13 } 14 #box{ 15 width: 1200px; 16 height: 700px; 17 background: url(img/bg.png) no-repeat; 18 position: relative; 19 margin: 100px auto; 20 } 21 #box div{ 22 width: 400px; 23 height: 100px; 24 border-radius: 9px; 25 position: absolute; 26 left: 555px; 27 top: 444px; 28 /* 29 30 */ 31 background: url(img/logo.png) no-repeat 280px 56px; 32 transform-origin: 35px 50px; 33 transition: 1s; 34 } 35 #box div:nth-of-type(1){ 36 background-color: #417191; 37 } 38 #box div:nth-of-type(2){ 39 background-color: #ce8298; 40 } 41 #box div:nth-of-type(3){ 42 background-color: #f78992; 43 } 44 #box div:nth-of-type(4){ 45 background-color: #fbc0a5; 46 } 47 #box div:nth-of-type(5){ 48 background-color: #f8988f; 49 } 50 #box div:nth-of-type(6){ 51 background-color: #f16273; 52 } 53 #box div:nth-of-type(7){ 54 background-color: #9c9fcd; 55 } 56 #box div:nth-of-type(8){ 57 background-color: #bae2d3; 58 } 59 #box div:nth-of-type(9){ 60 background-color: #43bab8; 61 } 62 #box div:nth-of-type(10){ 63 background-color: #678d95; 64 65 </style> 66 </head> 67 <body> 68 <div id="box"> 69 <div></div> 70 <div></div> 71 <div></div> 72 <div></div> 73 <div></div> 74 <div></div> 75 <div></div> 76 <div></div> 77 <div></div> 78 <div></div> 79 </div> 80 <script> 81 window.onload = function(){ 82 var box = document.getElementById('box'); 83 var divs = box.getElementsByTagName('div'); 84 var jilu = true; 85 86 setTimeout(function(){ 87 go(); 88 },1000); 89 90 //8 222 270 +48 91 //7 237 270 +33 92 //6 252 270 +18 93 // 15 94 95 //為每個div添加點擊事件 96 for(var i=0;i<divs.length - 1;i++){ 97 divs[i].index = i; 98 divs[i].onclick = function(){ 99 for(var i = 0;i < divs.length;i++){ 100 //當第i個div被點擊,其他div的角度 101 if(this.index > i){ 102 divs[i].style.transform = "rotate("+(342-(i*15) + this.index*15-72+10)+"deg)"; 103 } 104 if( this.index < i){ 105 divs[i].style.transform = "rotate("+(342-(i*15) + this.index*15-72-10)+"deg)"; 106 } 107 } 108 //被點擊div的角度 109 divs[this.index].style.transform = "rotate("+(342-(this.index*15) + this.index*15-72)+"deg)"; 110 111 } 112 } 113 114 //點擊最后一個圖片,合並扇形 115 divs[9].onclick = function(){ 116 if(jilu){ 117 back(); 118 } 119 else{ 120 go(); 121 } 122 jilu = !jilu; 123 124 } 125 126 //使扇形打開 127 function go(){ 128 for(var i = 0;i<divs.length;i++){ 129 //"rotate("+345-(i*15)+"deg)" 130 //不行,因為這樣會先算"rotate("+345 131 divs[i].style.transform = "rotate("+(342-(i*15))+"deg)"; 132 } 133 } 134 //是扇形合並 135 function back(){ 136 for(var i=0;i<divs.length;i++){ 137 divs[i].style.transform = "rotate(0deg)"; 138 } 139 } 140 } 141 142 143 </script> 144 </body> 145 </html>