Skip to content

Instantly share code, notes, and snippets.

@jhnsnc
Created August 11, 2016 03:46
Show Gist options
  • Save jhnsnc/3862073483c13ae8d47e32d41c77e0f6 to your computer and use it in GitHub Desktop.
Save jhnsnc/3862073483c13ae8d47e32d41c77e0f6 to your computer and use it in GitHub Desktop.
// Written by Chris Johnson
// 2013-07-21
// Assumes jQuery is available as `$`
/*
* USAGE
* spritify($(element), { //should already have spritesheet set as background
* spriteSheetWidth: 300, //width of spritesheet
* spriteSheetHeight: 150, //height of spritesheet
* offsetX: 0, //offset applied to each frame
* offsetY: 50, //offset applied to each frame
* numFrames: 6,
* frameRate: 40,
* mouseTarget: $(hoverTarget) //advances animation while hovering / reverses while unhovered
* });
*/
var spritify = function(el, options) {
if ( typeof el === 'undefined' ||
typeof options === 'undefined' ||
typeof options.spriteSheetWidth === 'undefined' || isNaN(options.spriteSheetWidth) ||
typeof options.spriteSheetHeight === 'undefined' || isNaN(options.spriteSheetHeight)
) {
return false;
}
if (typeof options === 'undefined') {
options = {};
}
//set defaults
if (typeof options.offsetX === 'undefined' || isNaN(options.offsetX)) {
options.offsetX = 0;
}
if (typeof options.offsetY === 'undefined' || isNaN(options.offsetY)) {
options.offsetY = 0;
}
if (typeof options.frameWidth === 'undefined' || isNaN(options.frameWidth)) {
options.frameWidth = $(el).outerWidth();
}
if (typeof options.frameHeight === 'undefined' || isNaN(options.frameHeight)) {
options.frameHeight = $(el).outerHeight();
}
if (typeof options.numFrames === 'undefined' || isNaN(options.numFrames)) {
options.numFrames = Math.floor((options.spriteSheetWidth - options.offsetX) / options.frameWidth) * Math.floor((options.spriteSheetHeight - options.offsetY) / options.frameHeight);
}
if (typeof options.frameRate === 'undefined' || isNaN(options.frameRate)) {
options.frameRate = 30;
}
if (typeof options.mouseTarget === 'undefined') {
options.mouseTarget = $(el);
}
//init sprite
if (typeof options.spriteSheetPath !== 'undefined') {
$(el).css('background-image', "url("+options.spriteSheetPath+")");
}
var currentFrame = 1;
var numCols = (options.spriteSheetWidth - options.offsetX) / options.frameWidth;
var numRows = (options.spriteSheetHeight - options.offsetY) / options.frameHeight;
var interval = null;
update();
//utility functions
function update() {
var x = (options.frameWidth * ((currentFrame - 1) % numCols)) + options.offsetX;
var y = (options.frameHeight * Math.floor((currentFrame -1 ) / numCols)) + options.offsetY;
$(el).css('background-position', ("" + (-x) + "px " + (-y) + "px") );
}
function unsetActiveInterval() {
if (interval) {
interval = clearInterval(interval);
}
}
var hoverMethod = function() {
unsetActiveInterval();
interval = setInterval(function() {
if (currentFrame < options.numFrames) {
currentFrame += 1;
update();
} else {
unsetActiveInterval();
}
}, 1000/options.frameRate);
};
var unhoverMethod = function() {
unsetActiveInterval();
interval = setInterval(function() {
if (currentFrame > 1) {
currentFrame -= 1;
update();
} else {
unsetActiveInterval();
}
}, 1000/options.frameRate);
};
$(options.mouseTarget).hover(hoverMethod, unhoverMethod);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment