Diaporama simple avec JQuery, nouvelle version: jDiaporama !

Publié par Gui dans jQuery, Tutoriels

Facile

jQuery, css

téléchargez dès maintenant la toute dernière version de jDiaporama avec plein de nouveautés !

Vous avez été nombreux à commenter le tutoriel « Comment réaliser un diaporama simple avec JQuery« , alors le voici maintenant en version 2 !

J’ai essayé d’ajouter dans cette nouvelle version les différents manquements que vous souligniez dans le précédent tutoriel.

Voici donc les nouveautés de ce nouveau diaporama JQuery:

  • Nouvel aspect graphique
  • Contrôle du diaporama grâce aux touches directionnelles du clavier
  • Défilement automatique ou non
  • Gestion de la direction du diaporama (de gauche à droite ou inversement)
  • Pause par défaut possible
  • Arrêt du diaporama après un nombre défini de boucles
  • Affichage du titre
  • Affichage de la légende
  • Affichage d’un compteur (image actuelle sur nombre d’images)
  • Possibilité d’accéder à une image directement en cliquant sur les boutons ronds
  • Ajustement automatique en fonction de la taille des images du diaporama
  • Compatibilité sur tous les navigateurs

Préambule

Je ne vais pas revenir en détails sur la création de la partie HTML (celle-ci est n’a pas changé, c’est toujours aussi simple!), ni sur le CSS, mais me concentrer à vous expliquer le fonctionnement des nouveautés de cette version.

Si vous avez manqué le début, notamment sur la création d’un plugin pour JQuery, je vous invite à suivre le tutoriel original: Tutoriel: Réaliser un diaporama simple avec JQuery.

Déclaration des nouvelles options

var defaults = {
	auto: true, // Le diaporama est en mode automatique
	delay: 3, // La durée d'affichage est de 3 secondes
	animationSpeed: "normal", // La durée de transition est normale
	controls: true, // Les boutons de contrôle sont affichés par défaut
	keyboard: true, // La navigation au clavier est activée
	infos: true, // Les informations (légende, titre) sont affichées
	currentimage: true, // Le compteur d'image est affiché
	paused: false, // Le diaporama démarre automatiquement
	boucles: 0, // 0 = Illimité, le diapo ne s'arrêtera jamais
	sens: "right" // Le sens du défilement est vers la droite par défaut
	onrollover: true // Les infos ne s'affichent qu'au survol de la souris
};

Initialisation & variables

Nous allons voir ici dans un premier temps, comment initialiser notre script, en définissant quelques variables et en effectuant quelques actions.

Mais comme dit le proverbe, un joli code vaut mieux qu’un long discours !


// la variable diapo est un raccourci pour le diaporama courant
var diapo = $(this);
// Variable utilisé pour détecter la présence de la souris sur le diaporama
var mouseover = false;
// Orientation du défilement
var sens = options.sens;
var pause = false;
var width = 0;
var height = 0;
// Image par défaut (position 0)
var current_slide = 0;

// On encapsule notre liste (ul) dans un div avec une classe
diapo.wrap("<div class='jDiaporama'></div>");

var inter = ""; // Variable pour l'interval de temps

// Si le mode est défini sur "auto" et qu'il démarre automatiquement
if(options.auto && !options.paused)
// On lance le diaporama (défilement)
	inter = setInterval(function(){displayDiaporama(options)}, (options.delay*1000));

// On cache les autres images pour n'afficher que la première
$("li", diapo).hide();
// A noter une différence, maintenant on appelle une fonction init() *
// à la fin du fondu sur la première image.
$("li:first-child", diapo).addClass("active").fadeIn(options.animationSpeed, init);

