Javascript slideshow

2 november 2009

team Netlash

Elke webbouwer kreeg ongetwijfeld al eens de vraag of drang om een slideshow te voorzien. Daar dit in de meeste gevallen een relatief kleine, echter alomtegenwoordige feature is, kan al snel even gegoogled worden naar een kant en klaar stukje Javascript. In de bijna 10 miljoen resultaten zal je echter nooit dat script vinden dat exact doet wat je verwacht, op de manier waarop je het wenst.

Omdat we bij Netlash graag volledige controle hebben over onze software, schreven we dan ook zelf een kleine JQuery plugin die heel eenvoudig aan onze meeste noden voldoet. Omdat we het web ook elke dag een beetje beter proberen te maken, delen we deze uiteraard.

Hoe installeer je het script?

  1. Download JQuery op jquery.com en include deze in je document:
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
  2. Download deze plugin en include deze in je document, na het includen van JQuery:
    <script type="text/javascript" src="/path/to/downloaded/jquery.slideshow.js"></script>

Hoe gebruikt je het script?

  1. Plaats een image op de plaats waar je de slideshow wenst te tonen:
    <img src="/path/to/1st/image.jpg" class="slideshow" />
    de class die ik hier op plaatste dient om deze makkelijk te kunnen selecteren via JQuery
  2. Geef in het rel-attribuut van je image alle paden van de files mee, comma-seperated:
    <img class="slideshow" rel="/path/to/1st/image.jpg,/path/to/2nd/image.jpg,/path/to/last/image.jpg" src="/path/to/1st/image.jpg" />
  3. Inititiëer de slideshow:
    <script type="text/javascript"> $('.slideshow').slideshow();</script>

Meer?

Omdat we graag voorzien zijn op "ietsje meer", kan via enkele extra parameters je slideshow wat aangepast/uitgebreid worden.

Beschikbare parameters zijn:

  1. images, als array: geef de paths van je afbeeldingen op als parameter in plaats van als rel-attribuut in de HTML.
  2. links, als array: de mogelijkheid om aan elke afbeelding en link te koppelen waarnaar bij een klik wordt genavigeerd.
  3. fadeTime: de tijd (in milliseconden) tussen het in/uit-faden van de afbeeldingen.
  4. fadeSpeed: de tijd (in milliseconden) dat de fade-animatie duurt.
  5. hookPrevious: de JQuery selector die hier wordt doorgegeven wordt gebruikt voor manuele navigatie doorheen de slideshow in omgekeerde volgorde (vorige).
  6. hookNext: de JQuery selector die hier wordt doorgegeven wordt gebruikt voor manuele navigatie doorheen de slideshow in normale volgorde (volgende).
  7. random: geef aan of de afbeeldingen in de slideshow in willekeurige volgorde dienen verschijnen
  8. preload: hoeveel images moeten gepreload worden voor de huidige getoonde afbeelding

Voordelen?

  1. Indien de bezoeker geen Javascript enabled heeft zal nog steeds de standaard-afbeelding zichtbaar zijn.
  2. De slideshow kan makkelijk gepositioneerd worden zoals gewenst.
  3. Een eenvoudige slideshow kan snel opgezet worden.
  4. De code is eenvoudig en makkelijk uitbreidbaar.
  5. Makkelijk meerdere slideshows op 1 pagina, elk afzonderlijk of samen configureerbaar.

Reacties

Steffest
 

Door Steffest 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Wel vervelend dat je elke afbeelding moet specifiëren in het rel-atribuut, niet?

In mijn zeer bescheiden mening is een slideshowscript pas handig om te herbruiken als het via een serverside scripje bv alle afbeeldingen in een map ophaalt om te tonen - of een xml bestandje inleest met bestandsnamen dat dan door een serverside script wordt gegenereerd. Maar ik weet haast zeker dat jullie inhouse CMS dat ook zo doet zodat je niet handmatig alle bestandsnamen moet gaan oplijsten.

Dieter Orens
 

Door Dieter Orens 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Ziet er goed uit.

