Image carousel

Adesso creeremo un carosello di immagini scrollabili

Prima di tutto scriviamo un po' di HTML:


<div id="featured-books">
<div class="covers">
<a href="../covers/medium/1847190871.jpg" title="Community Server Quickly">
<img src="../covers/medium/1847190871.jpg" width="120" height="148" alt="Community Server Quickly" />
<span class="price">$35.99</span> </a>
<a href="../covers/medium/1847190901.jpg" title="Deep Inside osCommerce: The Cookbook">
<img src="../covers/medium/1847190901.jpg" width="120" height="148" alt="Deep Inside osCommerce: The Cookbook" />
<span class="price">$44.99</span>
</a>
<a href="../covers/medium/1847190979.jpg" title="Learn OpenOffice.org Spreadsheet Macro Programming: OOoBasic and Calc automation">
<img src="../covers/medium/1847190979.jpg" width="120" height="148" alt="Learn OpenOffice.org Spreadsheet Macro Programming:
OOoBasic and Calc automation" />
<span class="price">$35.99</span>
</a>
<a href="../covers/medium/1847190987.jpg" title="Microsoft AJAX C# Essentials: Building Responsive ASP.NET 2.0 Applications">
<img src="../covers/medium/1847190987.jpg" width="120" height="148"
alt="Microsoft AJAX C# Essentials: Building Responsive ASP.NET 2.0 Applications" />
<span class="price">$31.99</span>
</a>
<a href="../covers/medium/1847191002.jpg" title="Google Web Toolkit GWT Java AJAX Programming">
<img src="../covers/medium/1847191002.jpg" width="120" height="148" alt="Google Web Toolkit GWT Java AJAX Programming" />
<span class="price">$40.49</span>
</a>
<a href="../covers/medium/1847192386.jpg" title="Building Websites with Joomla! 1.5 Beta 1">
<img src="../covers/medium/1847192386.jpg" width="120" height="148" alt="Building Websites with Joomla! 1.5 Beta 1" />
<span class="price">$40.49</span>
</a>
</div>
</div>

Vogliamo avere uno scroll che mostri sempre tre soli risultati. Prima facciamone una versione funzionante con solo CSS:

CSS code:

#featured-books {
  position: relative;
  background: #ddd;
  width: 440px;
  height: 186px;
  overflow: scroll;
  margin: 1em auto;
  padding: 0;
  text-align: center;
  z-index: 2;
}
#featured-books .covers {
  position: relative;
  width: 840px;
  z-index: 1;
}
#featured-books a {
  float: left;
  margin: 10px;
  height: 146px;
}
#featured-books .price {
  display: none;
}

Abbiamo dato una grandezza fissa al contenitore #featured-books ed una proprietà overflow: scroll;, che scrolla l'eccedenza del contenuto in orizzontale

Ed ecoo il nostro widget: Image carousel step 1



Facciamo tutto più bello con javascript. Prima di tutto eliminiamo la scrollbar

Javascript code:


$(document).ready(function() {
var spacing = 140;
$('#featured-books').css({
'width': spacing * 3,
'height': '166px',
'overflow': 'hidden'
}).find('.covers a').css({
'float': 'none',
'position': 'absolute',
'left': 1000
});
var $covers = $('#featured-books .covers a');
$covers.eq(0).css('left', 0);
$covers.eq(1).css('left', spacing);
$covers.eq(2).css('left', spacing * 2);
});

Quindi:

Ed ecoo il nostro widget: Image carousel step 2



Adesso dobbiamo farle muovere. Per ora cliccheremo sull'immagine di destra o di sinistra per visualizzare l'immagine successiva

Javascript code:

$(document).ready(function() {
var spacing = 140;
$('#featured-books').css({
'width': spacing * 3,
'height': '166px',
'overflow': 'hidden'
}).find('.covers a').css({
'float': 'none',
'position': 'absolute',
'left': 1000
});
var setUpCovers = function() {
var $covers = $('#featured-books .covers a');
$covers.unbind('click');
// Left image; scroll right (to view images on left) when clicked.
$covers.eq(0).css('left', 0).click(function(event) {
$covers.eq(2).css('left', 1000);
$covers.eq($covers.length - 1).prependTo('#featured-books .covers'); setUpCovers(); event.preventDefault(); }); // Right image; scroll left (to view images on right) when clicked. $covers.eq(2).css('left', spacing * 2).click(function(event) { $covers.eq(0).css('left', 1000); $covers.eq(0).appendTo('#featured-books .covers'); setUpCovers(); event.preventDefault(); }); // Center image. $covers.eq(1).css('left', spacing); }; setUpCovers(); });

Analizziamo il codice:

Ed ecco il nostro widget: Image carousel step 3



Aggiungiamoci un effetto di slide

Javascript code:

  $(document).ready(function() {
var spacing = 140;
$('#featured-books').css({
'width': spacing * 3,
'height': '166px',
'overflow': 'hidden'
}).find('.covers a').css({
'float': 'none',
'position': 'absolute',
'left': 1000
});

var setUpCovers = function() {
var $covers = $('#featured-books .covers a');
$covers.unbind('click');
// Left image; scroll right (to view images on left) when clicked.
$covers.eq(0).css('left', 0).click(function(event) {
$covers.eq(0).animate({'left': spacing}, 'fast');
$covers.eq(1).animate({'left': spacing * 2}, 'fast');
$covers.eq(2).animate({'left': spacing * 3}, 'fast');
$covers.eq($covers.length - 1).css('left', -spacing).animate({
'left': 0}, 'fast', function() {
$(this).prependTo('#featured-books .covers');
setUpCovers();
});
event.preventDefault();
});
// Right image; scroll left (to view images on right) when clicked.
$covers.eq(2).css('left', spacing * 2).click(function(event) {
$covers.eq(0).animate({'left': -spacing}, 'fast', function() {
$(this).appendTo('#featured-books .covers');
setUpCovers();
});
$covers.eq(1).animate({'left': 0}, 'fast');
$covers.eq(2).animate({'left': spacing}, 'fast');
$covers.eq(3).css('left', spacing * 3).animate({
'left': spacing * 2}, 'fast');
event.preventDefault();
});

// Center image.
$covers.eq(1).css('left', spacing);
};
setUpCovers();
});

Ed ecco il nostro widget: Image carousel step 4



Adesso creiamo una thickbox personalizzata. Quando cliccheremo sull'immagine centrale visualizzeremo l'immagine in grande formato e prevederemo che cliccandoci sopra questa vada in fadeOut:

Javascript code:


$(document).ready(function() {
var spacing = 140;

var $enlargedCover = $('<img/>')
.addClass('enlarged')
.hide()
.appendTo('body'); [...]

CSS code: img.enlarged { position: absolute; z-index: 5; cursor: pointer; }

Dopo aver creato un elemento nascosto img:

Javascript code:


$covers.eq(1).css('left', spacing).click(function(event) {
$enlargedCover.attr('src', $(this).attr('href')).css({
'left': ($('body').width() - 360) / 2,
'top' : 100,
'width': 360,
'height': 444
}).show().one('click', function() {
$enlargedCover.fadeOut();
});
event.preventDefault();
}) [...]

Analizziamo il codice:

Ed ecco il nostro widget: Image carousel step 5