jQuery slider

  • Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed rutrum imperdiet dignissim. Sed ut tristique dui. Phasellus risus ante, malesuada at aliquam ac, consectetur ac diam. In lacinia neque eu nibh rutrum volutpat. Nullam faucibus, elit vitae varius consectetur, dui augue sollicitudin est, sed dictum enim orci nec mi. Suspendisse vitae velit ut ante suscipit viverra eget nec est. Nam cursus molestie scelerisque. Nulla est tellus, vulputate ac tempus sed, posuere ac nibh. Integer ornare accumsan mattis. Pellentesque pellentesque dui vel sem dapibus pharetra. Mauris sagittis, lectus nec feugiat fringilla, mauris magna pretium neque, ut molestie metus lectus eget metus. Nam at sem nulla, eget accumsan ante. Phasellus volutpat feugiat pulvinar. Pellentesque sed diam nec massa fringilla laoreet nec vitae lectus. Sed est est, placerat non vulputate quis, dictum eu felis. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Inleiding

In deze jQuery tutorial zal ik uitleggen hoe je zelf de bovenstaande jQuery slider kunt maken. Deze sliders worden vaak gebruik op de homepage van een website, bijvoorbeeld om producten te tonen. Eventueel kan de snelheid ook aangepast worden, of een pause knop.

De CSS

Het lastige bij het opzetten van een jQuery slider is het goed indelen van de HTML/CSS. In het kort komt het hier op neer: Een div element met daarin een ul element. Dit ul element krijgt een breedte die groter is dat het aantal dia's bij elkaar kunnen worden. Vervolgens krijgen alle li elementen een float mee. De CSS ziet er zo uit:

  1. div#slider {
  2.         width: 800px;
  3.         overflow: hidden;
  4.         position: relative;
  5.         border: 1px dotted #000;
  6. }
  7. div#slider ul {
  8.         padding: 0;
  9.         margin: 0;
  10.         list-style: none;
  11.         width: 6400px;
  12.         height: 200px;
  13.         position: relative;
  14. }
  15. div#slider ul li {
  16.         height: 200px;
  17.         width: 798px;
  18.         border: 1px solid #000;
  19.         float: left;
  20.         overflow: hidden;
  21. }

De bijbehorende HTML ziet er als volgt uit:

  1. <div id="slider">
  2.         <ul>
  3.                 <li>
  4.                         Dia 1
  5.                 </li>
  6.                 <li>
  7.                         Dia 2
  8.                 </li>
  9.                 <li>
  10.                         Dia 3
  11.                 </li>
  12.                 <li>
  13.                         Dia 4
  14.                 </li>
  15.                 <li>
  16.                         Dia 5
  17.                 </li>
  18.         </ul>
  19. </div>

Het aantal dia's kan uiteraard vergroot worden.

jQuery

Omdat de jQuery code bij deze slider snel rommelig wordt, heb ik ervoor gekozen om gebruik te maken van een javascript object. Bij een object kunnen verschillende elementen en functies aan één object gehangen worden. Het gebruikte element heet, hoe verassend, slider.

Bij dit object maak ik gebruik van 2 functie's: 1 functie voor het aanroepen van de setInterval functie, en 1 functie voor het daadwerkelijk laten sliden van de dia's. De functie die setInterval aanroept heet start, en is vrij eenvoudig:

  1. start: function() {
  2.         $interval = setInterval( function () {
  3.                 $slider.slide();
  4.         }, $slider.slideSpeed);
  5. }

De functie voor het laten sliden zit wat lastiger in elkaar. De code ziet er als volgt uit:

  1. slide: function () {
  2.         // Kijk welke dia er geselecteerd is. Wanneer de laatste is geselecteerd opnieuw beginnen
  3.         $slider.currentFrame = ($slider.currentFrame >= $("div#slider ul li").length ? 1 : $slider.currentFrame+1);
  4.        
  5.         // Dit stukje zorgt voor het daadwerkelijk laten sliden van de dia's.
  6.         $("div#slider ul").animate({
  7.                 left: ( '-' + $("div#slider ul li:eq(" + ($slider.currentFrame-1) + ")").position().left )
  8.         }, $slider.animateSpeed);
  9. }

Meestal wordt voor het bepalen van de afstand $("element").offset().left gebruikt. Echter werkte dat niet helemaal zoals verwacht, omdat dit niet de waarde teruggeeft ten opzichte van het huidige element. Om dat op te lossen maak ik gebruik van $("element").position().left, welke wel de verwachte waarde teruggeeft.

De uiteindelijke code ziet er als volgt uit:

  1. $( function () {
  2.         $slider = {
  3.                 currentFrame: 1,
  4.                 slideSpeed: 3000,
  5.                 animateSpeed: 1000,
  6.                 slide: function () {
  7.                         $slider.currentFrame = ($slider.currentFrame >= $("div#slider ul li").length ? 1 : $slider.currentFrame+1);
  8.                        
  9.                         $("div#slider ul").animate({
  10.                                 left: ( '-' + $("div#slider ul li:eq(" + ($slider.currentFrame-1) + ")").position().left )
  11.                         }, $slider.animateSpeed);
  12.                 },
  13.                 start: function() {
  14.                         $interval = setInterval( function () {
  15.                                 $slider.slide();
  16.                         }, $slider.slideSpeed);
  17.                 }
  18.         };
  19.        
  20.         $slider.start();
  21. });

Slot