Bonjour les amis!

Je suis en train de réaliser une page avec un cascade d'image.
Pour chaque image de cette cascade(div class="cell"), j'aimerais lorsque l'on clique dessus, qu'une autre image apparaisse en fondu par dessus l'image que l'on vient de cliqué, et encore une autre si l'on clique à nouveau Smiley smile Une sorte de carroussel dans une même div en fondu et qui peut tourner en boucle.
Pour vraiment parfaire le code, si il est aussi possible de remettre l'image de départ lorsque l'on quitte le survol de la div concernée avec la souris (cad l'image présente avant toute action de clique).

Voici le code (j'ai mis que deux div "cell" mais à terme il y en aura beaucoup plus sur la page)
PS : comme vous le constaterez dans le code css, la gestion des images est en % car le site sera en responsive Smiley smile

<body>
<div class="container">
	
	<div class="cell">
	<a href="#">
	<img class="picture" src="images/start.jpg" />
	</a>
	</div>
	
	<div class="cell">
	<a href="#">
	<img class="picture" src="images/start.jpg" />
	</a>
	</div>
	
</div>
</body>


/************************************************************************************
WIDE SCREEN (min-width: 1680px)
*************************************************************************************/
@media screen and (min-width: 1921px) {
.container {
	width: 100%;
}
.cell {
	width: 25%;
	float: left;
}
.picture {
	width: 100%;
	height: auto;
}

}

/************************************************************************************
NORMAL (min-width: 1280px) and (max-width: 1679px)
*************************************************************************************/
@media screen and (min-width: 1281px) and (max-width: 1920px) {
.container {
	width: 100%;
}
.cell {
	width: 33.33%;
	float: left;
}
.picture {
	width: 100%;
	height: auto;
	z-index:1;
}

}

/************************************************************************************
SMALL SCREEN (min-width: 1024px) and (max-width: 1279px)
*************************************************************************************/
@media screen and (min-width: 641px) and (max-width: 1280px) {
.container {
	width: 100%;
}
.cell {
	width: 50%;
	float: left;
}
.picture {
	width: 100%;
	height: auto;
}

}

/************************************************************************************
SMALL MOBILE (max-width: 479px)
*************************************************************************************/
@media screen and (max-width: 640px) {
.container {
	width: 100%;
}
.cell {
	width: 100%;
	float: left;
}
.picture {
	width: 100%;
	height: auto;
}

}


body {
	margin-left: auto;
	margin-right: auto;
	text-align: center;
}

Modifié par tshinkiz (02 Nov 2013 - 03:06)
Hello tshinkiz,

Quelle est ta question exactement?

Ce que tu veux faire n'est pas possible en CSS, il te faudra développer en javascript ou trouver un plugin éxistant se rapprochant de l'effet souhaité.
Pourquoi ne pas utiliser un slider déjà conçu comme BxSlider ?

Tu es obligé d'utiliser Javascript et éventuellement JQuery pour ça. Et pas besoin de mettre des liens dans tes slides.

Essaye ça (j'ai commenté le code) :


<head>
	<!-- Indispensable d'appeler la librairie JQuery -->
	<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<div class="container">
	
	<div class="cell">
		<img class="picture" src="images/1.jpg" />
	</div>
	
	<div class="cell">
		<img class="picture" src="images/2.jpg" />
	</div>

	<div class="cell">
		<img class="picture" src="images/3.jpg" />
	</div>

	<div class="cell">
		<img class="picture" src="images/4.jpg" />
	</div>
	
</div>

<script type="text/javascript">
// Fonction au chargement de la page
$(function(){
	// On cache toutes les images
	$(".container .cell").css('display','none');
	// On affiche la première avec fondu
	$(".container .cell:first-child").fadeIn('slow'); 
});
// Gestion du clic
$(".cell").click(function(){
	// On cache l'image courante
	$(this).hide();
	// On récupère la diapo suivante
	suivante = $(this).next('.cell');
	// Si non définie, on retourne à la première avec fondu
	if(typeof(suivante.html()) == 'undefined') {
		$(".container .cell:first-child").fadeIn('slow'); 
	// Sinon on affiche la suivante avec fondu
	} else {
		suivante.fadeIn('slow');
	}
});
</script>

</body>

Modifié par JulienArcin (02 Nov 2013 - 08:19)
Merci pour vos réponses, mais mon problème n'est pas résolu! Smiley smile
En faite, j'aimerais que l'image affiché par défault soit "start" et que si l'on clique dessus, apparait en fondu l'image "1" dans la meme div, si on reclique l'image "2" dans la meme div, et que ca puisse tourner en boucle. C'est un mini slide qui tourne que si l'on clique sur l'image!
J'espere etre assez clair!

<body>
<div class="container">
	
<div class="cell">
<img class="picture" src="images/start.jpg" />
<img class="picture" src="images/1.jpg" />
<img class="picture" src="images/2.jpg" />
<img class="picture" src="images/3.jpg" />
<img class="picture" src="images/4.jpg" />
</div>
	
<div class="cell">
<img class="picture" src="images/start.jpg" />
<img class="picture" src="images/1.jpg" />
<img class="picture" src="images/2.jpg" />
<img class="picture" src="images/3.jpg" />
<img class="picture" src="images/4.jpg" />
</div>
	
</div>
</body>
Merci beaucoup mais ca ne répond pas précissément à ma demande! Smiley smile

En gros, dans le code présent ci dessous, j'ai m'a div="cell" dans la quelle se trouve affiché par défault ma première image nommé "start" avec caché dessous les images "2" et "3" peut etre en display:none, je ne sais pas. Je voudrais que lorsque l'on clique avec la souris sur cette image, apparaisse en fondu mon image "2" dans cette même div "cell", si on reclique apparait en fondu l'image "3" et que ca tourne en boucle en repassant par l'image start si on reclique encore. C'est sorte de carrousel manuel en cliquant directement sur les images.
Il faut savoir que sur ma page, il va y avoir plusieurs balise "cell" avec un nombre d'image à regarder en cliquant qui ne sera pas toujours le même donc le script js doit pouvoir s'adapter à cette caractéristique.

Pour compléter cette fonction, ce qui serait encore plus fou: si on a fait défilé des images à l'intérieur de la div="cell" et que l'on s'est arreté sur l'image "2", il serait génial que le script js permettent de réafficher l'image par défault au bout de 5 secondes, c'est à dire l'image nommée "start".

En tout les cas merci beaucoup de votre aide, c'est vraiment gentil! Je sais qu'avec le pauvre bout de code que je vous donne, tout est à faire mais je suis vraiment une bille en javascript! Smiley smile


<div class="cell">
<img class="picture" src="images/start.jpg" />
<img class="picture" src="images/2.jpg" />
<img class="picture" src="images/3.jpg" />
</div>
Bonjour tshinkiz.

J'ai voulu mettre mon test dans un JSFIDDLE, mais je ne sais pas pourquoi, cela ne fonctionne pas. Impossible d'activer le Javascript ?!?!
Donc je donne ma solution qui a été réalisé en Javascript et non en Jquery !

La première image est le "start.jpg" ! A chaque clic, tu avances d'une image.
Mais par contre, je ne suis pas arrivé à faire le onmouseout avec le onclick en même temps.
A chaque clic, les deux s'activent et du coup, plus rien ne fonctionne !
Et pourtant, le onclick est sur l'image et le onmouseout sur la balise article.

Donc voici le résultat du html :
<section id="container">
    <article>
        <img src="http://www.chez-smiley.be/rubriques/wallpapers/images/animaux/chatons/1/chatons_022_1024x768.jpg" />
        <img src="http://chatetvous.c.h.pic.centerblog.net/o/b45fed6d.jpg" />
		<img src="http://lusile17.l.u.pic.centerblog.net/o/293005ca.jpg" />
		<img src="http://www.unesourisetmoi.info/wallpaper_13/images/chats-et-chatons-01.jpg" />
    </article>

    <article>
        <img src="http://www.coloriages-enfants.com/rubrique-animaux/images/fonds-ecran/chats/chats-10.jpg" />
        <img src="http://www.unesourisetmoi.info/wallpaper_13/images/chats-et-chatons-02.jpg" />
    </article>
</section>

Voici le code CSS :
body {
		background-color	: lightyellow;
}

section {
		background-color	: lightblue;
		width				: 404px;
		height				: 150px;
		margin				: 25px auto 0 auto;
}

section article {
		display				: inline-block;
		background-color	: lightpink;
		width				: 200px;
		height				: 150px;
}

section article img {
		display				: none;
		margin				: 0 auto;
		width				: 200px;
		height				: 150px;
}

Et pour finir, le plus important, le JavaScript.
var manege = {

bloc:   null,			/* les blocs "article"             */
node:   new Array(),	/* les images par blocs            */
indice: new Array(),	/* un pointeur sur l'image du bloc */

init: function ()
{
	this.bloc = document.getElementById("container").getElementsByTagName("article");

	for (var z=0; z<this.bloc.length; z++)
	{
		this.indice[z] = 0;
		this.node[z]   = this.bloc[z].getElementsByTagName("img");

		for (var y=0; y<this.node[z].length; y++)
			this.node[z][y].addEventListener("click", (function (x) {return function () {manege.affiche(x)};})(z), false);

		this.node[z][0].style.display = "block";
	}
},

affiche: function (rang)
{
	this.node[rang][this.indice[rang]].style.display = "none";
	if (++(this.indice[rang]) >= this.node[rang].length) this.indice[rang] = 0;
	this.node[rang][this.indice[rang]].style.display = "block";
}
};

window.onload = function () { manege.init (); }

Cela a été testé sur les principaux navigateurs sous windows 7 pro et cela fonctionne correctement.

@ JulienArcin : j'ai recopié ton code, tel quel, et il ne fonctionne pas.

@+
Bonjour,

pour ce qui est du click, voici un exemple minimaliste :
http://codepen.io/gcyrillus/pen/ksvaw
et variantes toutes sur le même principe, tu fait la mise en forme que tu veut (surement plus chouette que les exemples) :
http://codepen.io/gcyrillus/pen/nvfHy
http://codepen.io/gc-nomade/pen/EfkJK
http://codepen.io/gc-nomade/pen/jIbHA

Pour l'effet de hover, il serait possible d'ajouter une transition retardé, cependant pour réinitialiser le 'carroussel', il faudra cliquer jusqu’à la dernière ou donner le focus a un autre element. http://codepen.io/gc-nomade/pen/emuiE

Multiplier les 'conditions' d'interaction, entre autre click + hover, n'est pas forcement une bonne idée ... y'a forcement un télescopage a un moment ou un autre.
Re bonjour à toutes et à tous.

Je viens de trouver comment faire avec le onmouseout !

Vis-à-vis du JavaScript que je vous ai donné ci-dessus, il faut modifier la ligne "click" et ajouter la ligne "mouseout"; comme ci-après :
for (var y=0; y<this.node[z].length; y++)
		{
			this.node[z][y].addEventListener("click", (function (x) {return function (event) {manege.affiche(event, x)};})(z), false);
			this.bloc[z].addEventListener("mouseout", (function (x) {return function (event) {manege.reinit(event, x)}; })(z), false);
		}

Et vous ajoutez la méthode reinit suivante :
reinit: function (event, rang)
{
	var cible = event.relatedTarget.tagName;

	if (cible != "IMG")
	{
		this.node[rang][this.indice[rang]].style.display = "none";
		this.indice[rang] = 0;
		this.node[rang][this.indice[rang]].style.display = "block";
	}
}
};

Ne pas oublier de mettre la virgule après la parenthèse fermante de la méthode affiche.

Comparativement à ce que je propose, cela fonctionne, mais coté esthétique, la solution de gc-nomade est bien plus belle !

@+
Modifié par tournikoti (03 Nov 2013 - 14:28)