CSS3 3D transform實現旋轉木馬效果
知識
07-18
3D transform中有下面這幾個屬性:
- rotateX(deg),rotateY(deg),rotateZ(deg)分別代表圍繞X軸,Y軸,Z軸旋轉。
- translateX(px), translateY(px), translateZ(px)分別代表圍繞X軸,Y軸,Z軸位移。
- transform-style: 使被轉換的子元素保留其 3D 轉換。
- perspective:定義 3D 元素距視圖的距離,以像素計。當為元素定義 perspective 屬性時,其子元素會獲得透視效果,而不是元素本身。
旋轉木馬實現
1. 搭建舞台,加個視距 perspective: 600px;
- <style>
- .stage {
- height: 200px;
- width: 200px;
- margin: 0 auto;
- position: relative;
- margin-top: 300px;
- perspective: 600px;
- perspective-origin: 50%;
- }
- </style>
- <div class="stage"></div>
2. 添加容器,加個3D視圖聲明。
transform-style: preserve-3d;
3. 添加圖片,這裡用div代替圖片位置。我們讓所有圖片position:absolute,公用同一個中心點。
- .stage div.wrap {
- width: 100%;
- height: 100%;
- transform-style: preserve-3d;
- position: absolute;
- }
- .stage div.wrap div {
- width: 200px;
- height: 100%;
- background: #E00808;
- position: absolute;
- }
- .stage div.wrap div:nth-child(1) {
- background: #333;
- transform: rotateY(0deg);
- }
- .stage div.wrap div:nth-child(2) {
- background: #555;
- transform: rotateY(60deg);
- }
- .stage div.wrap div:nth-child(3) {
- background: #777;
- transform: rotateY(120deg);
- }
- .stage div.wrap div:nth-child(4) {
- background: #999;
- transform: rotateY(180deg);
- }
- .stage div.wrap div:nth-child(5) {
- background: #101010;
- transform: rotateY(240deg);
- }
- .stage div.wrap div:nth-child(6) {
- background: #001afe;
- transform: rotateY(300deg);
- }
4. 加上translateZ拉開空間
上圖中紅色標註的r就是的demo頁面中圖片要translateZ的理想值(該值可以讓所有圖片無縫圍成一個圓)!
r的計算很簡單:
r = (div的一半寬度)/ Math.tan(角度 / 180 * Math.PI) 如上圖則 r = 64 / Math.tan(20 / 180 * Math.PI) = 175
因為我用了6個div,div寬度為200px,所以本例的 r 計算為
100 / Math.tan(30 / 180 * Math.PI) = 173
所以最終為:
- .stage div.wrap div {
- width: 200px;
- height: 100%;
- background: #E00808;
- position: absolute;
- }
- .stage div.wrap div:nth-child(1) {
- background: #333;
- transform: rotateY(0deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(2) {
- background: #555;
- transform: rotateY(60deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(3) {
- background: #777;
- transform: rotateY(120deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(4) {
- background: #999;
- transform: rotateY(180deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(5) {
- background: #101010;
- transform: rotateY(240deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(6) {
- background: #001afe;
- transform: rotateY(300deg) translateZ(193px);
- }
整合代碼
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>carousel</title>
- </head>
- <style>
- .stage {
- height: 200px;
- width: 200px;
- margin: 0 auto;
- position: relative;
- margin-top: 300px;
- perspective: 600px;
- perspective-origin: 50%;
- }
- .stage div.wrap {
- width: 100%;
- height: 100%;
- transform-style: preserve-3d;
- position: absolute;
- }
- .stage div.wrap div {
- width: 200px;
- height: 100%;
- background: #E00808;
- position: absolute;
- }
- .stage div.wrap div:nth-child(1) {
- background: #333;
- transform: rotateY(0deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(2) {
- background: #555;
- transform: rotateY(60deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(3) {
- background: #777;
- transform: rotateY(120deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(4) {
- background: #999;
- transform: rotateY(180deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(5) {
- background: #101010;
- transform: rotateY(240deg) translateZ(193px);
- }
- .stage div.wrap div:nth-child(6) {
- background: #001afe;
- transform: rotateY(300deg) translateZ(193px);
- }
- </style>
- <body>
- <div class="stage">
- <div class="wrap">
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- <div></div>
- </div>
- </div>
- </body>
- </html>
※spring+mybatis 實現多數據源切換
※Vue.js 2.0 漸進開發應用實踐
TAG:程序員小新人學習 |