扇形展開效果


學習了妙味課堂扇形展開效果

點擊這里預覽

知識點預備:

【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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM