ホームページ > 記事 > ウェブフロントエンド > CSS3 アニメーション (3): トランスフォームはマルチフリップを実装しますanimation_html/css_WEB-ITnose
今日は自動で回転するマルチフリップアニメーションを紹介しますo(^▽^)o マルチフリップが何か知らなくても大丈夫です。レンダリングを見てください。あなたは理解できるでしょう ->
multi-flip2.gif
1. 一般的な考え方 前面に 7 つの div があり、7 つの div があります。裏面に重ねて、表面に 1 枚の写真、裏面に 1 枚の写真を配置します。 別の写真 (表と裏に異なる写真が描かれた紙など) の場合、表面を 180 度回転して写真を表示します。元の表の div ピクチャを元の裏の div ピクチャに置き換え、裏側を 180 度回転してフロントを表示し (この時点で元の位置に戻ります)、循環を続けます。 簡単に言うと、 前の div が回転、置き換えられ、元に戻り、後ろの div が次の画像に置き換えられ、サイクルが継続します。 (文字だけではちょっとわかりにくいので、「廬山の素顔」を見てみましょう) 2. HTML: まずは HTML を見て全体を理解してください。
<body> <div class="outer_box"> <div id="d0" class="inner_div"> <div class="bcwd"></div><!--背面的div--> <div class="fwd"></div><!--正面的div--> </div> <div id="d1" class="inner_div"> <div class="bcwd"></div> <div class="fwd"></div> </div> <!--此处省略div id="d2"-"d5"的书写(代码相同)--> <div id="d6" class="inner_div"> <div class="bcwd"></div> <div class="fwd"></div> </div> </div> </body>
3. CSS: 画像を切り取る: 完全な画像を 7 つの部分に切り取り、それぞれに異なるアニメーションを付けます。画像を切らずに7分割する方法:7つのdivを設定、各divの幅は画像の1/7、位置:絶対、backgroundのx値各divの位置は0から1まで徐々に減少します/ 7.
64LL4E2OL83]ED{]CQ6I0`J.png
(画像の青い部分が背景画像で、同じ背景画像が挿入されます)各 div に画像を左に移動するように、backgroundPosition を設定します。
のコード行を 5 行目に説明します。 fwd および bcwd div の場合、画像 1 はそれぞれ画像の面 1 と面 3 、面 2 に表示されますが、正しいものは面 1 が前面 (図 1)、面 2 と面 3 が近くにあり、側面である必要があります。 4 は背面です (写真 2)。このように、前面の div を前方に 180 度回転すると、背面が正面になります。上記の効果を実現するには、bcwd div を Y 軸に沿って 180 度回転して 4 面の画像を表示し、その後、背面の画像を前面に回転すると、画像が Z 軸に沿って 180 度回転する必要があります。上下逆ではありません。2.png
.bcwd{ background: url(../img/sample2.jpg) no-repeat; background-size: 600px 400px; /*背面的图片默认状态,背对正面,且上下颠倒(使选装之后上下不颠倒)*/ -webkit-transform: rotateY(180deg) rotateZ(180deg); }.fwd{ position: absolute; top: 0; background: url(../img/sample1.jpg) no-repeat; background-size: 600px 400px;}js 設定スタイル:
4.JS: 一定時間が経過すると、アニメーションの表側が裏側に変わり、さらに時間が経つと、裏側が表側に変わることに注意してください。
var bcwd = document.getElementsByClassName('bcwd'); var fwd = document.getElementsByClassName('fwd'); for (var i = 0; i < inner.length; i++) { //设置bcwd和back的位置(left background-position) bcwd[i].style.left = 85.72 * i + 'px'; bcwd[i].style.backgroundPosition = '-' + 85.72 * i + 'px 0'; fwd[i].style.left = 85.72 * i + 'px'; fwd[i].style.backgroundPosition = '-' + 85.72 * i + 'px 0'; }
現在の効果:
.inner_div.r{ -webkit-transform: rotateX(180deg); /*正面转为背面,背面转为正面*/ -webkit-transition: -webkit-transform 1s ease-in-out;}multi-flip.gif
setInterval(function(){ go(); },2000); var index = 2,nextIndex = 3; //用于计算第几张图片 inner[0].addEventListener("webkitTransitionEnd", function () { //换背景图(此时,fwd在背面。bcwd在正面) if(index == 4) nextIndex = 1; //最后一张图片与第一张图片的切换 else nextIndex = index + 1; for (var j = 0; j < fwd.length; j++) { //fwd的图片替换成当前图片 fwd[j].style.backgroundImage = 'url(img/sample' + index + '.jpg)'; } reset(); //fwd旋转为正面,bcwd旋转为背面 for (var j = 0; j < fwd.length; j++) { //bcwd的图片替换成下一张图片 bcwd[j].style.backgroundImage = 'url(img/sample' + nextIndex + '.jpg)'; } index = nextIndex; });
//实现背面转向正面 function go () { setTimeout(function() { inner[3].classList.add("r"); setTimeout(function() { inner[2].classList.add("r"); inner[4].classList.add("r"); setTimeout(function() { inner[1].classList.add("r"); inner[5].classList.add("r"); setTimeout(function() { inner[0].classList.add("r"); inner[6].classList.add("r"); }, 200); //时间可以改变,但是4个时间相加总和+动画旋转时间(css 1s)要小于上边setTimout的总时间 }, 200); }, 200); }, 200) }//实现正面转为背面 function reset () { for (var m = 0;m<inner.length;m++) { inner[m].classList.remove("r"); } }
( )
5. 次の 2 つの CSS 文を追加して解決します:
6. 補足:
1.backface-visibility: visible|hidden ;要素が画面に面していないときに表示されるかどうかを定義します。見える:裏側が見えます。 hidden: 背面は表示されません。 2. 次の 2 つの文は、3D 効果を強化し、アニメーション効果を大幅に向上させることができます。 -webkit-transform-style:preserve-3d; -webkit-perspective:2000; 3. 完全なコードは後で発表されます。