<div class="starfield"></div> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> //Скрипт js надо подключать здесь //Автор: Stephen Scaff. @StephenScaff .starfield { height:100%; left:0; position:absolute; top:0; width:100%; z-index:0;} (function ($, window, document, undefined) { // Plugin constructor var Starfield = function (el, options) { this.el = el; this.$el = $(el); this.options = options; that = this; }; var isPlaying; var isInited = false; var canCanvas = false; var animId; // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating // requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel // MIT license (function () { var lastTime = 0; var vendors = ["ms", "moz", "webkit", "o"]; for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { window.requestAnimationFrame = window[vendors[x] + "RequestAnimationFrame"]; window.cancelAnimationFrame = window[vendors[x] + "CancelAnimationFrame"] || window[vendors[x] + "CancelRequestAnimationFrame"]; } if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback, element) { var currTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function () { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) { clearTimeout(id); }; })(); // Plugin prototype Starfield.prototype = { // Default settings defaults: { starColor: "rgba(255,255,255,1)", bgColor: "rgba(0,0,0,1)", mouseMove: true, mouseColor: "rgba(0,0,0,0.2)", mouseSpeed: 200, fps: 15, speed: 3, quantity: 512, ratio: 256, divclass: "starfield" }, // Resize the canvas resizer: function () { var oldStar = this.star; var initW = this.context.canvas.width; var initH = this.context.canvas.height; this.w = this.$el.width(); this.h = this.$el.height(); this.x = Math.round(this.w / 2); this.y = Math.round(this.h / 2); // Check if the device is in portrait orientation this.portrait = this.w < this.h; // Get the ratio of the old height to the new height var ratX = this.w / initW; var ratY = this.h / initH; this.context.canvas.width = this.w; this.context.canvas.height = this.h; // Recalculate the position of each star proportionally to new w and h for (var i = 0; i < this.n; i++) { this.star[i][0] = oldStar[i][0] * ratX; this.star[i][1] = oldStar[i][1] * ratY; this.star[i][3] = this.x + (this.star[i][0] / this.star[i][2]) * this.star_ratio; this.star[i][4] = this.y + (this.star[i][1] / this.star[i][2]) * this.star_ratio; } that.context.fillStyle = that.settings.bgColor; this.context.strokeStyle = this.settings.starColor; }, init: function () { // Get default settings this.settings = $.extend({}, this.defaults, this.options); // Query variables var url = document.location.href; this.n = parseInt( url.indexOf("n=") != -1 ? url.substring( url.indexOf("n=") + 2, url.substring(url.indexOf("n=") + 2, url.length).indexOf("&") != -1 ? url.indexOf("n=") + 2 + url .substring(url.indexOf("n=") + 2, url.length) .indexOf("&") : url.length ) : this.settings.quantity ); this.flag = true; this.test = true; this.w = 0; this.h = 0; this.x = 0; this.y = 0; this.z = 0; this.star_color_ratio = 0; this.star_x_save = 0; this.star_y_save = 0; this.star_ratio = this.settings.ratio; this.star_speed = this.settings.speed; this.star_speed_save = 0; this.star = new Array(this.n); this.color = this.settings.starColor; this.opacity = 0.1; this.cursor_x = 0; this.cursor_y = 0; this.mouse_x = 0; this.mouse_y = 0; this.canvas_x = 0; this.canvas_y = 0; this.canvas_w = 0; this.canvas_h = 0; this.fps = this.settings.fps; // Check for device orientation support this.desktop = !navigator.userAgent.match( /(iPhone|iPod|iPad|Android|BlackBerry|BB10|IEMobile)/ ); this.orientationSupport = window.DeviceOrientationEvent !== undefined; this.portrait = null; // Inject the canvas element var canvasInit = function () { that.w = that.$el.width(); that.h = that.$el.height(); that.initW = that.w; that.initH = that.h; that.portrait = that.w < that.h; that.wrapper = $("<canvas />").addClass(that.settings.divclass); that.wrapper.appendTo(that.el); that.starz = $("canvas", that.el); if (that.starz[0].getContext) { // Can canvas? that.context = that.starz[0].getContext("2d"); canCanvas = true; } that.context.canvas.width = that.w; that.context.canvas.height = that.h; }; canvasInit(); // Create initial star array and canvas context var starInit = function () { // Get context for the canvas element if (canCanvas) { // Check for canvas drawering abilities. that.x = Math.round(that.w / 2); that.y = Math.round(that.h / 2); that.z = (that.w + that.h) / 2; that.star_color_ratio = 1 / that.z; that.cursor_x = that.x; that.cursor_y = that.y; // Big bang for (var i = 0; i < that.n; i++) { that.star[i] = new Array(5); that.star[i][0] = Math.random() * that.w * 2 - that.x * 2; that.star[i][1] = Math.random() * that.h * 2 - that.y * 2; that.star[i][2] = Math.round(Math.random() * that.z); that.star[i][3] = 0; that.star[i][4] = 0; } // Set the colors that.context.fillStyle = that.settings.bgColor; that.context.strokeStyle = that.settings.starColor; } else { return; } }; starInit(); isInited = true; }, // Iterate over every star on the field and move it slightly anim: function () { this.mouse_x = this.cursor_x - this.x; this.mouse_y = this.cursor_y - this.y; this.context.fillRect(0, 0, this.w, this.h); for (var i = 0; i < this.n; i++) { this.test = true; this.star_x_save = this.star[i][3]; this.star_y_save = this.star[i][4]; this.star[i][0] += this.mouse_x >> 4; // X coords if (this.star[i][0] > this.x << 1) { this.star[i][0] -= this.w << 1; this.test = false; } if (this.star[i][0] < -this.x << 1) { this.star[i][0] += this.w << 1; this.test = false; } // Y coords this.star[i][1] += this.mouse_y >> 4; if (this.star[i][1] > this.y << 1) { this.star[i][1] -= this.h << 1; this.test = false; } if (this.star[i][1] < -this.y << 1) { this.star[i][1] += this.h << 1; this.test = false; } // Z coords this.star[i][2] -= this.star_speed; if (this.star[i][2] > this.z) { this.star[i][2] -= this.z; this.test = false; } if (this.star[i][2] < 0) { this.star[i][2] += this.z; this.test = false; } this.star[i][3] = this.x + (this.star[i][0] / this.star[i][2]) * this.star_ratio; this.star[i][4] = this.y + (this.star[i][1] / this.star[i][2]) * this.star_ratio; if ( this.star_x_save > 0 && this.star_x_save < this.w && this.star_y_save > 0 && this.star_y_save < this.h && this.test ) { this.context.lineWidth = (1 - this.star_color_ratio * this.star[i][2]) * 2; this.context.beginPath(); this.context.moveTo(this.star_x_save, this.star_y_save); this.context.lineTo(this.star[i][3], this.star[i][4]); this.context.stroke(); this.context.closePath(); } } }, loop: function () { this.anim(); animId = window.requestAnimationFrame(function () { that.loop(); }); }, move: function () { var doc = document.documentElement; if (this.orientationSupport && !this.desktop) { //$('<p class="output"></p>').prependTo('.content'); //var output = document.querySelector('.output'); window.addEventListener("deviceorientation", handleOrientation, false); } else { window.addEventListener("mousemove", handleMousemove, false); } function handleOrientation(event) { if (event.beta !== null && event.gamma !== null) { var x = event.gamma, y = event.beta; if (!that.portrait) { x = event.beta * -1; y = event.gamma; } that.cursor_x = that.w / 2 + x * 5; that.cursor_y = that.h / 2 + y * 5; /*var output = document.querySelector('.output'); output.innerHTML = "rotZ : " + Math.round(event.alpha) + "<br />\n"; output.innerHTML += "rotX: " + Math.round(event.beta) + "<br />\n"; output.innerHTML += "rotY: " + Math.round(event.gamma) + "<br />\n";*/ } } function handleMousemove(event) { that.cursor_x = event.pageX || event.clientX + doc.scrollLeft - doc.clientLeft; that.cursor_y = event.pageY || event.clientY + doc.scrollTop - doc.clientTop; } }, stop: function () { window.cancelAnimationFrame(animId); isPlaying = false; }, // this.start this whole thing start: function () { // Initialize if (!isInited) { isInited = true; this.init(); } // Start the animation loop if (!isPlaying) { isPlaying = true; this.loop(); } window.addEventListener( "resize", function () { that.resizer(); }, false ); window.addEventListener( "orientationchange", function () { that.resizer(); }, false ); // Move stars on mouse move if (this.settings.mouseMove) { this.move(); } return this; } }; Starfield.defaults = Starfield.prototype.defaults; // Finally, the actual plugin code $.fn.starfield = function (options) { return this.each(function () { new Starfield(this, options).start(); }); }; window.Starfield = Starfield; })(jQuery, window, document); $(".starfield").starfield(); Навигация по записям Snow animation Glowing text animation