// Pour chaque élément
$("li", diapo).each(function(){
	elt = $(this);

	// On calcule la position de l'image
	i = parseInt($("li", diapo).index($(this))+1);

	// On lui ajoute un ID avec la position
	$(this).attr("id", "jDiaporama_image_"+i);

	// Affichage de la légende si renseignée et activée
	if(options.infos)
	{
		// Y-a-t-il une description ? balise title
		var is_desc = ($("img", elt).attr("title") != "");
		// Y-a-t-il un titre? balise alt
		var is_title = ($("img", elt).attr("alt") != "");

        // On affiche ensuite ou non le titre et la description de l'image
		if(is_desc)
			elt.append("<p class='desc'>"+$("img", elt).attr("title")+"</p>");

		if(is_title)
			elt.append("<p class='title'>"+$("img", elt).attr("alt")+"</p>");

		// On affiche selon le paramètre choisi, le compteur d'image ou non
		if(options.currentimage)
			// On récupère ici la position de l'image courante (méthode index())
            // qu'on incrémente car la première position est 0.
			// Et on la compare au nombre d'images total
            // (nombre d'enfants (li) du diaporama)
			elt.append("<p class='count'>"+parseInt($("li", diapo).index(elt)+1)+"/"+diapo.children().length+"</p>");
	}
})

* Le script est maintenant initialisé par une fonction.

function init()
{
	// On récupère la taille de la première image du diaporama
	width = $("li:first-child img", diapo).width();
	height = $("li:first-child img", diapo).height(); // Sa hauteur

	// On ajuste le diaporama à la bonne taille
	// Ici la liste ul
	diapo.width(width);
	diapo.height(height);

	// Ici son parent .jDiaporama
	diapo.parent().width(width);
	diapo.parent().height(height);

	// Si les contrôles sont activés, on affiche les boutons ronds
	if(options.controls)
		diapo.siblings(".jDiaporama_status").show();
	// Si le diaporama est auto, mais en pause au début,
	// On lance l'évènement click sur le bouton "pause"
	if(options.auto && options.paused)
		$(".pause", diapo.siblings()).trigger("click");
	// On rend actif le premier bouton rond de la status bar
	$("#jDiaporama_bullet_"+(parseInt($("li", diapo).index($("li:first-child", diapo)))+1), diapo.siblings()).addClass("active");
}

A ce stade là, notre script est initialisé.

Il nous reste maintenant à définir :

  1. les actions utilisateurs pour les rollovers et l’affichage des informations
  2. les commandes clavier
  3. les différents contrôles du diaporama (suivant, précedent, pause …)
  4. la fonction de rotation d’image
  5. la fonction de rotation automatique

Informations & Rollovers

Par défaut, les informations ne s’affichent qu’au survol de la souris sur une image. On peut changer ce paramètre dans les options.

Il convient alors de détecter quand la souris est sur l’image courante. Pour cela nous utilisons les méthode JQuery mouseenter et mouseleave pour respectivement « Entrée de la souris dans la zone de l’image » et « sortie« .

Evenements de la souris

diapo.parent().mouseenter(function(){
	// On indique que la souris est bien au dessus de l'image
	mouseover = true;
	// On appelle la méthode qui affiche les infos
	// pour l'image courante
	displayInfos($("li.active", diapo), "show");
	// Si les contrôles sont activés, on affiche les boutons (flèches, pause)
	if(options.controls)
		diapo.siblings(".jDiaporama_controls").fadeIn();

}).mouseleave(function(){
	// La souris n'est plus au dessus de l'image
	mouseover = false;
	// On cache les infos
	displayInfos($("li.active", diapo), "hide");
	// Et les boutons
	if(options.controls)
		 diapo.siblings(".jDiaporama_controls").hide();
});

Grâce à ces deux méthodes, nous pouvons parfaitement gérer l’affichage des informations et des contrôles en fonction des évènements souris.

Méthode d’affichage

function displayInfos(elt, display)
{
	// Variables pour tester la présence des balises "title" et "alt"
	// Pour respectivement la description et le titre
	var is_desc = ($("img", elt).attr("title") != "");
	var is_title = ($("img", elt).attr("alt") != "");

	if(is_desc)
		if(display == "show")
			$(".desc", elt).slideDown("fast");
		else
			$(".desc", elt).slideUp("fast");
	if(is_title)
		if(display == "show")
			$(".title", elt).slideDown("fast");
		else
			$(".title", elt).slideUp("fast");
	if(options.currentimage)
		if(display == "show")
			$(".count", elt).slideDown("fast");
		else
			$(".count", elt).slideUp("fast");
}

Cette fonction s’occupe simplement de vérifier la présence des bonnes balises, pour n’afficher les informations que lorsqu’elles sont présentes. Ainsi on teste les attributs « title » et « alt » pour lancer l’animation d’affichage.

