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

基于HTML5+Webkit实现树叶飘落动画

程序员文章站 2023-11-20 16:42:40
本文给大家分享一段实例代码给大家介绍基于HTML5+Webkit实现树叶飘落动画效果,需要的朋友参考下吧... 17-12-28...

实现如图所示的东西效果(落叶下落):

基于HTML5+Webkit实现树叶飘落动画 

html代码:

<!doctype html>
<html>
<head>
    <title>html5树叶飘落动画</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=500px, initial-scale=0.64">
    <link rel="stylesheet" href="leaves.css" type="text/css">
    <script src="leaves.js" type="text/javascript"></script>
</head>
<body>
    <div id="container">
        <div id="leafcontainer"></div>
        <div id="message">
            <em>这是基于webkit的落叶动画</em>
        </div>
    </div>  
</body>
</html>
css代码:
body{
    background-color: #4e4226;
}
#container {
    position: relative;
    height: 700px;
    width: 500px;
    margin: 10px auto;
    overflow: hidden;
    border: 4px solid #5c090a;
    background: #4e4226 url('images/backgroundleaves.jpg') no-repeat top left;
}
#leafcontainer {
    position: absolute;
    width: 100%;
    height: 100%;
}
#message{
    position: absolute;
    top: 160px;
    width: 100%;
    height: 300px;
    background:transparent url('images/textbackground.png') repeat-x center;
    color: #5c090a;
    font-size: 220%;
    font-family: 'georgia';
    text-align: center;
    padding: 20px 10px;
    -webkit-box-sizing: border-box;
    -webkit-background-size: 100% 100%;
    z-index: 1;
}
em {
    font-weight: bold;
    font-style: normal;
}
#leafcontainer > div {
    position: absolute;
    width: 100px;
    height: 100px;
    -webkit-animation-iteration-count: infinite;
    -webkit-animation-direction: normal;
    -webkit-animation-timing-function: linear;
}
#leafcontainer > div > img {
     position: absolute;
     width: 100px;
     height: 100px;
     -webkit-animation-iteration-count: infinite;
     -webkit-animation-direction: alternate;
     -webkit-animation-timing-function: ease-in-out;
     -webkit-transform-origin: 50% -100%;
}
@-webkit-keyframes fade{
    0%   { opacity: 1; }
    95%  { opacity: 1; }
    100% { opacity: 0; }
}
@-webkit-keyframes drop{
    0%   { -webkit-transform: translate(0px, -50px); }
    100% { -webkit-transform: translate(0px, 650px); }
}
@-webkit-keyframes clockwisespin{
    0%   { -webkit-transform: rotate(-50deg); }
    100% { -webkit-transform: rotate(50deg); }
}
@-webkit-keyframes counterclockwisespinandflip {
    0%   { -webkit-transform: scale(-1, 1) rotate(50deg); }
    100% { -webkit-transform: scale(-1, 1) rotate(-50deg); }
}
js代码:
const number_of_leaves = 30;
function init(){
    var container = document.getelementbyid('leafcontainer');
    for (var i = 0; i < number_of_leaves; i++) {
        container.appendchild(createaleaf());
    }
}
function randominteger(low, high){
    return low + math.floor(math.random() * (high - low));
}
function randomfloat(low, high){
    return low + math.random() * (high - low);
}
function pixelvalue(value){
    return value + 'px';
}
function durationvalue(value){
    return value + 's';
}
function createaleaf(){
    var leafdiv = document.createelement('div');
    leafdiv.style.top = "-100px";
    leafdiv.style.left = pixelvalue(randominteger(0, 500));
    leafdiv.style.webkitanimationname = 'fade, drop';
    var fadeanddropduration = durationvalue(randomfloat(5, 11));
    leafdiv.style.webkitanimationduration = fadeanddropduration + ', ' + fadeanddropduration;
    var leafdelay = durationvalue(randomfloat(0, 5));
    leafdiv.style.webkitanimationdelay = leafdelay + ', ' + leafdelay;
    var image = document.createelement('img');
    image.src = 'images/realleaf' + randominteger(1, 5) + '.png';
    var spinanimationname = (math.random() < 0.5) ? 'clockwisespin' : 'counterclockwisespinandflip';
    image.style.webkitanimationname = spinanimationname;
    var spinduration = durationvalue(randomfloat(4, 8));
    image.style.webkitanimationduration = spinduration;
    leafdiv.appendchild(image);
    return leafdiv;
}
window.addeventlistener('load', init, false);

