Bonjour,
je voudrais déja vous féliciter pour le site que j'ai découvert il y a quelques jours et qui est vraiment complet.

J'ai donc utilisé le tutoriel sur la réalisation d'une galerie en js et tout marche très bien,
le problème est que je souhaiterais utiliser trois fois ce scrit sur la mêmê page
(trois listes de vignettes mais les images s'affichent dans le même div).
J'ai évidemment testé plusiers solutions sans succès, je voudrais donc possible s'il est possible réaliser ceci?
merci d'avance
Tiens c'est marrant, j'étais en train de me poser exactement la même question.

EN fait, le gros probleme, c'est l'emploi de "id," qui ne peut etre utilisé qu'une fois pour chaque nom!
j'ai tenté plusieurs techniques de boucle, sans résultat : l'absence de la commande "getElementbyClass" se fait cruellement sentir...

En un mot : help!
Ahah, je vois que je ne suis pas seul à chercher une solution à ce problème.
Par contre, et bien que ce soit lié aux tutoriels, étant donné que ça touche au DOM, peut-être y aura-t-il plus de réponses ici : DOM, JavaScript, ECMAScript.

En tout cas, si quelqu'un trouve, qu'il n'hésite pas à se manifester : forte récompense à la clef (un smiley qui sourit).
Modifié par Smiley neko (17 May 2006 - 21:54)
Ça y est! Ça a pris la nuit mais on en est venu à bout.

Le problème d'adapter le script d'origine à des galeries multiples vient de l'utilisation de "id" : c'est utilisé pour dénommer un élément unique, d'une part, et dans le CSS d'autre part.
A cause de la propriété d'unicité on ne peut pas garder id si on a met une boucle (un tour par galerie).

Pour parer au problème n°1 :
on utilise "name" et "getElementsbyname" (notez le pluriel à ElementS) il permet de récupérer tous les élements à qui on a donné le nom "galerie" par exemple.

Pour le pb n°2 :
on utilise des classes au lieu de id (car le CSS ne reconnaît pas les tags "name".

Pour ce qui est de la boucle, elle détecte toute seule le nombre de galeries dans la page.

Allons y

1) l'HTML : je prend ici l'exemple de trois galeries
<body >
<!--Un petit menu au début pour aider à la navigation. Si vous n'en voulez pas, enlevez-le ainsi que les tags <a name=""> dans les <H2>.-->
<center>
-- <a href="#1">Galerie 1</A> ---
<a href="#2">Galerie 2</A> ---
<a href="#3">Galerie 3</A> ---

</Center>

<H2><a name="1">Galerie 1</a></H2>
<div class="galerie" name="galerie">
	<ul class="galerie_mini" name="galerie_mini">

	<li><a href="images/1.jpg" title="Titre de l'image 1"><img src="images/mini/1.jpg" alt="1" /></a></li>		
	<li><a href="images/2.jpg" title="Titre de l'image 2"><img src="images/mini/2.jpg" alt="2" /></a></li>
	<li><a href="images/3.jpg" title="Titre de l'image 3"><img src="images/mini/3.jpg" alt="3" /></a></li>
</ul>
	<dl name="photo" class="photo">
		<dt>Titre del'image 1</dt>
		<dd><img name="big_pict" src="images/1.jpg" alt=" 1" /></dd>
	</dl>
</div>

<H2><a name="nouvelles">Galerie 2</A></H2>

<div class="galerie" name="galerie">
	<ul class="galerie_mini" name="galerie_mini">

	<li><a href="images/4.jpg" title="Titre de l'image 4"><img src="images/mini/4.jpg" alt="1" /></a></li>		
	<li><a href="images/5.jpg" title="Titre de l'image 5"><img src="images/mini/5.jpg" alt="2" /></a></li>
	<li><a href="images/6.jpg" title="Titre de l'image 6"><img src="images/mini/6.jpg" alt="3" /></a></li>
</ul>
	<dl name="photo" class="photo">
		<dt>Titre del'image 4</dt>
		<dd><img name="big_pict" src="images/4.jpg" alt=" 4" /></dd>
	</dl>
</div>

<H2><a name="jeunesse">Jeunesse</A></H2>
<div class="galerie" name="galerie">
	<ul class="galerie_mini" name="galerie_mini">

	<li><a href="images/1.jpg" title="Titre de l'image 1"><img src="images/mini/1.jpg" alt="1" /></a></li>		
	<li><a href="images/2.jpg" title="Titre de l'image 2"><img src="images/mini/2.jpg" alt="2" /></a></li>
	<li><a href="images/3.jpg" title="Titre de l'image 3"><img src="images/mini/3.jpg" alt="3" /></a></li>
</ul>

	<dl name="photo" class="photo">
		<dt>Titre del'image 1</dt>
		<dd><img name="big_pict" src="images/1.jpg" alt=" 1" /></dd>
	</dl>
</body>


2) CSS pour mettre un peu de style dans tout ça (suggestion de présentation, qui est très proche de celle d'Olivier dans le tuto d'origine))