Le paramètre display est utilisé pour savoir s’il faut afficher ou cacher les informations.

Enfin, de la même manière, on n’affiche le compteur d’images que si celui-ci est activé dans les paramètres.

Commandes clavier

Nous utilisons ici une autre méthode JQuery: la fonction keydown qui permet de détecter la pression d’une touche du clavier.

Il suffit ensuite de repérer le code de la touche correspondant à la flèche gauche (37) et à la flèche droite (39). Après, nous allons réutiliser le fonctionnement du clic sur les boutons suivant et précédent (voir plus bas) pour passer à l’image suivante ou précédente (évitant ainsi de réécrire les actions).

// Si la navigation au clavier est activée
if(options.keyboard)
	$(document).keydown(function(event) {
		switch(event.keyCode){
			case 37 : // Flèche gauche
				// On appelle la fonction prev()
				prev();
			break;

			case 39 : // Flèche droite
				// On appelle la fonction next()
				next();
			break;
		}
	});

Boutons de contrôle

Nous allons détailler ici les différentes actions effectuées par les boutons de contrôle du diaporama.

Il y a pas mal de code alors accrochez-vous !

Il y a quatre étapes dans cette portion de code :

  1. Définition de la « status bar« , les boutons ronds qui permettent de suivre le défilement du diaporama.
  2. L’action du bouton précédent
  3. L’action du bouton suivant
  4. L’action du bouton lecture/pause

Status bar

// On ajoute le <div> qui contient les boutons ronds
// juste après la liste d'images
diapo.after("<div class='jDiaporama_status'></div>");

// Pour chaque image du diaporama
$("li", diapo).each(function(){

	// On calcule la position de l'image
	i = parseInt($("li", diapo).index($(this))+1);

	// On ajoute dans le <div> un lien vers cette même image
	$(".jDiaporama_status", diapo.parent()).append("<a id='jDiaporama_bullet_"+i+"' href='#'>Image "+i+"</a>");
})

// On calcule la taille que fait le <div> final avec les liens
// dedans pour pouvoir le placer de manière absolue
// centré en dessous du diaporama.
$(".jDiaporama_status", diapo.parent()).css("margin-left", -($(".jDiaporama_status", diapo.parent()).width()/2));

// On définit l'action du clic sur un lien de la status bar
$(".jDiaporama_status a", diapo.parent()).click(function(){
	// on appelle la méthode de rotation d'image avec
	// comme paramètre le lien courant
	nextImage(options, $(this));
	return false;
})

Ajout des boutons de contrôle

On ajoute les boutons de contrôle après le diaporama (<ul>). A noter qu’on n’ajoute le bouton play/pause uniquement si le mode auto est activé).

// Ajout du <div> .jDiaporama_controls
diapo.after("<div class='jDiaporama_controls'><a href='#' class='prev'>Prec.</a> " + ((options.auto)?"<a href='#' class='pause'>Pause</a>":"") + " <a href='#' class='next'>Suiv.</a></div>");

Action du bouton précédent


$(".prev", diapo.siblings()).click(function(){
	prev();
	// On annule l'action originelle (#) du lien
	return false;
});

function prev()
{
	// Si l'image courante n'est pas la première
	if(!$("li.active", diapo).is(":first-child"))
		// l'élément à afficher est l'image précédente
		elt =  $("li.active", diapo).prev();
	else
		// Sinon c'est la dernière
		elt =  $("li:last-child", diapo);

	// On appelle la méthode de rotation avec l'image à afficher
	nextImage(options, elt);

	// On définit le sens de défilement
	sens = "left";
}

Action du bouton suivant

La seule différence avec le bouton précédent est le sens de rotation.

$(".next", diapo.siblings()).click(function(){
	next();
	// On annule l'action originelle (#) du lien
	return false;
});

function next()
{
	// Si l'image courante n'est pas la dernière
	if(!$("li.active", diapo).is(":last-child"))
		// l'élément à afficher est l'image suivante
		elt =  $("li.active", diapo).next();
	else
		// Sinon c'est la première
		elt =  $("li:first-child", diapo);

	nextImage(options, elt);
	sens = "right";
}

