canvas粒子时钟显示动画效果代码

代码语言:html

所属分类:粒子

代码描述:canvas粒子时钟显示动画效果代码

代码标签: 显示 动画 效果

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!doctype html>
<html>
<head>
<meta charset="utf-8">

<style>
      * {
	margin:0;
	outline:none;
	padding:0;
}
body {
	background:#000;
	font-family:'Lucida Grande','Helvetica','Arial';
	font-size:10px;
	overflow:hidden;
}
canvas {
	background:#222;
	cursor:default;
	z-index:1;
}
.nope {
	color:#fff;
	text-align:center;
	margin-top:150px;
}
header {
	position:relative;
	text-shadow:1px 1px 0px rgba(0,0,0,0.5);
	text-transform:uppercase;
	width:100%;
	z-index:10;
}
#about {
	color:#fff;
	color:rgba(255,255,255,0.5);
	display:block;
	float:right;
	margin:20px;
	text-align:right;
	width:50%;
}
h1 {
	color:rgba(255,255,255,0.75);
	float:left;
	font-size:10px;
	font-weight:normal;
	margin:20px;
}
a {
	color:rgba(255,255,255,0.5);
	display:inline-block;
	text-decoration:none;
	transition:0.5s ease color;
	-moz-transition:0.5s ease color;
	-o-transition:0.5s ease color;
	-webkit-transition:0.5s ease color;
}
a:hover {
	color:rgba(255,255,255,0.75);
}
ul#options {
	list-style:none;
	margin:10px 0 0;
	position:relative;
	right:0;
	z-index:10;
}
ul#options li {
	margin:5px 0;
	min-width:200px;
	opacity:0;
	transition:0.25s ease-in opacity;
	-moz-transition:0.25s ease-in opacity;
	-o-transition:0.25s ease-in opacity;
	-webkit-transition:0.25s ease-in opacity;
}
ul#options li.group {
	margin-top:15px;
}
ul#options li * {
	display:none;
}
ul#options li a {
	box-shadow:1px 1px 3px rgba(0,0,0,0.25);
	background-color:rgba(0,0,0,0.5);
	border-radius:3px;
	padding:3px 5px;
	position:relative;
	transition:0.5s ease all;
	-moz-border-radius:3px;
	-o-box-shadow:1px 1px 3px rgba(0,0,0,0.25);
	-moz-box-shadow:1px 1px 3px rgba(0,0,0,0.25);
	-webkit-box-shadow:1px 1px 3px rgba(0,0,0,0.25);
	-moz-transition:0.5s ease all;
	-o-transition:0.5s ease all;
	-webkit-transition:0.5s ease all;
}
ul#options li a:hover {
	color:rgba(255,255,255,0.75);
}
ul#options li a.on {
	background-color:rgba(255,255,255,0.8);
	color:rgba(0,0,0,0.9);
	text-shadow:0px 0px 0px;
}
ul#options li a.on:after {
	content:"\2713 ";
}
ul#options.on li {
	opacity:1;
	right:20px;
}
ul#options.on li * {
	display:inline-block;
}
ul#borders {
	}ul#borders li {
	position:fixed;
	list-style:none;
	margin:0;
	background-color:transparent;
	background-color:rgba(0,0,0,0.05);
	z-index:100;
}
li#top {
	height:10px;
	left:0;
	right:0;
	top:0;
}
li#right {
	bottom:10px;
	right:0;
	top:10px;
	width:10px;
}
li#bottom {
	bottom:0;
	height:10px;
	left:0;
	right:0;
}
li#left {
	bottom:10px;
	left:0;
	top:10px;
	width:10px;
}
</style>
</head>
<body>
<canvas width="800" height="400" id="canvas"><p class="nope">No canvas, no particles</p></canvas>
<header>
    <h1>Particle Clock</h1>
    <div id="about">
        <a href="#" id="toggle-options"></a>
        <ul id="options">
            <li><a href="#" id="quivers" class="">Quiver</a></li>
            <li><a href="#" id="gradient" class="on">Gradient</a></li>
            <li><a href="#" id="color" class="on">Colorize</a></li>
            <li><a href="#" id="valentineify" class="">Valentine-ify</a></li>
            <li class="group"><span>Mouse down: explode and repel</span></li>
            <li><span>Mouse down + shift: explode and attract</span></li>
            <li><span>Arrow Up: increase particle size</span></li>
            <li class="group"><span>Sorry about your CPU</span></li>
            <li><span id="fps"></span></li>
        </ul>
    </div>
