CSS3 transition animation了解一下?

transition和animation都是css3提出的新特性,我们可以使用这两个特性做出丰富的动画效果。但由于这两个特性的功能又有部分重叠,很多时候不知道该选择哪一种。接下来让我们了解一下这两个特性以及他们的使用方法吧。

Transition

transition的字面意思即为过渡,它通过控制元素属性将元素的样式从一个状态过渡到另一个状态。下表列出了transition的基本属性:

transition

下列四个过度属性的简写方式

transition-property

应用css过渡的css属性

transition-duration

过渡效果的持续时间

transition-timing-function

规定了过渡效果的时间曲线,即过渡的匀变速

transition-delay

规则过渡效果何时开始,默认是0

接下来让我们通过一些例子来了解一下上述属性的使用方法吧。

我们先来看一个最基本的例子,效果如下图,当鼠标移入元素时,元素翻转360度并且进行颜色大小的变换。当鼠标移出时,元素样式自动变回原样。

 <style>
    .transition {
      ...
      background-color: red;
      transition: transform 2s, background-color 2s;
    }
    .transition:hover {
      transform: scale(1.2) rotate(360deg);
      background-color: yellow;
    }
</style>
<div class="transition">transition</div>

上面列出了一些关键代码。我们定义一个类名为transition的div元素,在他的类名下面定义一些基础属性表示起始状态,同时使用:hover伪类定义结束状态。上面代码最关键的一行便是transition属性,在transition属性里面控制了transform与background-color两个css属性,并且持续时间为两秒。

难道transition只能制作简单的效果吗?它的能力就仅限于此吗?当然不是,我们也可以使用transition制作连续的动画效果,这时可以借助javascript的帮助。先来看一下下面这个简单跑马灯的例子。

function startCarousel() {
    setTimeout(function () {
         left = left - width;
         carousel.setAttribute('style', `
              transition: left 0.6s;
              left: ${left}px;
         `)
     }, 1000);
}
carousel.addEventListener('transitionend', startCarousel);
carousel.addEventListener("webkitTransitionEnd", startCarousel);
startCarousel();

这是一个走马灯的简单实现,使用settimeout方法定时来改变元素的left属性来实现走马灯的移动。下面使用了transitionend事件,将改变left属性的函数绑定到此属性上,当transition结束时便调用此方法。js同时也提供了transitionstart事件,在transition开始时触发事件。

Animation

transition指定了开始和结束状态,animation就类似于逐帧动画,就像视频播放一样细腻灵活。这种逐帧动画有关键帧组成,多个关键帧的连续播放就构成了动画。css3的animation就是利用这一原理,使用keyframe属性完成动画的逐帧播放。

animation-name

用来设置动画名称

animation-duration

动画的持续时间

animation-timing-function

动画播放时间曲线,类似于transition-timing-function

animation-delay

设置动画的延迟时间

animation-iteration-count

动画循环次数,默认是1,可以设置为infinite无限循环

animation-direction

动画播放方向

animation-play-state

动画播放状态:running(播放中),paused(暂停)

animation

上述属性的简写

下面通过一个小例子来了解一下常用动画属性的基本用法。

<head>
    <style>
        .div {
            ...
.            
            animation-name: move, size;
            animation-duration: 3s;
            animation-timing-function: ease-in-out;
            animation-play-state: paused;
            animation-iteration-count: infinite;
            animation-direction: alternate
        }
        @keyframes move {
            0% {
                left: 0;
                transform: rotate(0deg);
            }
            100% {
                left: 500px;
                transform: rotate(720deg);
            }
        }
        @keyframes size {
            from { font-size: 25px; }
            to { font-size: 50px; }
        }
    </style>
</head>




<body>
    <div class="div">
         
    </div>
    <div>
        <button id="run">run</button>
        <button id="pause">pause</button>
    </div>
    <script>
        var ele = document.getElementsByClassName('div')[0];
        document.getElementById('run').addEventListener('click', function() {
            ele.style.animationPlayState = 'running'
        });
        document.getElementById('pause').addEventListener('click', function() {
            ele.style.animationPlayState = 'paused'
        });
    </script>
</body

上面的例子中定义了两个关键帧move和size,分别控制笑脸的移动和大小。这里使用@keyframe关键帧属性,keyframe内部可以使用from to 或者百分比来定义动画帧。css中定义了animation-play-state为pause代表动画处于暂停状态,animation-direction的alternate属性表示动画反复播放。在js代码中我们定义了两个按钮来改变元素的animation-play-state属性来控制动画的播放和暂停。

从上面的例子可以了解到,transition的起始和结束状态可以理解为animation的from to。当我们仅仅是为了实现简单的过渡效果时,transition无疑是更佳的选择,否则需要大量js代码来协助完成。而由于animation多关键帧的灵活性,仅仅使用css便可完成复杂的动画效果。我们可以根据不同的业务场景来选择合适的动画方案。

发布于 03-06

文章被以下专栏收录

    本专栏收录一些关于前端的技术文章,如果你是前端爱好者,或者是刚入门前端的新手,都可以在本专栏收获关于前端的点点滴滴,欢迎投稿和关注。 同名公众号:前端呼啦圈(Love-FED)