Action du bouton lecture/pause

	$(".pause", diapo.siblings()).click(function(){
		// Si le diaporama est déjà en pause (a la classe "pause")
		if($(this).hasClass("pause"))
		{
			// On enlève cette classe et on met la classe "play"
			$(this).removeClass("pause").addClass("play");
			// On arrête le défilement automatique du diaporama
			clearInterval(inter);
			// On définit une variable globale "pause" à true
			pause = true;
		}
		// Sinon
		else
		{
			// On remet la classe "pause"
			$(this).removeClass("play").addClass("pause");
			// On relance le défilement automatique
			inter = setInterval(function(){displayDiaporama(options)}, (options.delay*1000));
			pause = false;
		}

		return false;
	});
}

Fonction de rotation d’image

C’est ici le plus gros du système. La méthode a un peu changé par rapport au précédent tutoriel.

En effet, avant cette fonction  ne s’occupait uniquement que d’afficher l’image suivante ou précédente selon le sens de rotation. Maintenant elle affiche une image définie (passée par paramètre) pour que l’on puisse afficher l’image souhaitée grâce à la « status bar ». C’est donc les boutons de contrôle qui définissent qu’il faut afficher l’image suivante ou précédente (comme vu précédemment).

// Le paramètre elt correspond à l'élément que l'on veut afficher
// Soit l'image suivante au clic sur les boutons suivant/précédent
// Soit le lien de la status bar
function nextImage(options, elt)
{
	// On stoppe le défilement automatique
	clearInterval(inter);

	// On cache l'image active et on lui retire sa classe
	$("li.active", diapo).fadeOut(options.animationSpeed).removeClass("active");

	// On fait de même pour les liens de la status bar
	$(".jDiaporama_status a", diapo.parent()).removeClass("active");

	// On récupère l'identifiant de l'élément (image ou lien status bar)
	id = elt.attr("id").split("_")[2];

	// On rend actif et on affiche l'image demandée
	$("li#jDiaporama_image_"+id, diapo).addClass("active").fadeIn(options.animationSpeed);
	// On ajoute la classe actif au bon bouton rond de la status bar
	$("#jDiaporama_bullet_"+id, diapo.siblings()).addClass("active");

	// Si les infos sont activées, le rollover aussi et qu'on est déjà sur le diaporama
	// au moment où on change d'image, alors on affiche les infos
	if(options.infos && mouseover && options.onrollover)
		displayInfos($("li.active", diapo), "show");
	// Sinon on les cache
	else if(!mouseover && options.onrollover)
		displayInfos($("li.active", diapo), "hide");

	// Si le diapo est en mode auto et n'est pas en pause
	if(!pause && options.auto)
	{
		// Si l'on est pas arrivé au bout du compteur de boucle ou que celui est ci est en mode infini (0)
		if(options.boucles == 0 || (options.boucles > 0 && (diapo.data("current_slide")/diapo.children().length) < options.boucles ))
			// On relance le défilement automatique
			inter = setInterval(function(){displayDiaporama(options)}, (options.delay*1000));
		else
			// Sinon on est arrivé à la fin et on enlève le bouton lecture/pause
			$(".pause", diapo.siblings()).remove();
	}
}

Fonction de défilement automatique

Voici la fonction qui est appelée à intervalle régulier et qui s’occupe de faire défiler les images automatiquement.

On utilise dans cette méthode, une autre fonction JQuery bien pratique, la fonction data, qui permet d’associer des variables à un objet JQuery. En l’occurence, nous allons nous en servir pour stocker la variable current_slide dans l’objet diapo (notre diaporama).

function displayDiaporama(options)
{
	// On incrémente le nombre d'images déjà affichées
	current_slide++;
	// On met à jour la variable pour le diaporama courant
	diapo.data("current_slide", current_slide);

	// Selon le sens de rotation, nous appelons la fonction
	// suivante ou précédente
	if(sens == "right")
		next();
	else
		prev();
}

Conclusion

Voilà ! Le script de la nouvelle version du diaporama simple avec JQuery est maintenant terminée !

Informations & téléchargements

Le script fonctionne parfaitement sur tous les navigateurs : IE (6,7 et 8), Firefox, Chrome et Safari.

