CSS 3提供的Transition动画

  CSS 3提供了Transition动画支持,Transition动画可以控制HTML组件的某个属性发生改变时会经历一段时间、以平滑渐变的方式发生改变,这就产生了动画效果。
  Transition动画通过transition属性来指定。transition属性的值包括如下4个部分。
  ➢ transition-property:指定对HTML元素的哪个CSS属性进行平滑渐变处理。该属性可以指定background-color、width、height等各种标准的CSS属性。
  ➢ transition-duration:指定属性平滑渐变的持续时间。
  ➢ transition-timing-function:指定渐变的速度。该部分支持如下几个值。
  □ ease:动画开始时较慢,然后速度加快,到达最大速度后再减慢速度。
  □ linear:线性速度。动画开始时的速度到结束时的速度保持不变。
  □ ease-in:动画开始时速度较慢,然后速度加快。
  □ ease-out:动画开始时速度很快,然后速度减慢。
  □ ease-in-out:动画开始时速度较慢,然后速度加快,到达最大速度后再减慢速度。
  □ cubic-bezier(x1, y1, x2, y2):通过贝济埃曲线来控制动画的速度。该属性值完全可以代替ease、linear、ease-in、ease-out、ease-in-out等属性值。
  ➢ transition-delay:指定延迟时间,也就是指定经过多长时间的延迟才会开始执行平滑渐变。

提示

  需要指出的是,目前各主流浏览器暂未支持transition属性,因此在实际开发中还需要添加各浏览器厂商的前缀,例如-moz-、-webkit-、-o-等前缀。下面页面代码示范了如何通过transition属性来实现动画。

例子
<!DOCTYPE html>  
<html>  
<head>  
    <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
    <title> 背景色变化 </title>
    <style type="text/css">
        div {
            width: 400px;
            height: 50px;
            border: 1px solid black;
            background-color: red;
            padding: 10px;
            -moz-transition: background-color 4s linear;
            -webkit-transition: background-color 4s linear;
            -o-transition: background-color 4s linear;
        }
        div:hover {
            background-color: yellow;
        }
    </style>
</head>  
<body>  
<div>鼠标移上来会发生颜色渐变</div>  
</body>  
</html>  

多个属性同时渐变

  transition属性可以同时指定多组property duration time-function delay值,每组property duration time-function delay值控制一个属性值的渐变效果。
  通过多个属性同时渐变可以非常方便地开发出动画效果。假如我们想实现一个在页面上随鼠标漂移的气球——控制气球移动主要是修改气球图片的left、top两个属性值,让这两个属性值等于鼠标按下的X、Y坐标即可。如果再设置气球图片的left、top CSS属性不是突然改变,而是以平滑渐变的方式来进行,这就是动画了。

例子
<!DOCTYPE html>  
<html>  
<head>  
    <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
    <title> 漂浮的气球 </title>
    <style type="text/css">
        img#target {
            position: absolute;
            /* 指定气球图片的left、top属性会采用平滑渐变的方式来改变 */
            -moz-transition: left 5s linear , top 5s linear;
            -webkit-transition: left 5s linear , top 5s linear;
            -o-transition: left 5s linear , top 5s linear;
        }
    </style>
</head>  
<body>  
<img id="target" src="balloon.gif" alt="气球"/>  
<script type="text/javascript">  
    var target = document.getElementById("target");
    target.style.left = "0px";
    target.style.top = "0px";
    // 为鼠标按下事件绑定监听器
    document.onmousedown = function(evt)
    {
        // 将鼠标事件的X、Y坐标赋给气球图片的left、top。
        target.style.left = evt.pageX + "px";
        target.style.top = evt.pageY + "px";
    }
</script>  
</body>  
</html>  
图片


IT料理

例子

  除了以平滑渐变的方式改变位置之外,也可以同时修改HTML的宽度、高度、背景色等。

<!DOCTYPE html>  
<html>  
<head>  
    <meta http-equiv="Content-Type" content="text/html; charset=GBK" />
    <title> Transition动画 </title>
    <style type="text/css">
        div {
            width: 200px;
            height: 160px;
            background-color: red;
            /* 指定背景色、宽度、高度会以平滑简便的方式来改变
            指定动画持续时间为2秒,动画会延迟2秒之后才启动。
            */
            -moz-transition: background-color 2s linear 2s,
                width 2s linear 2s, height 2s linear 2s;
            -webkit-transition: background-color 2s linear 2s,
                width 2s linear 2s, height 2s linear 2s;
            -o-transition: background-color 2s linear 2s,
                width 2s linear 2s, height 2s linear 2s;
        }
    </style>
    <script type="text/javascript">
        // 定义目标组件的初始宽度、高度
        var originWidth = 200;
        var originHeight = 160;
        var zoom = function(scale , bgColor)
        {
            var target = document.getElementById("target");
            // 设置缩放之后的宽度、高度
            target.style.width = originWidth * scale + "px";
            target.style.height = originHeight * scale + "px";
            // 设置背景色
            target.style.backgroundColor = bgColor;
        }
    </script>
</head>  
<body>  
<button onclick="zoom(2 , 'blue');">放大</button>  
<button onclick="zoom(0.5 , 'green');">缩小</button>  
<button onclick="zoom(1 , 'red');">恢复</button>  
<div id="target">  
</div>  
</body>  
</html>  

指定动画速度

  指定transition属性时可通过transition-timing-function设置属性变化的速度,这个值的本质是通过一条贝济埃曲线来控制目标属性的改变。
  下图显示了动画速度的计算方式。


IT料理

  上图中黑色的贝济埃曲线代表了目标属性与流逝时间的关系,左下角的原点处代表属性还未开始改变,时间也还未流逝;右上角的1.0、1.0处则代表属性已改变完成,时间也耗尽。曲线中间各点的横坐标代表在不同的时间点上,纵坐标代表目标属性在当前时间点的值。 transition-timing-function值可通过cubic-bezier(x1,y1, x2, y2)来指定,该函数中的x1、y1用于确定上图中P1的坐标,x2、y2则用于确定上图中P2的坐标,一旦确定了P1、P2的位置,这条贝济埃曲线就可以确定下来,这样系统就可以根据这条曲线来确定目标属性的改变速度。
  实际上,前面介绍的几种改变速度都只是cubic-bezier(x1,y1, x2, y2)的应用。
  ➢ ease:相当于cubic-bezier(0.25, 0.1, 0.25, 1.0)。
  ➢ linear:相当于cubic-bezier(0.0, 0.0, 1.0, 1.0)。
  ➢ ase-in:相当于cubic-bezier(0.42, 0, 1.0, 1.0)。
  ➢ ease-out:相当于cubic-bezier(0, 0, 0.58, 1.0)。
  ➢ ease-in-out:相当于cubic-bezier(0.42, 0, 0.58, 1.0)。

注:本博客内容节选自李刚编著的疯狂HTML 5/CSS 3/JavaScript讲义 ,详细内容请参阅书籍。