欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

动画animation的三个应用(漂浮的白云、旋转的星球、正方体合成) - 小火柴的蓝色理想

程序员文章站 2022-04-12 14:35:11
...

前面的话

  前面介绍过动画animation的详细用法,本文主要介绍动画animation的三个效果

漂浮的白云

【效果演示】

【简要介绍】

  漂浮的白云主要通过远景白云和近景白云来实现立体漂浮效果。远景和近景分别使用两张背景图片,通过改变其背景定位来实现白云移动效果,通过设置不同的动画持续时间来实现交错漂浮的效果

【主要代码】

.box{
    position: relative;
    height: 300px;
    width: 500px;
}    
.in1,.in2{
    position: absolute;
    height: 100%;
    width: 100%;
    background-size:cover;
    animation: move 100s infinite linear alternate;
}
@keyframes move{
    100%{background-position: 500% 0;}
}
.in1{
    background-image: url('http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/cloud.png');   
}
.in2{
    background-image: url('http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/cloud1.png');
    animation-duration: 10s;
}
div class="box">
    div class="in1">div>
    div class="in2">div>
div>

源码查看

旋转的星球

【效果演示】

【简要介绍】

  旋转的星球主要通过rotate()旋转函数来实现。实际上,蓝色的地球和黑色的月球并没有发生旋转,只是其父级旋转形成的视觉上的旋转效果

【代码演示】

.box{
    transform: scale(0.5);
    position: relative;
    padding: 1px;
    height: 300px;
    width: 300px;
}    
.sunline{
    position:relative;
    height: 400px;
    width: 400px;
    border: 2px solid black;
    border-radius: 50%;
    margin: 50px 0 0 50px;
    display: flex;
    animation: rotate 10s infinite linear;
}
.sun{
    height: 100px;
    width: 100px;
    margin: auto;
    background-color: red;
    border-radius: 50%;
    box-shadow: 5px 5px 10px red,-5px -5px 10px red,5px -5px 10px red,-5px 5px 10px red;
}
.earthline{
    position: absolute;
    right: 0;
    top: 50%;
    height: 200px;
    width: 200px;
    margin: -100px -100px 0 0;
    border: 1px solid black;
    border-radius: 50%;
    display: flex;
    animation: rotate 2s infinite linear;
}
.earth{
    margin: auto;
    height: 50px;
    width: 50px;
    background-color: blue;
    border-radius: 50%;
}
.moon{
    position: absolute;
    left: 0;
    top: 50%;
    height: 20px;
    width: 20px;
    margin: -10px 0 0 -10px;
    background-color: black;
    border-radius: 50%;
}
@keyframes rotate{
    100%{transform:rotate(360deg);}
}
div class="box">
    div class="sunline">
        div class="sun">div>
        div class="earthline">
            div class="earth">div>
            div class="moon">div>
        div>
    div>
div>

源码查看

正方体合成

【效果演示】

【简要介绍】

  该效果主要通过设置计算后的延迟时间来达到正方体的各个边顺序动画的效果。一次动画结束后,通过触发animationend事件重置animation-name来实现重复动画的效果

【代码演示】

ul{
    margin: 0;
    padding: 0;
    list-style: none;
}
.box{
    height: 100px;
    width: 100px;
    perspective: 500px;
    margin: 50px 0 0 50px;
}    
.list{
    position: relative;
    height: 100px;
    width: 100px;
    background-color: blue;
    transform-style: preserve-3d;
    transform-origin: 0 0 0;
    animation: rotate 1s  10s 3 both linear;
}
.in{
    position: absolute;
    height: 100px;
    width: 100px;
}
.list .in:nth-child(6){
    background-color: pink;
    transform-origin: top;
    animation: in6 2s both;
}
.list .in:nth-child(5){
    background-color: lightgreen;
    transform-origin: right;
    animation: in5 2s 2s both;
}
.list .in:nth-child(4){
    background-color: lightblue;
    transform-origin: bottom;
    animation: in4 2s 4s both;
}
.list .in:nth-child(3){
    background-color: lightcoral;
    transform-origin: left;
    animation: in3 2s 6s both;
}
.list .in:nth-child(2){
    background-color: lightcyan;
    animation: in2 2s 8s both;
}
.list .in:nth-child(1){background-color: lightsalmon;}
.box:hover .list{animation-play-state: paused;}
.box:hover .in{animation-play-state: paused;}
@keyframes in6{100%{transform: rotateX(90deg);}}
@keyframes in5{100%{transform: rotateY(90deg);}}
@keyframes in4{100%{transform: rotateX(-90deg);}}
@keyframes in3{100%{transform: rotateY(-90deg);}}
@keyframes in2{100%{transform: translateZ(100px);}}
@keyframes rotate{100%{transform: rotate3d(1,1,1,360deg);}}
div class="box">
    ul class="list" id="list">
        li class="in">li>
        li class="in">li>
        li class="in">li>
        li class="in">li>
        li class="in">li>
        li class="in">li>
    ul>
div>
list.addEventListener('animationend',function(e){
    e = e || event;
    var target = e.target || e.srcElement;
    if(target.nodeName == 'UL'){
        list.style.animationName = 'none';
        var children = list.getElementsByTagName('li');
        for(var i = 0; i ){
            children[i].style.animationName = 'none';
        }
        setTimeout(function(){
            list.style.animationName = 'rotate';
            var children = list.getElementsByTagName('li');
            for(var i = 0; i ){
                children[i].style.animationName = 'in' + (i+1);
            }        
        },100);        
    }
},false);

源码查看