Meestal gebruik ik de jQuery Cycle plugin hiervoor (http://malsup.com/jquery/cycle/) die tot nu toe ook aan al deze noden kon voldoen.

Zou je me kunnen zeggen waar het verschil zit met die van jullie? Waarom deze beter zou zijn?

mlitn
 

Door mlitn 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Steffest:
Hoeft niet als rel, je kan deze ook meegeven als extra parameter bij het initiëren van de slideshow (zie 'Meer?')

Dieter:
Beter zou ik niet zeggen, eerder anders.
Bij dit script is maar 1 image nodig: gebruikers zonder Javascript zullen enkel deze ene afbeelding zien
Bij cycle heb je 1 div met daarin alle images. Heb je als client dan geen Javascript enabled, dan ga je alle images zien tenzij je designer de width & height & overflow goed incalculeert. Kan je dan weer niet uitgaan van een vooraf eenmalig vastgelegde width en height, dan wordt het een rommel.
Cycle biedt dan natuurlijk wel meer effecten.

Geert pasteels
 

Door Geert pasteels 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Leuk scriptje.

De rel oplossing lijkt wel onhandig maar is niet zo slecht want dan worden niet alle images direct geladen. Je zou ook alle images in een lijst kunnen zetten en daar een slideshow van kunnen maken. Dan is de kans wel groot dat je images laad die de gebruiker nooit te zien krijgt.

Dieter Orens
 

Door Dieter Orens 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Dat overflow:hidden en juiste height is bij mij nog nooit een probleem geweest.

Het handige bij jullie is dat je ze als een array kan ingeven.

Wat ik echter zeer handig zou vinden in sommige gevallen is een gelijkaardige slideshow als die van Cycle of jullie, maar dan eveneens werkend met css background-images.

Ik heb al gevallen gehad waar de afbeeldingen eigenlijk beter als background worden gebruikt.

(Ik geef toe dat ik ook nog niet gezocht heb achter zulk bestaand script)

Sam Vloeberghs
 

Door Sam Vloeberghs 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Ik dacht hier als eerste een comment te zetten , maar blijkbaar gaat het snel rond.. :)

Wat met SEO? De afbeeldingen staan nu ook in een JSON array , wat niet zo bevorderend is voor het SEO aspect dacht ik, ook verwacht ik blijkbaar hier geen specifieke alt of title tag dat de images beschrijft.

Ik zou alle images inladen en absoluut boven elkaar positioneren.

@Geert Pasteels , 100-200 kb meer of minder maakt in deze tijden van breedband toch ook echt niet zo veel meer uit?

Geert pasteels
 

Door Geert pasteels 02/11/09 (3 maanden geleden)
re: Javascript slideshow

@Sam Vloeberghs
Hangt er vanaf hoe groot de foto's zijn. Nu voor de meeste websites zal dit niet veel uitmaken. Wat je zegt over seo is heel juist. Ik neem aan dat het allemaal afhangt waarvoor je de slideshow gaat gebruiken.

Mathias Bynens
 

Door Mathias Bynens 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Leuk scriptje!

In HTML 4.01 bestaat het REL-attribuut helaas niet voor IMG-elementen: http://www.w3.org/TR/html4/struct/objects.html#h-13.2
Hoe dan ook vind ik dit een nogal vreemde (incorrecte?) toepassing van dit attribuut.

Klaus De Buysser
 

Door Klaus De Buysser 02/11/09 (3 maanden geleden)
re: Javascript slideshow

@Sam Vloeberghs Het mag dan voor de eindgebruiker met breedband (niet iedereen heeft dat) niet zoveel uitmaken, voor de klant die de hostingfactuur moet betalen zal dat vaak wel zo zijn.

200 kb onnodige downloaden omwille van foto's op het einde van de slideshow die hij nooit zal zien, extrapoleren maal het aantal bezoekers per dag kan op het einde van de maand een mooi factuurtje verwachten van z'n hostingprovider.

Niet zo erg interessant dus. Denk dat alt en title attributen wel kunnen opgelost worden door het script wat aan te passen.

Klaus De Buysser
 

Door Klaus De Buysser 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Hmm, wat rare zinsbouw in m'n origineel bericht. Never mind dus.

@Mathias puur volgens de regels zou je dit REL-attribuut inderdaad niet mogen gebruiken, maar dan start je weer een hele discussie omtrent de standaarden en hoe je ze buigt omwille van kosten/baten.

Mathias Bynens
 

Door Mathias Bynens 02/11/09 (3 maanden geleden)
re: Javascript slideshow

@Klaus, het is in dit geval echter helemaal niet nodig om de standaarden te buigen. Toch?

Alle afbeeldingen kunnen net zo goed in de HTML vervat zitten. Als je als designer dan niet wilt dat JavaScript-loze gebruikers meerdere afbeeldingen te zien krijgen, kan dit via CSS opgelost worden.