div.galerie
{
	background: #eed ;
	border: 1px solid #dcb ;
	padding: 15px ;
	margin: 15px 30px ;
	text-align: center ;
	font: 0.9em Georgia, serif ;
}

ul.galerie_mini
{
	margin: 0 ;
	padding: 0 ;
	list-style-type: none ;
}

ul.galerie_mini li
{
	float: left ;
}

ul.galerie_mini li a img
{
	margin: 2px 1px ;
	border: 1px solid #dcb ;
}

dl.photo
{
	clear: both ;
	margin: 0 auto ;
}

dl.photo dt

		{

			font: 2em Verdana, sans-serif ;

			color: #666 ;
}

dl.photo dd
{
	margin: 0 ;
}

dl.photo img
{
	border: 1px solid #dcb ;
}


3) JavaScript : On l'appelle avec cette ligne dans la partie <head> :

 <script type="text/javascript" src="script.js"></script>


Le fichier script.js est assez simple à comprendre si on connait celui de la galerie simple : au lieu de tableau de liens, on fait un double tableau avec les numéros de galerie en deuxième dimension.


function displayPics()

{

var big_photo = new Array();

var photos= new Array();

var liens= new Array();

var titre_photo = new Array();

	

//Ce sont des 
	
for (var j=0 ; j <document.getElementsByName('galerie_mini').length; j++){
//Pour chaque galerie, (de la n°1 à la n°N avec N la longueur du tableau dans lequel on a mis les galerie_mini) on effectue la boucle	
	photos[j] = document.getElementsByName('galerie_mini')[j] ;

	// On récupère l'élément ayant pour name galerie_mini
	liens[j] = new Array();

	liens[j] = photos[j].getElementsByTagName('a') ;
	// On récupère dans une variable tous les liens contenu dans galerie_mini

	big_photo[j] = document.getElementsByName('big_pict')[j] ;

	// Ici c'est l'élément ayant pour name big_pict qui est récupéré, c'est notre photo en taille normale


	titre_photo[j] = document.getElementsByName('photo')[j].getElementsByTagName('dt')[0] ;

	// Et enfin le titre de la photo de taille normale

//}

//for (var j=0; j<2; j++){

	// Une boucle parcourant l'ensemble des liens contenu dans galerie_mini

	for (var i = 0 ; i < liens[j].length ; ++i) {

		// Au clique sur ces liens 
		//document.write(i+' '+j+'<br>');
		
		liens[j][i].name = j;

		liens[j][i].onclick = function() {

			big_photo[this.name].src = this.href; // On change l'attribut src de l'image en le remplaçant par la valeur du lien

			big_photo[this.name].alt = this.title; // On change son titre

			titre_photo[this.name].firstChild.nodeValue = this.title; // On change le texte de titre de la photo

			return false; // Et pour finir on inhibe l'action réelle du lien

		};

	}
	
}

}