A noter que l’utilisation de png transparent fait quelque peu ralentir le script sur IE7 seulement et que sur IE 6 des images au format gif ont été utilisées pour remplacer les PNG.

La démo est disponible ici.

Les fichiers sources : télécharger les fichiers sources de l’example.

Le projet jDiaporama sur jQuery.com: http://plugins.jquery.com/project/jDiaporama

172 commentaires

1 2 3 4 7
  1. Gui
    • Gaetan

      Salut Guillaume, comme beaucoup, je trouve ton travail vraiment clair, net et précis. Je ne suis pas un crack en js, mais pourtant je comprends le processus du code.

      Maintenant, j’ai réussi à intégrer ton diaporama sur mon site. Outre un petit problème avec l’alignement surement du a un conflit avec le CSS de mon site, le diaporama reste bloqué sur la première photo. J’ai lu sur un commentaire plus tôt que c’était quand on mettant les contrôles a fasle. Pour tester je les ai mis a true mais ça marche pas plus.

      • Gui
  2. accro22

    Merci beaucoup pour ce tuto. j’avais justement besoin de réaliser un diaporama et cette méthode est beaucoup plus simple (surtout quand tout est donné !) que celle que j’avais envisagée.

    • Gaetan

      Salut Guillaume, Autant pour moi, j’ai réussit a réglé mon problème et c’était entièrement ma faute ^^

      En effet, j’ai fait l’erreur de recopier le HTML de la première version au lieu de celui de la deuxieme, alors les classes correspondait plus.

      Voici mon site si tu veux voir le résultat (c’est une page de dev)
      http://www.terreasoi.coop/paniersbio.htm

      Merci encore pour ton super travail !

  3. k3nz0

    Très beau travail, juste un petit truc, quand je change la période d’affichage (qui est 3 par défaut) par 10 par exemple, l’affichage reste à 3 secondes ! Bizarre …

  4. k3nz0

    C’est réglé, il fallait changer le delay dans script.js ! Merci 🙂 !

  5. Harry

    Bonjour et merci beaucoup pour ce tuto..

    J’ai une petit question, deux en fait :

    -J’ai touché un peu à mon css et maintenant j’ai le text (next., prev. et paus.) qui apparaissent devant les boutons… Comment enlever cela ?

    -J’ai resizé toutes mes images à la source pour que ça colle pile poil à la source. Est-il possible de configurer un resize automatique des images ? Si non, j’imagine que ça viendra dans une prochaine version 😉

    Merci pour ton aide

    A bientôt

    harry

    • Gui
  6. clemenrt

    Bonjour ! Merci pour ce tuto tres clair est très bien fichu ! J’aurais juste une question : j’ai centrer .jDiaporama avec margin:0 auto; il ya un temps de latence au chargement de page … Quand la page est chargée, l’image apparait à gauche en fadeIn puis se centre au milieu de ma fenêtre quand apparaissent les « bullets ». Pouvez-vous m’aider à faire en sorte que mon diaporama soit centrée au chargement de page directement ? Merci d’avance ! (je développe en local sous mozilla et safari)

  7. HERY

    Bonjour,
    Quelle est la taille recommander des photos ?
    Est-il possible d’augmenter la fenêtre d’affichage des photos ?
    Merci d’avance pour les réponses et de mettre à disposition de la communauté ce joli diaporama.

    • Gui
  8. Patrick

    Bonjour,
    Existe-t-il le même diaporama avec des petites vignettes en dessous des grandes photos SVP ?
    Merci d’avance

  9. Damien

    Bonjour,

    Tout d’abord, merci pour ce diapo :), j’suis étudiant en infographie, et je suis en train de monter un site web pour afficher mes créations, et ton diaporama m’aide grandement, puisque j’apprends en solo.

    J’ai un léger soucis avec une partie du code html, à partir d’ici :

    Revenir à l’article.

    je n’arrive pas à changer le lien au profit de ma page d’accueil, ce qui pour moi devrait donner ceci:

    Revenir à l’article.

    or le lien ne me ramène pas du tout à ma page, mais bien à la tienne, alors qu’il n’y a plus de notions de ce lien dans l’html oO.

    Une suggestion?

    Désolé si ce problème te semble stupide, et merci d’avance pour ta réponse 🙂

  10. Antoine

    Bonjour,

    Tout d’abord bravo pour ce pluging !

    Je l’ai intégré parfaitement dans mon site internet et le rendu est très sympa, je n’ai eu jusqu’à présent aucun soucis!

    Par contre je viens de m’apercevoir que le diapo ne passe pas sous le nouveau Internet Explorer 9… 🙁

    Je voulais juste savoir si une nouvelle version est en préparation pour palier au problème.. et si oui d’ici combien de temps environ?

    • Gui
  11. Romain

    Bonjour,

    Enfin un superbe slideshow pas trop compliqué et réellement joli.

    Je l’ai utilisé pour faire des tests sur un site intranet, mais je bloque sur une petite partie : Est-il possible de régler la taille du filtre gris de la légende, afin de pouvoir afficher plus de deux lignes dans cette dernière ?

    Merci d’avance pour la réponse et surtout, merci pour cette utilisation de JQuery qui est, ma foi, efficace. 😉

  12. Loulou

    Bonjour,

    Un grand merci pour ce module de diaporama qui est façile à mettre en place. Je l’ai installé en local et impeccable cela fonctionne à merveille.
    Par contre, quand je le met sur mon serveur (qui tourne sous linux à la différence de mon pc qui tourne en windows), il me fait une erreur sur le fichier script.js apparemment sur la ligne 2 soit $(« .diaporama1 »).jDiaporama({
    Comment faire pour que ça fonctionne sur mon appli ?

    Merci d’avance de votre aide,
    Loulou

    PS : Je ne peux pas vous donner le lien du site car je suis en plein développement et l’accès en est protégé.

  13. Crysal

    Bonjour,

    super diaporama seulement je bug sur un détail je voudrais que le diaporama soit centrer sur ma page, j’ai essayer de modifier quelques éléments sur le css (en prenant soin a chaque raté de remettre comme il faut) mais rien a faire il reste sur le côté gauche.

    A mon avis c’est tout simple mais je ne trouve pas…
    Merci pour la solution.

    • Gui
  14. Lilo

    Bonjour,

    Très bon tutoriel, merci!
    Petite question, comment afficher en permanence la description des images? (et le titre aussi en passant) (sans être obligé de passer la souris sur l’image)

    Merci d’avance

  15. ORnORme

    Bonjour,

    c’est clair que ton tutoriel est tellement clair et bien organisé!!!c’est incroyable. Par contre, « SOS jeune webdesigner en detresse!!! »… je suis actuellement sur la réalisation d’un site pour une artiste sculptrice ( http://www.isabelledemontvalon.eu ) et je dois réaliser une animation de photos de ses oeuvres façon 360° et je voudrais que l’animation se déclenche au survol et s’arrete quand on sort de l’image… sans click sur lecture/pause…j’avoue que j’ai essayer deux jours durant de traffiquer le fichier source… mais je suis trop débutant pour programmer js même si j’en comprend la logique!!!

    Bref, comme dirait Lilou : « PLEASE…HELP!!! »…
    merci d’avance… 🙂

  16. info2tele

    Bonjour,

    Je trouve ce slideshow parfait et je souhaite l’intégrer à mon site (http://info2tele.com)

    J’ai plusieurs questions :

    – comment faire pour qu’il affiche automatiquement les 4 derniers articles de la catégorie « à la une » ?

    – Comment faire pour que le titre et la légende s’affiche automatiquement (cf http://www.tvmag.com)

    – et surtout, comment l’implanter sachant que je ne connais rien au code

    Cordialement

  17. Flor

    Bonjour,

    J’ai installé le diaporama sur mon site web mais impossible de centrer le diaporama sur ma page web pourtant j’ai fait comme tu a dit précédemment dans un autre message en créant une balise div

    Code CSS
    .center { text-align: center; margin-left:auto; margin-right:auto; }

    mais impossible de centrer mon diaporama et ce que tu c’est ce qu’il y a de faux SVP

    merci d’avance

    • Flor

      Bonjour,

      la balise html appelant le css et div class= »center »

      merci d’avance

      • Gui
1 2 3 4 7

Laisser une réponse


Post shadow