Created by Martin Angelov on Mar 9th, 2010
        
When  designing a product page, it is often necessary to present a number of  images in a succession, also known as a slideshow. With the raise of the  jQuery library and its numerous plugins, there is an abundance of  ready-made solutions which address this problem. However, to make a  lasting impression to your visitors, you need to present them with  something they have not seen before.
Today we are making a jQuery & CSS mosaic gallery. Mosaic,  because it will feature an interesting tile transition effect when  moving from one slide to another.
Step 1 – XHTML
The mosaic effect of the slideshow is achieved by dividing the  original image into smaller parts. These tiles, which contain parts of  the image, are sequentially hidden from view, which causes the effect.  The markup of the slideshow is pretty straightforward. It consists of  the main slideshow container element (
#mosaic-slideshow), a left and right arrow for previous and next transition and the mosaic-slide div, which is inserted by jQuery at run-time.
demo.html
01 | <div id="mosaic-slideshow"> | 
02 |     <div class="arrow left">div> | 
03 |     <div class="arrow right">div> | 
05 |     <div class="mosaic-slide" style="z-index: 10;"> | 
08 |         <div class="tile" style="...">div> | 
09 |         <div class="tile" style="...">div> | 
10 |         <div class="tile" style="...">div> | 
11 |         <div class="tile" style="...">div> | 
The div with the 
mosaic-slide class name is added to the page by jQuery after the
 transition() JavaScript function is executed (we will come back to this in the third step). Inside it you can see the 
tile divs. There are a total of 56 such divs, each of which has a 60px by 60px portion of the slide image set as its background.

Mosaic Slideshow
Step 2 – CSS
To make this effect work (and most importantly look good), we have to  add a few lines of CSS. Only the code directly used by the gallery is  shown here. You can see the code that styles the rest of the  demonstration page in 
styles.css.
styles.css – Part 1
15 |     border:10px solid #555; | 
18 |     -moz-border-radius:20px; | 
19 |     -webkit-border-radius:20px; | 
28 |     border:1px solid #555; | 
29 |     border-width:0 1px 1px 0; | 
30 |     background-color:#555; | 
The slideshow is contained inside the div with an ID of 
mosaic-slideshow  (or #mosaic-slideshow, if we refer to it in a form of a CSS / jQuery  selector).  There can be only one such div in the page, hence the use of  an ID attribute.
However there can be more than one 
mosaic-slide divs  in the page. The effect itself is achieved by stacking two slides on  top of each other and hiding the tiles of the first one to reveal the  ones of the second. This is why we are using a class name instead of an  ID.
Some of the more interesting rules presented here are the three CSS3  rules for rounded corners. As the CSS3 standard is still a work in  progress, browsers don’t support the regular 
border-radius property yet (except for the new 10.50 version of Opera), and need vendor-specific prefixes to recognize it. The
 -moz- prefix is used by Firefox, and 
-webkit- is used by Safari and Chrome.
styles.css – Part 2
05 |     background:url("img/arrows.png") no-repeat; | 
14 |     background-position:center top; | 
18 |     background-position:center -70px; | 
23 |     background-position:center -140px; | 
27 |     background-position:center -210px; | 
The 
arrow class is shared by the previous and next  arrows. They do need individual styling in addition to this common rule,  so we add it after this. We are also using a CSS sprite as the  background for the arrow divs. It contains a regular and hover state for  both arrows, which spares us from having to use four individual images.
“CSS spriting” is a widespread technique  used by web designers. It allows the designer to join multiple smaller  images into a single larger one, called a sprite, which is downloaded  faster and saves the web server from multiple download requests. After  this, the designer can use the CSS background property in conjunction  with setting the elements to a fixed size, to show only the part of the  sprite image that they need.

Mosaic Slideshow
Step 3 – jQuery
After including the jQuery library to the page, we can move on to  creating the script that will make the slideshow tick. To achieve the  mosaic effect, the script defines 4 functions:
- transition() – this function makes an animated  transition between the currently shown slide, and a new one specified by  the id parameter. It works by positioning the new slide we want to  show, below the current one, and then hiding the current one one tile at  a time;
 
- generateGrid() – this function is used by  transition() to generate a grid of tiles. Each tile contains a part of  the slide image as its background;
 
- next() – detects which the next slide is and runs the transition() function with its index;
 
- prev() – analogous to next().
 
script.js – Part 1
02 | var slides = new Array('img/slide_1.jpg', | 
08 | $(document).ready(function(){ | 
11 |     $('.arrow.left').click(function(){ | 
18 |     $('.arrow.right').click(function(){ | 
27 |         (new Image()).src=slides[i]; | 
37 |     auto=setInterval(function(){ | 
The 
$(document).ready() method is executed once the  page has finished loading. This will ensure that all the divs and other  elements are accessible to the script. Inside it we bind a function for  the click event on the previous and next arrows, preload all the images,  show the first slide (otherwise the slideshow would be empty) and set  up the auto-advance interval.
script.js – Part 2
02 | function transition(id) | 
06 |     if(!slides[id-1]) return false; | 
11 |         if(current.id == id) return false; | 
14 |         current.layer.css('z-index',10); | 
17 |         $('.mosaic-slide').not(current.layer).remove(); | 
21 |     var newLayer = $('').html(generateGrid({rows:7,cols:8,image:slides[id-1]}));  | 
24 |     newLayer.css('z-index',1); | 
26 |     $('#mosaic-slideshow').append(newLayer); | 
31 |         $('.tile',current.layer).each(function(i){ | 
33 |             setTimeout(function(){ | 
34 |                 tile.css('visibility','hidden'); | 
41 |     current.layer = newLayer; | 
The transition function uses the global 
current  object to store the id of the currently shown slide, and a reference to  the current slide div. This is later used to remove leftover slides and  prevent a transition from occurring if the same slide as the currently  active one is to be shown.
Notice how we use the each method on line 31 to loop through the tiles of the current slide and schedule them to be hidden in 
i*10 milliseconds in the future. As 
i is incremented for every tile, this mean that they are hidden 10 milliseconds apart from one another.

Slide Transition
script.js – Part 3
05 |         transition(current.id%slides.length+1); | 
13 |         transition((current.id+(slides.length-2))%slides.length+1); | 
19 | var tabwidth=60, tabheight=60; | 
21 | function generateGrid(param) | 
35 |                         "background":'#555 url('+param.image+') no-repeat '+(-j*tabwidth)+'px '+(-i*tabheight)+'px' | 
The parameter passed to 
generateGrid() is an object  containing the rows and the columns we want to be generated, as well as  the image to be set as the background of the tiles. While generating the  tiles, the background image is offset according to the current position  of the tile in the row and in the column. Finally the tile is added to  an empty jQuery object which is returned at the end.
With this the mosaic slideshow is complete!
Wrapping it up
Today we created a slideshow with an animated mosaic transition  effect. You can modify it to include a different number of rows and  columns or change the way slides are changed entirely.
Postado por Fernando Schimit - Fox Creative