Indien je dit niet via CSS wil oplossen, en ook maar één afbeelding in de HTML wil, betekent dit dat je afbeeldingen geen vitaal deel uitmaken van de pagina-inhoud. In dat geval is de slideshow louter een vorm van “progressive enhancement” en kan je vanuit JavaScript een bestandenlijst ophalen d.m.v. bijvoorbeeld een JSON-request. (Het script biedt gelukkig ook de mogelijkheid om de afbeeldingen binnen JavaScript te specifiëren.)

Ook de “custom data attributes” van HTML5 zouden mijns inziens een goede optie zijn ter vervanging van het REL-attribuut op IMG-elementen.

mlitn
 

Door mlitn 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Dieter:
Die rel kan handig zijn om op 1 pagina meerdere slideshows op 1 plaats te initialiseren, dan hoef je enkel een .slideshow(); te doen en gaat deze op alle gematchte elementen zijn werk doen. Anders moet je deze 1 voor 1 apart gaan initialiseren met een andere images-array.
Ivm background-image: de oorspronkelijke reden voor deze plugin was dat bestaande slideshows niet altijd even makkelijk te positioneren waren (en vooral niet met elementen die elkaar overlappen, daar durft een slideshow nogal eens boven te komen). Zie bijvoorbeeld www.visitaosta.be met de navigatie bovenop de slideshow.

Sam:
SEO bij een slideshow is sowieso problematisch, gezien Google niets indexeert wat niet zichtbaar is (en in geen enkele goed uitgewerkte slideshow zijn alle images zichtbaar zonder javascript)

mlitn
 

Door mlitn 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Matthias:
Inderdaad, het is geen valide XHTML, daarom ook dat het even goed mogelijk is deze als parameter in te geven. Het was doelbewust niet de bedoeling om meerdere elementen te hoeven aanmaken en deze via CSS te dienen positioneren, met alle extra werk vandien voor 'slechts' een simpele slideshow.

Sam Vloeberghs
 

Door Sam Vloeberghs 02/11/09 (3 maanden geleden)
re: Javascript slideshow

@Klaus De Buysser

Dat is een aspect waar ik geen rekening mee gehouden had. ( het is dus volledig correct :) ) Maar in eerste instantie probeer ik wel altijd een website optimaal te maken voor de gebruiker.

Wat de hosting of traffiek betreft, dat is een item dat je moet bespreken met de eigenaar van de website.

Voordelen en nadelen , wikken en wegen :)

Thomas Eilander
 

Door Thomas Eilander 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Ziet er goed uit!
De cycle plugin is ook wel in orde overigens!

donotfold
 

Door donotfold 02/11/09 (3 maanden geleden)
re: Javascript slideshow

zeer mooi scriptje, normaal zou ik zelf iets schrijven moest ik het nodig hebben maar nu wss niet meer ;) (bookmarked!) Tnx.

Niels
 

Door Niels 02/11/09 (3 maanden geleden)
re: Javascript slideshow

"Mijn" album-scriptje pakt het ietwat anders aan: bepaalde IMG-tags worden door JQuery weggehaald bij het laden van de pagina. Dit verhindert dat ze geladen worden bij pageload. Vervolgens worden nieuwe IMG-tags aangemaakt, en worden ze in de achtergrond geladen, zodat bezoekers geen delay's ondervinden van afbeeldingen (hoe groot deze ook mogen zijn) die geladen worden.

Voor albums werk ik bij voorkeur met JSON. Uiteraard is dit niet 100% SEO-vriendelijk, maar ik ben van mening dat in deze tijden van gegevens die asynchroon geladen worden het SEO-aspect niet altijd even nauw genomen kan worden...

mlitn
 

Door mlitn 02/11/09 (3 maanden geleden)
re: Javascript slideshow

Klaus:
"200 kb onnodige downloaden omwille van foto's op het einde van de slideshow die hij nooit zal zien"
Akkoord, dit kan al snel oplopen tot grote aantallen bij een druk bezochte website, al mag je niet volledig in die richting gaan denken ook. Het belangrijjkste blijft de bezoeker, en als tot het laatste moment gewacht wordt om een foto in te laden kan dit soms te lang duren indien de foto enorm groot is en/of de connectie pc-server niet snel genoeg.
Een goede middenweg voor een groot aantal afbeeldingen zou wel zijn om telkens slechts de 3 volgende images in te laden. Zal ik als ik wat tijd heb eens bekijken!

mlitn
 