window.onload = displayPics;



// Il ne reste plus qu'à appeler notre fonction au chargement de la page




Chez moi ça rend assez bien, tenez-moi au courant de vos résultats
Le principal responsable de cette jolie chose est Stéphane Aicardi, merci à lui.

(PS : c'est con, le i entrecrochet dans le code met toute la suite en italique...) Smiley langue [/i][/i]
Bonjour,
Ton script est bien Abie, mais
l'attribut "name" étant déprécié en XHTML,
window.onload pose problème si on clique sur un lien avant la fin du chargement
de la page, alors j'ai une autre proposition sans liste de définition :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<title>Galerie photo en xHTML CSS et JavaScript</title>

	  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" /> 
		<meta http-equiv="Content-Script-Type" content="text/javascript" />
		<meta http-equiv="Content-Language" content="fr" />
		
		<style type="text/css">
		body
		{
			margin: 0 ;
			padding: 0 ;
			font: 0.9em Georgia, serif ;
		}
		h1
		{
			margin: 15px 10px ;
			text-decoration: underline ;
			color: #dcb ;
		}
		
		p
		{
			line-height: 1.5em ;
			text-indent: 1em ;
			margin: 15px 10px ;
		}
		
		.galerie
		{
			width: 410px ;
			background: #eed ;
			border: 1px solid #dcb ;
			padding: 15px ;
			margin: 15px 30px ;
			text-align: center ;
		}
		
		.galerie a img
		{
			margin: 2px 1px ;
			border: 1px solid #dcb ;
		}
		
		.galerie p
		{
			font: italic 2.5em/1.5em Georgia, serif ;
			color: #dcb ;
		}
				
		.galerie img
		{
			border: 1px solid #dcb ;
		}
		</style>
		
		<script type="text/javascript">
function displayPics(e)
{
el=window.Event?e.target:event.srcElement;
if(!el.tagName)el=el.parentNode // pour NS6+
if(el.parentNode.parentNode.className=="galerie")
	{
	with(el.parentNode.parentNode)
		{
		for(c=0;c<childNodes.length;c++)
			{
			if(childNodes[c].tagName=="P")
				childNodes[c].firstChild.data=el.parentNode.title
			if(childNodes[c].tagName=="IMG"){
				with(childNodes[c]){
					src=el.parentNode.href;
					alt=el.parentNode.title;
					}
				}
			}
		}
	return false
	}
}	
document.onclick=displayPics
</script>
	</head>
	
	<body>
	<p><a href="http://css.alsacreations.com/Tutoriels-JavaScript/galerie-photo-javascript">Retour au tutoriel</a></p>
	<div class="galerie">
			<a href="images/photo1.png" title="Titre de la photo 1"><img src="images/minis/m_photo1.png" alt="Le titre de la photo 1" /></a>
			<a href="images/photo2.png" title="Titre de la photo 2"><img src="images/minis/m_photo2.png" alt="Le titre de la photo 2" /></a>
			<a href="images/photo3.png" title="Titre de la photo 3"><img src="images/minis/m_photo3.png" alt="Le titre de la photo 3" /></a>
		
			<p>Titre de la photo 1</p>
			<img src="images/photo1.png" alt="Photo 1 en taille normale" />
	</div>
	
	<div class="galerie">
			<img src="images/photo4.png" alt="Photo 4 en taille normale" />
			<p>Titre de la photo 4</p>
			<a href="images/photo4.png" title="Titre de la photo 4"><img src="images/minis/m_photo4.png" alt="Le titre de la photo 4" /></a>
			<a href="images/photo5.png" title="Titre de la photo 5"><img src="images/minis/m_photo5.png" alt="Le titre de la photo 5" /></a>
			<a href="images/photo6.png" title="Titre de la photo 6"><img src="images/minis/m_photo6.png" alt="Le titre de la photo 6" /></a>
		
	</div>
	
	</body>
</html>

Modifié par chmel (22 May 2006 - 00:10)
Salut,

Je ne comprend pas trop le bout de code javascript de notre ami chmel et j'aurais voulu savoir comment mettre les vignettes sur un autre div que celui où s'affiche l'image tout en réussissant à faire marcher ce script.
Est ce que quelqu'un aurait une idée?
Smiley biggrin Merci d'avance Smiley biggrin
Désolé, je pense mettre mal exprimé.
Je voulais dire : "Est ce que quelqu'un peut m'aider à modifier le code javascript de chmel afin qu'il marche en ayant l'image et le titre à afficher sur 1 div et les vignettes sur 1 autre?"
Smiley biggol
Bonjour,
plusieurs galeries utilisant le méme script
le script :
function displayPics(e)
{
// On récupère l'élément qui renvoi l'évènement
el=e?e.target:event.srcElement; 
// Si on tombe sur un noeud #text (Gecko) on remonte.
if(!el.tagName)el=el.parentNode 
// Si on tombe sur une vignette on remonte.
if(el.tagName=='IMG')el=el.parentNode 
// ça y est on est sur le lien
if(el.tagName=='A')var gl=el.parentNode.parentNode.parentNode
// on s'assure qu'on est dans la galerie
if(gl&&gl.className=="galerie")
	{
// renvoi l'information title
	gl.getElementsByTagName('DT')[0].firstChild.data=el.title
// Change la grande image
	gl.getElementsByTagName('DD')[0].firstChild.src=el.href;
// désactive le lien normal
	return false
	}
}	
document.onclick=displayPics;
document.onkeypress=function(e){
// Permet la navigation clavier
var t=e?e.which:event.keyCode;
if(t==13)displayPics(e)
}

Modifié par chmel (02 Oct 2006 - 15:01)
Administrateur
Abie a écrit :
(PS : c'est con, le i entrecrochet dans le code met toute la suite en italique...) Smiley langue

Le forum est au départ généraliste et pas "spécial codeur" donc l'indice i pour les tableaux est effectivement interprété comme de l'italique. Et s, b aussi mais c'est plus rare d'utiliser ces lettres-là comme variables Smiley smile
En préférant ii ou r ou X comme "--tableau[r]" pas de problème Smiley cligne
Felipe a écrit :

Le forum est au départ généraliste et pas "spécial codeur" donc l'indice i pour les tableaux est effectivement interprété comme de l'italique. Et s, b aussi mais c'est plus rare d'utiliser ces lettres-là comme variables Smiley smile
En préférant ii ou r ou X comme "--tableau[r]" pas de problème Smiley cligne

Bonjour, on peux aussi ajouter un espace qui ne changera pas le code JS
comme "--tableau[i ]"; mais le mieux serait que DEW améliore le décodeur
BBcode du forum - le wiki serait pas mal. Smiley smile
Pour rester dans le sujet, j'aimerai bien qu'on teste ce que j'ai proposé
plus haut Smiley biggrin
Modifié par chmel (12 Jun 2006 - 10:24)
A noter que j'avais déjà proposé une solution (à base d'ID, solution simple à mettre en place, très peu de modification du code d'origine)


C'est quelque part sur le forum, je vous laisser chercher, pas trop le temps.

(faudrait vraiment que je mette à jour le tuto pour expliquer...)
Modifié par Olivier (12 Jun 2006 - 11:56)
Dans la série "soyons fous" Smiley smile

Ze first etape = nickel ...

en imaginant d'utiliser jquery (pour refaire a la volee le squelette html qui accueille les photos) ...

http://icant.co.uk/sandbox/fjb/

voila l'idee ... admettons que j'ai xxxx galeries (ce qui sous entend soit une BDD, soit fichiers XML, ou dans le pire des cas, des url en dur), est il possible ou envisageable d'appeler les galeries AINSI ? (on retrouve le meme probleme de ID / CLASS, mais en terme de souplesse de mise en place, notamment sur un blog, on ne peut rever mieux)

La reponse peut etre NON Smiley smile