ps:下面看下html5 canvas处理连续帧图片,下面的代码基于ie8以上

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<title>canvas demo</title>
<script>
var canvas = null;//初始化参数
var img = null;
var ctx = null;
var imageready = false;
window.onload = function() {
    var canvas = document.getelementbyid("animation_canvas");
    canvas.width = canvas.parentnode.clientwidth;
    canvas.height = canvas.parentnode.clientheight;
    if (!canvas.getcontext) {
        console.log("canvas not supported. please install a html5 compatible browser.");
        return;
    }   
    // get 2d context of canvas and draw rectangel
    ctx = canvas.getcontext("2d");
    ctx.fillstyle="black";
    ctx.fillrect(0, 0, canvas.width, canvas.height);
    console.log(canvas.height);
    img = document.createelement('img');
    img.src = "images/ab0.png";
    img.onload = loaded();
}  
//保证只有图像加载后才开始循环动画
function loaded() {
    imageready = true;
    settimeout( update, 1000/3);//添加3帧每秒间隔计时器
}
function redraw() {
    ctx.fillstyle="black";
    ctx.fillrect(0, 0, 460, 460);
    ctx.drawimage(img, 0, 0, 232, 180);
}   
//为了让图片以规定的速度动画,我们必须追踪已经经过的时间,然后根据分配给每帧的时间播放帧。基本步骤是:
//1、按每秒几帧设置动画速度(msperframe)。
//2、当你循环游戏时,计算一下自最后一帧以后已经经过了多少时间(delta)。
//3、如果已经经过的时间足够把动画帧播完,那么播放这一帧并设置累积delta为0。
//4、如果已经经过的时间不够,那么记住(累积)delta时间(acdelta)。
var frame = 0;
var lastupdatetime = 0;
var acdelta = 0;
var msperframe = 200;
function update() {
    requestanimframe(update);
    var delta = date.now() - lastupdatetime;
    //console.log(date.now(),lastupdatetime);
    if (acdelta > msperframe){
        acdelta = 0;
        redraw();
        img.src='images/ab'+frame+'.png';
        frame++; 
        if(frame >= 3) frame = 0; //当绘制后且帧推进完,计时器就会重置。
    }else{
        acdelta += delta;
    }
    lastupdatetime = date.now();
}
//requestanimframe的作用基本上就是settimeout,但浏览器知道你正在渲染帧,所以它可以优化绘制循环,以及如何与剩下的页面回流。
//在某些情况下,settimeout比requestanimframe更好用,特别是对于手机。
//以下是在不同的浏览器上调用requestanimframe的情况也不同,标准的检测方法如下:
window.requestanimframe = (function(){
    return window.requestanimationframe ||
            window.webkitrequestanimationframe ||
            window.mozrequestanimationframe ||
            window.orequestanimationframe ||
            window.msrequestanimationframe ||
            function( callback ){
                window.settimeout(callback, 1000 / 3); //如果requestanimframe支持不可用,还是可以用回内置的settimeout。
            };
})();
</script>
</head>
<body style="position:absolute;margin:0;padding:0;width:100%;height:100%;">
    <canvas id="animation_canvas"></canvas>
</body>
</html>

总结

以上所述是小编给大家介绍的基于html5+webkit实现树叶飘落动画,希望对大家有所帮助