jQuery: image division, explosion and the like

Dividing an image with jQuery simply means that you have to create several elements which contain a different part of the image set as their background image and shown via the background-position property. So here's a simple (simple indeed!) plugin which, given the number of parts, their dimensions, the animation speed and an array of background coordinates, divides an image.

(function($) {

	$.fn.divide = function(options) {
	
		var that = this;
		
		var settings = {
		
			parts: 4,
			speed: 1000,
			partWidth: 300,
			partHeight: 225,
			positions: ['0px 0px', '-150px 0px', '0px -150px', '-150px -150px']
		
		};
		
		options = $.extend(settings, options);
		
		var img = $('img', that);
		var imgWidth = img.width();
		var imgHeight = img.height();
		var imgSrc = img.attr('src');
		
		var wrapper = $('<div id="wrapper"></div>');
		wrapper.css({
			width: imgWidth,
			height: imgHeight,
			position: 'absolute',
			zIndex: 100,
			overflow: 'hidden',
			top: 0,
			left: 0
		}).appendTo(that);
		
		

				
		return that.each(function() {
		
		    var index = -1;
		
			for(var i = 0; i < options.parts; i += 1) {
			
			index++;
					
					
		    $('<div class="block"></div>').css({
				width: options.partWidth - 4,
				height: options.partHeight - 4,
		  	   'float': 'left',
			    backgroundImage: 'url(' + imgSrc + ')',
			    backgroundRepeat: 'no-repeat',
			    backgroundPosition: options.positions[index],
			    border: '2px solid #fff',
			    cursor: 'pointer'
			}).appendTo('#wrapper').hide();
					
					
		   }
		   
		  setTimeout(function() {
		
		   img.animate({
		   		width: '+=50px',
		   		height: '+=50px',
		   		opacity: 'hide'
		   }, options.speed, function() {
		   
		   		$('div.block').show();
		   		
		   		$('div.block').each(function(i) {
		   		
		   			var $div = $(this);
		   			$div.attr('title', 'Parte ' + (i + 1));
		   			
		   			$div.hover(function() {
		   			
		   			  $div.stop(true, true).
		   			  animate({
		   			  	opacity: 0.7
		   			  }, options.speed);
		   			
		   			
		   			
		   			}, function() {
		   			
		   			   $div.stop(true, true).
		   			  animate({
		   			  	opacity: 1
		   			  }, options.speed);
		   			

		   			
		   			
		   			});
		   		
		   		
		   		});
		   
		   });
		   
		   }, options.speed);
					
		});
		
		
	
	};

})(jQuery);

An example:

$(function() {

  $('#divide').one('click', function(event) {

	$('#image').divide({speed: 500});
	
	event.preventDefault();
	
  });

});

You can see the demo below.

Demo

Live demo

This entry was posted in by Gabriele Romanato. Bookmark the permalink.

Leave a Reply

Note: Only a member of this blog may post a comment.