本文将借助css3实现魔方动画效果,设计思路如下:
- HTML方面采用六个div容器形成六个立方面;
- CSS方面采用transform-style: preserve-3d;形成三维场景;transform: rotateX(-90deg) translateZ(150px);实现立方面旋转组成立方体;animation: rotate 10s linear infinite alternate;动画效果添加;
效果图:
HTML内容:
1 <div class="box"> 2 <div class="before"> 3 <ul> 4 <li>1</li> 5 <li>2</li> 6 <li>3</li> 7 <li>4</li> 8 <li>5</li> 9 <li>6</li> 10 <li>7</li> 11 <li>8</li> 12 <li>9</li> 13 </ul> 14 </div> 15 <div class="back"></div> 16 </div>
设置before、back等六面分别作为立面的前后左右上下各面;
CSS核心:
1 @keyframes rotate { 2 0% { 3 transform: rotateY(0deg) rotateX(0deg) rotateZ(0deg); 4 } 5 6 20% { 7 transform: rotateY(30deg) rotateX(40deg) rotateZ(20deg); 8 } 9 10 40% { 11 transform: rotateY(-60deg) rotateX(-40deg) rotateZ(-20deg); 12 } 13 14 60% { 15 transform: rotateY(145deg) rotateX(80deg) rotateZ(10deg); 16 } 17 18 80% { 19 transform: rotateY(90deg) rotateX(60deg) rotateZ(-20deg); 20 } 21 22 100% { 23 transform: rotateY(135deg) rotateX(-45deg) rotateZ(30deg); 24 } 25 } 26 27 .top { 28 background-color: transparent; 29 transform: rotateX(90deg) translateZ(150px); 30 } 31 32 .box { 33 width: 300px; 34 height: 300px; 35 margin: 150px auto; 36 position: relative; 37 font-size: 50px; 38 /*perspective: 1000px;*/ 39 transform-style: preserve-3d; 40 41 animation: rotate 10s linear infinite alternate; 42 }
- 动画rotate设置不同时间段的立方体旋转角度;
- box容器指定了三维场景以及动画效果;
- top 则将平面旋转(rotateX)、设置距离屏幕距离(translateZ);
如何理解3D场景下perspective与translateZ的关系?
translateZ()
CSS函数沿着z轴在三维空间中重新定位元素,即,从观察者的角度而言更近或者更远。这个变换是由一个<length>
元素定义的,它指定元素向内或向外移动的距离。
perspective
CSS属性决定在z = 0平面和用户之间的距离以便使所述3D定位的元素一些透视效果。z> 0的每个3D元素变大;,每个z <0的三维元素则变小。效果的强度由此属性的值决定。
说明:
- d代表perspective设置的用户目视距屏幕的距离;
- z代表translateZ设置的元素移动距离;
源码来了:
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style> 7 8 ul { 9 list-style: none; 10 margin:0; 11 padding:0; 12 } 13 .box { 14 width: 300px; 15 height: 300px; 16 margin: 150px auto; 17 position: relative; 18 font-size: 50px; 19 /*perspective: 1000px;*/ 20 transform-style: preserve-3d; 21 22 animation: rotate 10s linear infinite alternate; 23 } 24 25 .box>div { 26 width: 300px; 27 height: 300px; 28 position: absolute; 29 } 30 .right { 31 background-color: transparent; 32 transform: rotateY(90deg) translateZ(150px); 33 } 34 .left { 35 background-color: transparent; 36 transform: rotateY(-90deg) translateZ(150px); 37 } 38 39 .top { 40 background-color: transparent; 41 transform: rotateX(90deg) translateZ(150px); 42 } 43 44 .bottom { 45 background-color: transparent; 46 transform: rotateX(-90deg) translateZ(150px); 47 } 48 49 .before { 50 background-color: transparent; 51 transform: translateZ(150px); 52 } 53 54 .back { 55 background-color: transparent; 56 transform: translateZ(-150px); 57 } 58 59 li { 60 float: left; 61 width: 90px; 62 height: 90px; 63 border-radius: 20px; 64 margin: 5px; 65 text-align: center; 66 line-height: 90px; 67 } 68 69 .before li { 70 background-color: green; 71 } 72 .back li { 73 background-color:chartreuse; 74 } 75 76 .top li { 77 background-color: purple; 78 } 79 80 .bottom li { 81 background-color: cornflowerblue; 82 } 83 84 .left li { 85 background-color: darkorange; 86 } 87 88 .right li { 89 background-color: #37ffc7; 90 } 91 92 .box:hover { 93 animation-play-state: paused; 94 } 95 96 @keyframes rotate { 97 0% { 98 transform: rotateY(0deg) rotateX(0deg) rotateZ(0deg); 99 } 100 101 20% { 102 transform: rotateY(30deg) rotateX(40deg) rotateZ(20deg); 103 } 104 105 40% { 106 transform: rotateY(-60deg) rotateX(-40deg) rotateZ(-20deg); 107 } 108 109 60% { 110 transform: rotateY(145deg) rotateX(80deg) rotateZ(10deg); 111 } 112 113 80% { 114 transform: rotateY(90deg) rotateX(60deg) rotateZ(-20deg); 115 } 116 117 100% { 118 transform: rotateY(135deg) rotateX(-45deg) rotateZ(30deg); 119 } 120 } 121 </style> 122 </head> 123 <body> 124 <div class="box"> 125 <div class="before"> 126 <ul> 127 <li>1</li> 128 <li>2</li> 129 <li>3</li> 130 <li>4</li> 131 <li>5</li> 132 <li>6</li> 133 <li>7</li> 134 <li>8</li> 135 <li>9</li> 136 </ul> 137 </div> 138 <div class="back"> 139 <ul> 140 <li>1</li> 141 <li>2</li> 142 <li>3</li> 143 <li>4</li> 144 <li>5</li> 145 <li>6</li> 146 <li>7</li> 147 <li>8</li> 148 <li>9</li> 149 </ul> 150 </div> 151 <div class="top"> 152 <ul> 153 <li>1</li> 154 <li>2</li> 155 <li>3</li> 156 <li>4</li> 157 <li>5</li> 158 <li>6</li> 159 <li>7</li> 160 <li>8</li> 161 <li>9</li> 162 </ul> 163 </div> 164 <div class="bottom"> 165 <ul> 166 <li>1</li> 167 <li>2</li> 168 <li>3</li> 169 <li>4</li> 170 <li>5</li> 171 <li>6</li> 172 <li>7</li> 173 <li>8</li> 174 <li>9</li> 175 </ul> 176 </div> 177 <div class="left"> 178 <ul> 179 <li>1</li> 180 <li>2</li> 181 <li>3</li> 182 <li>4</li> 183 <li>5</li> 184 <li>6</li> 185 <li>7</li> 186 <li>8</li> 187 <li>9</li> 188 </ul> 189 </div> 190 <div class="right"> 191 <ul> 192 <li>1</li> 193 <li>2</li> 194 <li>3</li> 195 <li>4</li> 196 <li>5</li> 197 <li>6</li> 198 <li>7</li> 199 <li>8</li> 200 <li>9</li> 201 </ul> 202 </div> 203 </div> 204 </body> 205 </html>