<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Développement Web, Webdesign, SEO, Multimédia - Guillaume Voisin, Ingénieur Web &#187; tutoriel jquery</title>
	<atom:link href="http://www.guillaumevoisin.fr/tag/tutoriel-jquery/feed" rel="self" type="application/rss+xml" />
	<link>http://www.guillaumevoisin.fr</link>
	<description>Switch on creativity !</description>
	<lastBuildDate>Tue, 07 Feb 2012 13:26:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Tutoriel: Réaliser un diaporama simple avec JQuery</title>
		<link>http://www.guillaumevoisin.fr/developpement/tutoriel-realiser-un-diaporama-simple-avec-jquery</link>
		<comments>http://www.guillaumevoisin.fr/developpement/tutoriel-realiser-un-diaporama-simple-avec-jquery#comments</comments>
		<pubDate>Thu, 29 Oct 2009 13:59:10 +0000</pubDate>
		<dc:creator>Gui</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[diaporama]]></category>
		<category><![CDATA[plugin jquery]]></category>
		<category><![CDATA[tutoriel jquery]]></category>

		<guid isPermaLink="false">http://www.guillaumevoisin.fr/blog/?p=393</guid>
		<description><![CDATA[JQuery est devenu rapidement un framework de développement javascript indispensable, très pratique que ce soit pour développer de simples fonctionnalités ...]]></description>
			<content:encoded><![CDATA[<blockquote class='alert_msg info'><span class='icon'></span> Il existe une nouvelle version du diaporama simple avec JQuery ! <a href="http://wp.me/pWdn8-9Q">Cliquez ici pour accéder aux nouveautés!</a> </blockquote>
<p>JQuery est devenu rapidement un framework de développement javascript indispensable, très pratique que ce soit pour développer de simples fonctionnalités ou des sites complets.</p>
<p>Souvent, lors de la création d&#8217;un site internet, on rencontre les <strong>mêmes fonctionnalités de base</strong> (des rollover sur les images, un menu déroulant, un diaporama &#8230;), et pour chacun d&#8217;entre eux, il existe quasiment un plugin JQuery qui répond à ces attentes.</p>
<p><span id="more-393"></span></p>
<p>Il peut être également utile de <strong>développer un plugin</strong> pour une <strong>fonctionnalité simple</strong> mais à laquelle on se trouve souvent confronté et dont on veut <strong>maîtriser le fonctionnement</strong>.</p>
<p>Mon premier tutoriel s&#8217;articulera donc autour de la mise en place d&#8217;un plugin JQuery simple: un <strong>diaporama Photo</strong>.</p>
<p style="text-align: center;"><img class="size-full wp-image-424 aligncenter" title="Diaporama simple avec JQuery" src="http://www.guillaumevoisin.fr/blogwp/wp-content/uploads/2009/10/diaporama1.jpg" alt="Diaporama simple avec JQuery" /></p>
<h2>Introduction</h2>
<p>Nous allons donc réaliser un diaporama de photos. Le principe étant que les photos défilent les unes après les autres avec une transition par fondu enchaîné. Nous allons aussi ajouter des boutons de contrôle pour mettre en pause le diaporama, accéder à la photo suivante ou précédente.</p>
<h2>Première étape: partie HTML</h2>
<p>Avant tout, il convient d&#8217;inclure la librairie JQuery dans notre page de test. Vous pouvez la trouver ici : <a title="Librairie JQuery" href="http://docs.jquery.com/Downloading_jQuery#Download_jQuery">Librairie JQuery</a></p>
<p>Ensuite, nous allons écrire une page HTML simple avec une liste de photos.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;
	&lt;head&gt;
		&lt;title&gt;Diaporama Simple JQuery&lt;/title&gt;
		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;

		&lt;!-- Cascading Style Sheets --&gt;
		&lt;link href=&quot;page.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
		&lt;link href=&quot;style.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;

		&lt;!-- Javascript --&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.diaporama.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;js/script.js&quot;&gt;&lt;/script&gt;
	&lt;/head&gt;

	&lt;body&gt;

		&lt;h1&gt;Diaporama Simple&lt;/h1&gt;

		&lt;ul class=&quot;diaporama&quot;&gt;
			&lt;li&gt;&lt;img src=&quot;img/galerie/image1.jpg&quot; alt=&quot;Image 1&quot; /&gt;&lt;/li&gt;
			&lt;li&gt;&lt;img src=&quot;img/galerie/image2.jpg&quot; alt=&quot;Image 2&quot; /&gt;&lt;/li&gt;
			&lt;li&gt;&lt;img src=&quot;img/galerie/image3.jpg&quot; alt=&quot;Image 3&quot; /&gt;&lt;/li&gt;
			&lt;li&gt;&lt;img src=&quot;img/galerie/image4.jpg&quot; alt=&quot;Image 4&quot; /&gt;&lt;/li&gt;
			&lt;li&gt;&lt;img src=&quot;img/galerie/image5.jpg&quot; alt=&quot;Image 5&quot; /&gt;&lt;/li&gt;
		&lt;/ul&gt;

	&lt;/body&gt;

&lt;/html&gt;
</pre>
<h2>Deuxième étape: partie CSS</h2>
<p>Le principe de base du diaporama est de superposer les images pour ensuite les faire défiler. Nous allons donc créer une feuille de style avec les propriétés suivantes :</p>
<pre class="brush: css; title: ; notranslate">
.diaporama{
	position:relative;
	width:512px; /* Largeur d'une photo */
	height:288px /* Hauteur d'une photo */
}

.diaporama li{
	list-style-type:none;
	overflow:hidden;
	position:absolute /* Les images seront positionnées toutes au même endroit */
}

.diaporama_controls{
	width:512px;
	margin:3px 0;
	padding:5px;
	clear:both;
	overflow:hidden;
}

.diaporama_controls .btns{
	float:right;
}

.diaporama_controls a{
	font-weight:normal;
	width:10px;
	height:13px;
	text-indent:-9999px;
	display:inline-block;
	margin:0 3px;
}

.diaporama_controls .prev{
	background:url(img/fleches_diapo.png) no-repeat top right;
}

.diaporama_controls .next{
	background:url(img/fleches_diapo.png) no-repeat top left;
}

.diaporama_controls .pause{
	background:url(img/fleches_diapo.png) no-repeat bottom right;
}

.diaporama_controls .play{
	background:url(img/fleches_diapo.png) no-repeat bottom left;
}
</pre>
<p>Je ne détaillerai pas le contenu de la feuille de style page.css, celle-ci n&#8217;est utilisée que pour la mise en page de l&#8217;index.html.</p>
<p>Voici le résultat que nous avons pour l&#8217;instant :</p>
<p><img class="size-full wp-image-402 alignnone" title="Diaporama simple avec JQuery" src="http://www.guillaumevoisin.fr/blogwp/wp-content/uploads/2009/10/diaporama.jpg" alt="Diaporama simple avec JQuery" /></p>
<h2>Troisième étape: partie JQuery</h2>
<p>Nous allons avoir deux fichiers javascript :</p>
<ol>
<li>Notre fichier plugin <em>&laquo;&nbsp;<strong>jquery.diaporama.js</strong>&laquo;&nbsp;</em></li>
<li>Un fichier de script, pour exécuter le diaporama <em>&laquo;&nbsp;<strong>script.js</strong>&laquo;&nbsp;</em></li>
</ol>
<h3>Instanciation du plugin Diaporama</h3>
<p>La fonction Diaporama doit être appelée dans la page html, au chargement de la page, au moyen de la fonction JQuery <em>$(document).ready()</em></p>
<p>Cet appel sera effectué depuis le fichier script.js :</p>
<pre class="brush: jscript; title: ; notranslate">
$(document).ready(function(){

	$(&quot;.diaporama&quot;).diaporama({
		animationSpeed: &quot;slow&quot;,
		delay:2
	});

});
</pre>
<p>On va éxécuter la fonction diaporama sur tous les éléments qui ont une classe &laquo;&nbsp;diaporama&nbsp;&raquo;.</p>
<h3>Structure du plugin</h3>
<pre class="brush: jscript; title: ; notranslate">
(function($){ // 1
	$.fn.diaporama = function(options) {

		// 2 Appliquer le diaporama sur chacun des éléments ciblés
		this.each(function(){

		});

		return this;  // 3 Continuer le chainage JQuery
	};
})(jQuery);
</pre>
<p>Voici la structure de base d&#8217;un plugin JQuery :</p>
<ol>
<li>On utilise function($) pour <strong>explicitement dire</strong> qu&#8217;on va utiliser l&#8217;alias &laquo;&nbsp;$&nbsp;&raquo; dans notre fonction</li>
<li>La fonction diaporama va être appelée sur un élément ou un ensemble d&#8217;éléments. Il convient donc d&#8217;éxécuter pour <strong>chacun des éléments rencontrés</strong> la fonction diaporama</li>
<li>Le chaînage permet de continuer d&#8217;appliquer des fonctions à notre sélecteur, par exemple, $(&laquo;&nbsp;.diaporama&nbsp;&raquo;).diaporama().show.fadeOut() &#8230;</li>
</ol>
<h3>Paramètres</h3>
<p>Nous allons utiliser différents paramètres pour notre diaporama :</p>
<ol>
<li><strong>delay</strong>: le délai de balayage des images</li>
<li><strong>animationSpeed</strong>: la durée de l&#8217;effet de transition</li>
<li><strong>controls</strong>: affichage des boutons de contrôle</li>
</ol>
<p>Cela va se traduire dans notre script par :</p>
<pre class="brush: jscript; title: ; notranslate">
var defaults = {
	delay: 3,
	animationSpeed: &quot;normal&quot;,
	controls:true
};

var options = $.extend(defaults, options);  // 1
</pre>
<ol>
<li><strong>$.extend</strong> est une fonction JQuery qui permet de créer une variable <strong><em>options </em></strong>à partir, soit de la variable <strong><em>defaults</em></strong>, soit des paramètres spécifiés dans l&#8217;appel de la fonction <strong><em>$.fn.diaporama = function(options)<br />
</em></strong>De ce fait, les paramètres non spécifiés dans l&#8217;appel du plugin seront ceux par défaut.</li>
</ol>
<h3>Initialisation</h3>
<p>On va maintenant initialiser le diaporama:</p>
<ol>
<li>Vérifier que la liste contient au moins deux photos</li>
<li>Initialiser nos variables</li>
<li>Lancer la mécanique de rotation d&#8217;images</li>
</ol>
<pre class="brush: jscript; title: ; notranslate">
// On attribue à la variable obj, l'objet courant (le diaporama courant)
var obj = $(this);

// On teste si il y a plus d'une image, sinon le diaporama n'est pas nécessaire
if($(obj).find(&quot;li&quot;).length &gt; 1){

	// On va exécuter la fonction nextElt à chaque intervalle de temps
	var inter = setInterval(function(){nextElt(options)}, (options.delay*1000));

	// On enregistre le sens de rotation
	var sens = &quot;right&quot;;

	// Par défaut, le diaporama n'est pas en pause
	var pause = false;

	// On cache tous les éléments de la liste
	$(obj).find(&quot;li&quot;).hide();

	// Le premier élément s'affiche progressivement et se voit attribuer la classe &quot;active&quot;
	$(obj).find(&quot;li:first-child&quot;).addClass(&quot;active&quot;).fadeIn(options.animationSpeed);
}
</pre>
<p>Si le paramètre <strong><em>controls </em></strong>est défini à <strong><em>true</em></strong>, alors on ajoute les boutons de contrôle:</p>
<pre class="brush: jscript; title: ; notranslate">
// On veut ajouter des boutons de contrôle
if(options.controls)
{
	// On insère après la liste un &lt;div&gt; contenant les boutons &quot;précédent&quot;, &quot;suivant&quot; et &quot;pause&quot;
	$(obj).after(&quot;&lt;div class='diaporama_controls'&gt;&lt;div class='btns'&gt;&lt;a href='#' class='prev'&gt;Prec.&lt;/a&gt; &lt;a href='#' class='pause'&gt;Pause&lt;/a&gt; &lt;a href='#' class='next'&gt;Suiv.&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&quot;);

	// On définit l'action click pour le bouton &quot;précédent&quot;
	// La méthode siblings() permet de trouver les éléments &quot;frères&quot; de l'élément courant
	$(obj).siblings().find(&quot;.prev&quot;).click(function(){
		// On supprime l'intervalle automatique de transition d'image
		clearInterval(inter);

		// On appelle la fonction qui affiche l'image précédente
		prevElt(options);

		// Si le diaporama n'est pas sur pause, on relance l'affichage automatique
		if(!pause)
			inter = setInterval(function(){prevElt(options)}, (options.delay*1000));

		// On définit le sens à gauche
		sens = &quot;left&quot;;
	});

	// On applique la même méthode ou presque au bouton &quot;suivant&quot; (dans l'autre sens)
	$(obj).siblings().find(&quot;.next&quot;).click(function(){
		clearInterval(inter);
		nextElt(options);
		if(!pause)
			inter = setInterval(function(){nextElt(options)}, (options.delay*1000));
		sens = &quot;right&quot;;
	});

	// Si on appuie sur &quot;pause&quot;, on définit deux actions
	$(obj).siblings().find(&quot;.pause&quot;).toggle(

		// On change l'image de fond du bouton via la classe &quot;play&quot;
		function(){
			$(this).removeClass(&quot;pause&quot;).addClass(&quot;play&quot;);

			// On supprime l'intervalle
			clearInterval(inter);

			// On positionne le booléen à true
			pause = true;
		},
		function(){

			// On remet l'image originale
			$(this).removeClass(&quot;play&quot;).addClass(&quot;pause&quot;);

			// On relance le diaporama dans le sens où il était
			inter = setInterval(function(){ (sens == &quot;right&quot;)?nextElt(options):prevElt(options)}, (options.delay*1000));
			pause = false;
		}
	);
}
</pre>
<p>Ensuite, nous allons développer la fonction qui permet de passer à l&#8217;image suivante:</p>
<pre class="brush: jscript; title: ; notranslate">
function nextElt(options)
{
	// On cache de manière progressive l'image active
	$(obj).find(&quot;li.active&quot;).fadeOut(options.animationSpeed);

	// Si l'image active courante n'est pas la dernière image de la liste
	if(!$(obj).find(&quot;li.active&quot;).is(&quot;:last-child&quot;))
	{
		// Alors on cherche l'image suivante (&quot;.next()&quot;), on lui ajoute la class &quot;active&quot;,
		// et on retire cette classe à l'image précedente (l'ancienne image active)
		$(obj).find(&quot;li.active&quot;).next().addClass(&quot;active&quot;).prev().removeClass(&quot;active&quot;);

		// On affiche la nouvelle image active progressivement
		$(obj).find(&quot;li.active&quot;).fadeIn(options.animationSpeed);
	}
	// L'image est la dernière de la liste
	else
	{
		// On fait la même chose mais en prenant la première image de la liste via le sélecteur &quot;first-child&quot;
		$(obj).find(&quot;li:first-child&quot;).addClass(&quot;active&quot;).fadeIn(options.animationSpeed);
		$(obj).find(&quot;li:last-child&quot;).removeClass(&quot;active&quot;);
	}
}
</pre>
<h2>Script final</h2>
<p>Et voilà, nous avons à présent tous les éléments dont nous avons besoin pour que le diaporama fonctionne.</p>
<p>Voici le script final diaporama.js :</p>
<pre class="brush: jscript; title: ; notranslate">
(function($){
	$.fn.diaporama = function(options) {

		var defaults = {
			delay: 3,
			animationSpeed: &quot;normal&quot;,
			controls:true
		};

		var options = $.extend(defaults, options);

		this.each(function(){

			var obj = $(this);

			if($(obj).find(&quot;li&quot;).length &gt; 1){
				var inter = setInterval(function(){nextElt(options)}, (options.delay*1000));
				var sens = &quot;right&quot;;
				var pause = false;

				$(obj).find(&quot;li&quot;).hide();
				$(obj).find(&quot;li:first-child&quot;).addClass(&quot;active&quot;).fadeIn(options.animationSpeed);

				// Controls

				if(options.controls)
				{
					$(obj).after(&quot;&lt;div class='diaporama_controls'&gt;&lt;div class='btns'&gt;&lt;a href='#' class='prev'&gt;Prec.&lt;/a&gt; &lt;a href='#' class='pause'&gt;Pause&lt;/a&gt; &lt;a href='#' class='next'&gt;Suiv.&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&quot;);

					$(obj).siblings().find(&quot;.prev&quot;).click(function(){
						clearInterval(inter);
						prevElt(options);
						if(!pause)
							inter = setInterval(function(){prevElt(options)}, (options.delay*1000));
						sens = &quot;left&quot;;
					});

					$(obj).siblings().find(&quot;.next&quot;).click(function(){
						clearInterval(inter);
						nextElt(options);
						if(!pause)
							inter = setInterval(function(){nextElt(options)}, (options.delay*1000));
						sens = &quot;right&quot;;
					});

					$(obj).siblings().find(&quot;.pause&quot;).toggle(
						function(){
							$(this).removeClass(&quot;pause&quot;).addClass(&quot;play&quot;);
							clearInterval(inter);
							pause = true;
						},
						function(){
							$(this).removeClass(&quot;play&quot;).addClass(&quot;pause&quot;);
							inter = setInterval(function(){ (sens == &quot;right&quot;)?nextElt(options):prevElt(options)}, (options.delay*1000));
							pause = false;
						}
					);
				}

				// Affiche l'élément suivant

				function nextElt(options)
				{
					$(obj).find(&quot;li.active&quot;).fadeOut(options.animationSpeed);

					if(!$(obj).find(&quot;li.active&quot;).is(&quot;:last-child&quot;))
					{
						$(obj).find(&quot;li.active&quot;).next().addClass(&quot;active&quot;).prev().removeClass(&quot;active&quot;);
						$(obj).find(&quot;li.active&quot;).fadeIn(options.animationSpeed);

					}
					else
					{
						$(obj).find(&quot;li:first-child&quot;).addClass(&quot;active&quot;).fadeIn(options.animationSpeed);
						$(obj).find(&quot;li:last-child&quot;).removeClass(&quot;active&quot;);
					}
				}

				// Affiche l'élément précédent

				function prevElt(options)
				{
					$(obj).find(&quot;li.active&quot;).fadeOut(options.animationSpeed);

					if(!$(obj).find(&quot;li.active&quot;).is(&quot;:first-child&quot;))
					{
						$(obj).find(&quot;li.active&quot;).prev().addClass(&quot;active&quot;).next().removeClass(&quot;active&quot;);
						$(obj).find(&quot;li.active&quot;).fadeIn(options.animationSpeed);

					}
					else
					{
						$(obj).find(&quot;li:last-child&quot;).addClass(&quot;active&quot;).fadeIn(options.animationSpeed);
						$(obj).find(&quot;li:first-child&quot;).removeClass(&quot;active&quot;);
					}
				}
			}
		});

		return this;
	};
})(jQuery);
</pre>
<h2>Téléchargements et Démo</h2>
<p>La démo est <a title="Diaporama simple avec Jquery" href="http://tuts.guillaumevoisin.fr/jquery/diaporama/">disponible ici</a>.</p>
<p>Les fichiers sources : <a href="http://tuts.guillaumevoisin.fr/jquery/diaporama/jquery.diaporama.zip">télécharger les fichiers sources de l&#8217;example</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guillaumevoisin.fr/developpement/tutoriel-realiser-un-diaporama-simple-avec-jquery/feed</wfw:commentRss>
		<slash:comments>75</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: guillaumevoisin.fr @ 2012-02-07 19:58:55 -->