Door mlitn 03/11/09 (3 maanden geleden)
re: Javascript slideshow

Added on demand:
extra parameter om het aantal te-preloaden-afbeeldingen te kunnen instellen

Geert pasteels
 

Door Geert pasteels 03/11/09 (3 maanden geleden)
re: Javascript slideshow

@Niels Kan je een voorbeeldje geven hoe je jquery laat voorkomen dat sommige images niet geladen worden?

Niels
 

Door Niels 03/11/09 (3 maanden geleden)
re: Javascript slideshow

Ik weet niet in hoeverre hier code kan/mag geplaatst worden, maar het komt grofweg neer op een volgende werkwijze (let wel, ik heb een site in HTML5, vandaar de

-tag):

$('figure').each(function(index) {
var self = this;
var image = $(this).children()[0];
var pic = new Image();

$(image).remove();

$(pic)
.load(function () {
$(this).css('display', 'none');
$(self)
.css('background', 'transparent')
.append(this);
$(this).fadeIn('slow');
})
.attr({src: image.src});
}

);

De "figure" heeft een CSS-background met een loading-spinner, kwestie van de bezoeker niet in het ongewisse te laden.

In deze oplossing wordt élke afbeelding geladen, maar dan wel in de achtergrond. In een andere categorie heb ik het opgelost dat een afbeelding pas - op identieke wijze als hierboven - wordt geladen van zodra de gebruiker hovert over een thumbnail.

Dat terzijde, je kan jquery ook altijd selectors meegeven, zodat enkel de img:first wordt geladen bijvoorbeeld.

mlitn
 

Door mlitn 10/11/09 (2 maanden geleden)
re: Javascript slideshow

@Niels: code mag hier zeker geplaatst worden.
Het lijkt me dat je van een image eerst de source bepaalt, vervolgens deze image verwijdert en daarna deze door je script toch laat laden? (correct me if I'm wrong)
Je kan met javascript pas je image aanspreken zodra het in je DOM aanwezig is, maar op dit moment wordt de image reeds geladen. Het initiële laden van de image kan je niet tegenhouden.

jonas
 

Door jonas 16/11/09 (2 maanden geleden)
re: Javascript slideshow

Hallo

Alvast bedankt voor het leuke script.
Het komt goed uit voor me, ik was op zoek naar een script die niet alle afbeeldingen in de bron zet.

- Hoe en waar moet ik die images array doen?
- Is er een mogelijkheid dat ook de eerste afbeelding random wordt?

Sorry maar ik ben maar een noob.
Mag gerust via email beantwoord worden.

Bedankt!

mlitn
 

Door mlitn 16/11/09 (2 maanden geleden)
re: Javascript slideshow

Bij het initialiseren van de slideshow kan je de array als extra parameter meegeven als volgt:
$('.slideshow').slideshow({ images : new Array('url-to-image', 'url-to-image', 'url-to-image') });

De eerste afbeelding (de src van uw image) kies je best in je server-side script random. Deze is bewust niet in de javascript gerandomised, om irritant geflikker vlak na de pageload te vermijden (als de originele afbeelding zou worden vervangen door een random afbeelding).

Niels
 

Door Niels 18/11/09 (2 maanden geleden)
re: Javascript slideshow

@mlitn: volgens mij niet hoor. De DOM wordt volledig ingelezen bij het laden van een pagina, maar nog niet de elementen an sich. Het script wordt pas uitgevoerd van zodra dit DOM geladen is, en dus is het aanspreken van alle elementen op zich perfect mogelijk.

Tests met Firebug toonden ook aan dat de img (src) niet meer geladen werd, en pas vanaf het script gerund werd (of het respectievelijke stukje in de code bereikte).

Je interpretatie van de code is inderdaad correct. Het lijkt dubbel werk als je het woordelijk uitschrijft, maar het is bijzonder efficient (voornamelijk als er meerdere zware images op de pagina te tonen zijn).

Pim
 

Door Pim 27/12/09 (1 maand geleden)
re: Javascript slideshow

Hier kan je niets mee zolang je afbeeldingen niet allemaal dezelfde afmetingen hebben..

Reageer op dit bericht

Velden gemarkeerd met een sterretje (*) zijn verplicht. Je e-mailadres wordt niet getoond in je reactie. Wees vriendelijk.

 


Volg de Netlash-blog

Schrijf je in op onze maandelijkse e-mail nieuwsbrief.

Quicknav

Categorieën

Selectie