<!DOCTYPE html> <html lang="en"> <head> </head> <body> <span class="js-cursor-container"></span> <script> (function fairyDustCursor() { var possibleColors = ["#D61C59", "#E7D84B", "#1B8798"] var width = window.innerWidth; var height = window.innerHeight; var cursor = { x: width / 2, y: width / 2 }; var particles = []; function init() { bindEvents(); loop(); } // Bind events that are needed function bindEvents() { document.addEventListener('mousemove', onMouseMove); window.addEventListener('resize', onWindowResize); } function onWindowResize(e) { width = window.innerWidth; height = window.innerHeight; } function onMouseMove(e) { cursor.x = e.clientX; cursor.y = e.clientY; addParticle(cursor.x, cursor.y, possibleColors[Math.floor(Math.random() * possibleColors.length)]); } function addParticle(x, y, color) { var particle = new Particle(); particle.init(x, y, color); particles.push(particle); } function updateParticles() { // Updated for (var i = 0; i < particles.length; i++) { particles[i].update(); } // Remove dead particles for (var i = particles.length - 1; i >= 0; i--) { if (particles[i].lifeSpan < 0) { particles[i].die(); particles.splice(i, 1); } } } function loop() { requestAnimationFrame(loop); updateParticles(); } /** * Particles */ function Particle() { this.character = "*"; this.lifeSpan = 120; //ms this.initialStyles = { "position": "fixed", "display": "inline-block", "top": "0px", "left": "0px", "pointerEvents": "none", "touch-action": "none", "z-index": "10000000", "fontSize": "25px", "will-change": "transform" }; // Init, and set properties this.init = function (x, y, color) { this.velocity = { x: (Math.random() < 0.5 ? -1 : 1) * (Math.random() / 2), y: 1 }; this.position = { x: x + 10, y: y + 10 }; this.initialStyles.color = color; this.element = document.createElement('span'); this.element.innerHTML = this.character; applyProperties(this.element, this.initialStyles); this.update(); document.querySelector('.js-cursor-container').appendChild(this.element); }; this.update = function () { this.position.x += this.velocity.x; this.position.y += this.velocity.y; this.lifeSpan--; this.element.style.transform = "translate3d(" + this.position.x + "px," + this.position.y + "px, 0) scale(" + (this.lifeSpan / 120) + ")"; } this.die = function () { this.element.parentNode.removeChild(this.element); } } /** * Utils */ // Applies css `properties` to an element. function applyProperties(target, properties) { for (var key in properties) { target.style[key] = properties[key]; } } if (!('ontouchstart' in window || navigator.msMaxTouchPoints)) init(); })(); </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>粒子随心动画</title> <script src="http://cdn.sucai8.cn/cdn/jquery/jquery-1.10.2.js"></script> <style> body { overflow: hidden; margin: 0; } .twitter:hover a { transform: rotate(-45deg) scale(1.05); } .twitter:hover i { color: #21c2ff; } .twitter a { bottom: -40px; right: -75px; transform: rotate(-45deg); } .twitter i { bottom: 7px; right: 7px; color: #00aced; } .social-icon a { position: absolute; background: white; color: white; box-shadow: -1px -1px 20px 0px rgba(0, 0, 0, 0.3); display: inline-block; width: 150px; height: 80px; transform-origin: 50% 50%; transition: 0.15s ease-out; } .social-icon i { position: absolute; pointer-events: none; z-index: 1000; transition: 0.15s ease-out; } .youtube:hover a { transform: rotate(45deg) scale(1.05); } .youtube:hover i { color: #ec4c44; } .youtube a { bottom: -40px; left: -75px; transform: rotate(45deg); } .youtube i { bottom: 7px; left: 7px; color: #e62117; } </style> </head> <body> <canvas></canvas> <script> "use strict"; // Initial Setup var canvas = document.querySelector("canvas"); var c = canvas.getContext("2d"); canvas.width = innerWidth; canvas.height = innerHeight; // Variables var mouse = { x: innerWidth / 2, y: innerHeight / 2 - 80, }; var colors = ["#00bdff", "#4d39ce", "#088eff"]; // Event Listeners addEventListener("mousemove", function (event) { mouse.x = event.clientX; mouse.y = event.clientY; }); addEventListener("resize", function () { canvas.width = innerWidth; canvas.height = innerHeight; init(); }); // Utility Functions function randomIntFromRange(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); } function randomColor(colors) { return colors[Math.floor(Math.random() * colors.length)]; } // Objects function Particle(x, y, radius, color) { var _this = this; var distance = randomIntFromRange(50, 120); this.x = x; this.y = y; this.radius = radius; this.color = color; this.radians = Math.random() * Math.PI * 2; this.velocity = 0.05; this.distanceFromCenter = { x: distance, y: distance, }; this.prevDistanceFromCenter = { x: distance, y: distance, }; this.lastMouse = { x: x, y: y }; this.update = function () { var lastPoint = { x: _this.x, y: _this.y }; // Move points over time _this.radians += _this.velocity; // Drag effect _this.lastMouse.x += (mouse.x - _this.lastMouse.x) * 0.05; _this.lastMouse.y += (mouse.y - _this.lastMouse.y) * 0.05; // Circular Motion _this.distanceFromCenter.x = _this.prevDistanceFromCenter.x + Math.sin(_this.radians) * 100; _this.distanceFromCenter.y = _this.prevDistanceFromCenter.x + Math.sin(_this.radians) * 100; _this.x = _this.lastMouse.x + Math.cos(_this.radians) * _this.distanceFromCenter.x; _this.y = _this.lastMouse.y + Math.sin(_this.radians) * _this.distanceFromCenter.y; _this.draw(lastPoint); }; this.draw = function (lastPoint) { c.beginPath(); c.strokeStyle = _this.color; c.lineWidth = _this.radius; c.moveTo(lastPoint.x, lastPoint.y); c.lineTo(_this.x, _this.y); c.stroke(); c.closePath(); }; } // Implementation var particles = undefined; function init() { particles = []; for (var i = 0; i < 50; i++) { var radius = Math.random() * 2 + 1; particles.push( new Particle( canvas.width / 2, canvas.height / 2, radius, randomColor(colors) ) ); } } // Animation Loop function animate() { requestAnimationFrame(animate); c.fillStyle = "rgba(255, 255, 255, 0.05)"; c.fillRect(0, 0, canvas.width, canvas.height); particles.forEach(function (particle) { particle.update(); }); } init(); animate(); </script> </body> </html>
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <title>star</title> <script type="text/javascript"> window.onload = function () { C = Math.cos; // cache Math objects S = Math.sin; U = 0; w = window; j = document; d = j.getElementById("c"); c = d.getContext("2d"); W = d.width = w.innerWidth; H = d.height = w.innerHeight; c.fillRect(0, 0, W, H); // resize <canvas> and draw black rect (default) c.globalCompositeOperation = "lighter"; // switch to additive color application c.lineWidth = 0.2; c.lineCap = "round"; var bool = 0, t = 0; // theta d.onmousemove = function (e) { if(window.T) { if(D==9) { D=Math.random()*15; f(1); } clearTimeout(T); } X = e.pageX; // grab mouse pixel coords Y = e.pageY; a=0; // previous coord.x b=0; // previous coord.y A = X, // original coord.x B = Y; // original coord.y R=(e.pageX/W * 999>>0)/999; r=(e.pageY/H * 999>>0)/999; U=e.pageX/H * 360 >>0; D=9; g = 360 * Math.PI / 180; T = setInterval(f = function (e) { // start looping spectrum c.save(); c.globalCompositeOperation = "source-over"; // switch to additive color application if(e!=1) { c.fillStyle = "rgba(0,0,0,0.02)"; c.fillRect(0, 0, W, H); // resize <canvas> and draw black rect (default) } c.restore(); i = 25; while(i --) { c.beginPath(); if(D > 450 || bool) { // decrease diameter if(!bool) { // has hit maximum bool = 1; } if(D < 0.1) { // has hit minimum bool = 0; } t -= g; // decrease theta D -= 0.1; // decrease size } if(!bool) { t += g; // increase theta D += 0.1; // increase size } q = (R / r - 1) * t; // create hypotrochoid from current mouse position, and setup variables (see: http://en.wikipedia.org/wiki/Hypotrochoid) x = (R - r) * C(t) + D * C(q) + (A + (X - A) * (i / 25)) + (r - R); // center on xy coords y = (R - r) * S(t) - D * S(q) + (B + (Y - B) * (i / 25)); if (a) { // draw once two points are set c.moveTo(a, b); c.lineTo(x, y) } c.strokeStyle = "hsla(" + (U % 360) + ",100%,50%,0.75)"; // draw rainbow hypotrochoid c.stroke(); a = x; // set previous coord.x b = y; // set previous coord.y } U -= 0.5; // increment hue A = X; // set original coord.x B = Y; // set original coord.y }, 16); } j.onkeydown = function(e) { a=b=0; R += 0.05 } d.onmousemove({pageX:300, pageY:290}) } </script> </head> <body style="margin:0px;padding:0px;width:100%;height:100%;overflow:hidden;"> <canvas id="c"></canvas> </body> </html>