</header><script>
var Clock = (function() {
        
    // private variables
    var canvas, // canvas element
        ctx, // canvas context
        bgGrad = true, // background gradient flag
        gradient, // gradient (background)
        height = 400, // canvas height
        key = {up: false, shift: false}, // key presses
        particles = [], // particle array
        particleColor = 'hsla(0, 0%, 100%, 0.3)', // particle color
        mouse = {x: 0, y: 0}, // position of mouse / touch
        press = false, // pressed flag
        quiver = false, // quiver flag
        text, // the text to copy pixels from
        textSize = 140, // (initial) textsize
        valentine = false, // valentine-ify it for a bit?
        msgTime = 100, // time to show a message before returning to clock
        updateColor = true, // update color of gradient / particles with time?
        width = 800; // canvas width
    
    // Constants
    var FRAME_RATE = 20, // frames per second target
        MIN_WIDTH = 800, // minimum width of canvas
        MIN_HEIGHT = 400, // minimum height of canvas
        PARTICLE_NUM = 600, // (max) number of particles to generate
        RADIUS = Math.PI * 2; // radius of particle
    
    var defaultStyles = function() {
        textSize = 140;
        // particle color
        particleColor = 'hsla(0, 0%, 100%, 0.3)'; 

        // color stops
        var gradientStops = { 
            0: '#333333',
            0.5: '#222222'
        };

        // create gradient
        setGradient(gradientStops);
    };
    
    var draw = function(p) {
        ctx.fillStyle = particleColor;
        ctx.beginPath();
        ctx.arc(p.x, p.y, p.size, 0, RADIUS, true);
        ctx.closePath();
        ctx.fill();
    };
    
    var explode = function() {
        for(var i = 0, l = particles.length; i < l; i++) {
            var p = particles[i];

            if(p.inText) {

                var ax = mouse.x - p.px,
                ay = mouse.y - p.py,
                angle = Math.atan2(ay, ax),
                polarity,
                C = Math.cos(angle),
                S = Math.sin(angle);

                // change polarity
                // attract particles if mouse pressed, repel if shift + mousedown
                polarity = (key.shift === true) ? -1 : 1;

                p.x += polarity * (Math.pow((C-1), 2) -1) + p.velocityX * p.delta;
                p.y += polarity * (Math.pow((S-1), 2) -1) + p.velocityY * p.delta;

                // set previous positions
                p.px = p.x;
                p.py = p.y;

                draw(p);
            }
        }
    };

    var getTime = function(amPM) {
        var date = new Date(),
            hours = date.getHours(),
            timeOfDay = '';

        if(amPM) {
            hours = ( hours > 12 ) ? hours -= 12 : hours;
            hours = ( hours == 0 ) ? 12 : hours;
        } else {
            hours = pad(hours);
        }

        var minutes = pad(date.getMinutes());
        var seconds = pad(date.getSeconds());
        return {
            hours: hours,
            minutes: minutes,
            seconds: seconds,
            timeString: hours + " : " + minutes + " : " + seconds
        };
    };

    // animation loop
    var loop = function() {
      
        // clear out text
        ctx.clearRect(0, 0, width, height);

        var time = getTime(true);

        textSize = 140;

        // draw text on canvas
        if(valentine === true) {
            if(msgTime > 0) {
                textSize = 180;
                text = '?';
                msgTime--;
            } else {
                text = time.timeString;
            }
            // valentine-ify it by setting hue to pink
            setStyles(300);

        } else if(updateColor === true && bgGrad === true) {
            // changing color with time
            // @TODO: come up with something better, this is a hacky implementation
            var color = time.hours + time.minutes + time.seconds;
            setStyles(color);
            text = time.timeString;
        } else {
            defaultStyles();
            text = time.timeString;
        }
      
        ctx.fillStyle = "rgb(255, 255, 255)";
        ctx.textBaseline = "middle";
        ctx.font = textSize + "px 'Avenir', 'Helvetica Neue', 'Arial', 'sans-serif'";
        ctx.fillText(text, (width - ctx.measureText(text).width) * 0.5, height * 0.5);

        // copy pixels
        var imgData = ctx.getImageData(0, 0, width, height);
      
        // clear canvas, again
        ctx.clearRect(0, 0, width, height);

        if(bgGrad === true) {
            // draw gradient
            ctx.fillStyle = gradient;
            ctx.fillRect(0, 0, width, height);
        }

        if(press === false) {
            // reset particles
            for(var i = 0, l = particles.length; i < l; i++) {
                var p = particles[i];
                p.inText = false;
            }
            particleText(imgData);
        } else {
            explode();
        }
        FPS.update('fps');
    };

    var pad = function(number) {
        return ('0' + number).substr(-2);
    };

    var particleText = function(imgData) {

        var pxls = [];
        for(var w = width; w > 0; w-=6) {
            for(var h = 0; h < width; h+=6) {
                var index = (w+h*(width))*4;
                if(imgData.data[index] > 10) {
                    pxls.push([w, h]);
                }
            }
        }

        var count = pxls.length;
        for(var i = 0; i < pxls.length && i < particles.length; i++) {
            try {
                var p = particles[i], 
                    X, 
                    Y;
                
                if(quiver) {
                    X = (pxls[count-1][0]) - (p.px + Math.random() * 5);
                    Y = (pxls[count-1][1]) - (p.py + Math.random() * 5);
                } else {
                    X = (pxls[count-1][0]) - p.px;
                    Y = (pxls[count-1][1]) - p.py;
                }
          
                // tangent
                var T = Math.sqrt(X*X + Y*Y);

                // arctangent
                var A = Math.atan2(Y, X);
        .........完整代码请登录后点击上方下载按钮下载查看

网友评论0