Un sous-menu eXtra Large avec jQuery

6 6 6
mars mars

Assez des menus déroulants qui se positionnent au-dessus des contenus et souvent peu esthétiques ? Je vous propose un petit tutoriel pour faire un sous-menu qui donnera une autre dimension à vos pages.

Beaucoup de sites utilisent une large bande qui court de gauche à droite avec souvent une liste de liens les uns à côté des autres et la technique la plus utilisée pour faire des sous-menu est un menu déroulant qui vient couler sous le lien en superposant au contenu du dessous. Personnellement, je trouve cela pas très agréable graphiquement ou dans de rares cas. Voici un article sur le sujet sur Smashing Magazine.

J’ai déjà expérimenté le menu que je vais vous présenter sur un site qui sera bientôt ajouté dans le portfolio, mais il était plus complexe grâce au concours du légendaire Fabien, qui si il passe par ici, ne me maudira pas trop en voyant cet article j’espère. En effet il existe de nombreuses façon de réaliser cet effet et la mienne n’est surement pas la plus optimisée, mais elle a le mérite de fonctionner.

Voici la démonstration du menu
Et le pack à télécharger.

Dans cet exemple il faudra cliquer sur le lien pour faire apparaître le sous menu et le fermer, mais il serait tout à fait possible de faire l’effet en hover.

Rentrons un peu dans les détails de la structure de ce menu. L’idée est de repousser tout le contenu de la page pour faire apparaître le sous-menu.
La méthode que j’ai utilisé est de créer des zones pour chaque parties de la structure, une pour le header (menu principal), une pour le sous-menu et enfin une pour le contenu.
La seule complexité étant que j’ai associé le sous-menu à la liste du menu principal, donc la zone du menu est vide… Voyez plutôt la structure HTML :


fleur

Le menu large

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

On distingue bien les 3 zones de la page.
Pour bien positionner les div du sous-menu, nous allons la placer en absolute par rapport au header et de façon à ce qu’elles se retrouvent juste sous le menu principal. Le menu principal est donc placé avec un float:right et l’autre avec un right:0. Les boutons pourront donc s’étaler sur toute la largeur de la page.

Voici d’ailleurs le CSS complet :

/*-----------------Patie générique------------------*/
body {
	margin:0;
	font-family:Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif;
}
h2 { margin-top:0; }
a {
	text-decoration:none;
	outline:none;
}
ul {
	padding:0;
	margin:0;
}
li { list-style:none; }
a.titre {
	float:left;
	width:180px;
	color:#6d8a20;
	font-size:36px;
	line-height:48px;
	font-weight:normal;
}
/*-----------------Patie menu principal------------------*/
#wrap_header {
	width:100%;
	height:50px;
	background:#91b439;
	border-top:1px solid #aad246;
	border-bottom:1px solid #6d8a27;
}
#header {
	width:950px;
	height:50px;
	margin:0 auto;
	position:relative;
}
#header ul {
	float:right;
	border-left:1px solid #6d8a27;
	border-right:1px solid #aad246;
}
#header li {
	padding:0;
	float:left;
	height:50px;
	line-height:50px;
	border-left:1px solid #aad246;
	border-right:1px solid #6d8a27;
}
#header li a {
	display:block;
	color:#fff;
	padding:0 30px;
	height:50px;
}
#header li a.down {
	padding-left:40px;
	background:url(../images/puce.gif) 20px center no-repeat;
}
#header li a:hover { background:#aad246; }
#header li a.down:hover,
#header li a.active { background:#aad246 url(../images/puce.gif) 20px center no-repeat; }

/*-----------------Patie sous-menu------------------*/
#header li div {
	position:absolute;
	top:52px;
	right:0;
}
#header li div ul {
	border:none;
	border-left:1px solid #fff;
	margin-left:0;
}
#header li div li {
	border:none;
	border-right:1px solid #fff;
}
#header li div a {
	height:20px;
	line-height:20px;
	color:#474747;
	height:49px;
	line-height:49px;
	float:left;
}
#header li div a:hover {
	background:none;
	color:#6d8a27;
}

#wrap_menu {
	width:100%;
	height:0px;
	background:#ddd;
}
/*-----------------Patie Contenu------------------*/
#wrap_body {
	width:100%;
	background:url(../images/degr.png) repeat-x;
	height:200px;
	border-top:1px solid #fff;
}
#body {
	width:950px;
	margin:0 auto;
	padding:30px 0;
}
#body img {
	float:right;
	margin-left:10px;
}

Rien de bien compliqué. Alors je passe au javascript que j’ai commenté au fur et à mesure (il utilise jQuery qu’il faudra appeler bien sûr) :

$(document).ready(function () {
	$("#header li div").hide(); //Cache les sous-menus

	$(".down").click( function (){ //Quand on clique sur les liens avec la class 'down'
		if ($(this).next("div").hasClass ("open")) { //Si le sous-menu du lien cliqué est ouvert
			$(this).removeClass ("active"); //On retire la class active du lien
			$(this).next("div").removeClass ("open").stop(true, true).fadeOut ( function () { //On retire la class open du sous-menu et on le fait disparaître
				$("#wrap_menu").animate ({ //Puis on ferme l'espace sous-menu
					height: 0 + "px"
				}, 500);
			});
		}
		else { //Si le sous-menu n'est pas ouvert
			if ($("#header li div").hasClass ("open")) { //Mais qu'un autre sous-menu est ouvert
				$(".active").removeClass ("active"); //On retire la class active de l'autre lien
				$(this).addClass ("active"); //Qu'on place sur celui-ci
				$(".open").fadeOut ("fast").removeClass ("open"); //On fait disparaître l'autre sous-menu et on retire sa class open
				$(this).next("div").addClass ("open").fadeIn("slow"); //Et on fait apparaître celui ciblé
			}
			else { //Si aucun sous-menu n'est ouvert
				$(this).addClass("active"); //On ajoute la class active au lien
				$(this).next("div").addClass ("open").fadeIn(2000); //Et la class open au sous-menu qu'on fait apparaître
				$("#wrap_menu").animate({ //En même temps on ouvre l'espace sous-menu
					height: 50 + "px"
				}, 500);
			}
		}
		return false; //'Désactive' les liens du menu principal avec la class down
	});
});

menu

J’espère que cet article vous aura inspiré, et si vous avez d’autres façons de faire ce menu XL, n’hésitez pas à les partager !
A bientôt !

Une galerie scrollable draggable avec jQueryUI

2 2 2
mars mars


Un script détaillé de A à Z, pour construire une petite galerie d’image dont on déplace les images en les faisant glisser.

On m’a fait la remarque que les scrollable dans les festins de webdesign et sur le portfolio n’était pas visible, alors j’ai cherché un autre moyen de faire ces galeries. Aujourd’hui nous allons détailler l’intégration d’une galerie, dont le système se rapproche du carrousel mais qui ne fait pas de boucle (à voir dans une prochaine version peut-être) et qui au lieu de cliquer, s’anime en ‘draggant’ les images.

Tout d’abord rendez-vous sur le site de jQuery si vous souhaitez en savoir plus sur cette fabuleuse bibliothèque javascript.
Puis faites un tour sur jQuery UI pour approfondir et multiplier les possibilités d’animations.

Attaquons maintenant notre tutoriel :
La démonstration
Le pack à télécharger

Commençons par notre page HTML, et en particulier les appels javascript, ici nous pointons vers les versions jQuery en ligne, mais vous pouvez les télécharger sur le site. settings.js sera le script dans lequel on va mettre notre code.




Et dans le body voici la structure simplicime autour de laquelle nous allons construire notre galerie. Une liste, une classe, peut-on faire plus simple ?

Avec si peu de HTML, le CSS n’est pas copieux non plus :

body {
	margin:0;
	background:#eee;
}
#container {
	width:709px;
	margin:100px auto;
}
.images {
	margin:0;
	padding:0;
}
.images li {
	list-style:none;
	padding:0;
	margin:0;
	float:left;
	width:709px;
	height:500px;
	cursor:e-resize; /*On détourne ce picto pour signaler la possibilité de déplacer*/
}

A ce stade vous devez avoir une belle liste d’image les unes en dessous des autres.
Nous allons maintenant attaquer le coeur de cet article, le script. Je vous le commente au fur et à mesure pour bien détailler chaque étape.

$(document).ready(function () {
    Vignette = $(".images li:visible"); //On prend cette vignette comme repère
    NbVignette = $(".images li").length; //On cacule le nombre de vignette

	$(".images")
	    .wrap(' ici vous ouvrez et fermez une balise div avec la classe .scrollable ') //On encadre la liste d'une div
	    .css("width", (Vignette.width() * NbVignette) ); //et on élargi la liste en fonction du nombre de vignettes

	$(".scrollable") //On définit les attributs de la div
	    .width( Vignette.width() )
	    .height( Vignette.height() )
	    .css("overflow", "hidden")

    i = 0; //Ce chiffre va nous permettre de savoir quelle vignette afficher
	var position = 0;

	$(".images").draggable({
		axis: 'x', //sur l'axe horizontal
		distance: 30, //Il faut déplacer l'image sur au moins 30 pixels

		stop: function(event, ui) { //à la fin du drag
			if(ui.position.left < position) { //si la position est négative par rapport à la précédente
				if (i < (NbVignette - 1)) { //si on n'est pas à la dernière vignette
				 	i++;
					position = -(Vignette.width() * i);
				 	$(".images").animate({
				 		left: position
				 	});
				}
				else { // Si on on est à la dernière vignette
					$(".images").animate({
						left: position
					});
				}
	        }
			else { //si la position est positive par rapport à la précédente
				if(i > 0) { //Si on n'est pas à la première vignette
					i--;
					position = -(Vignette.width() * i);
					$(".images").animate({
						left: position
					});
				}
				else { // Sinon on est à la première vignette
					$(".images").animate({
						left: position
					});
				}
	        }
        }
    });
});

Voilà ce n’était pas bien long.
Merci Fabien pour ta modification, l’effet est encore meilleur !

J’espère que ça vous a plu, à bientôt pour des nouveaux trucs.

Festin de Webdesign #2

1 1 1
mars mars

Une nouvelle galerie de sites remarquables pour se régaler les yeux et savourer de délicieuses mises en page. Bon appétit.

Catfish Deluxe Le site

gdzilla Smash Le site

Fubiz Interactive Le site

Tori’s Eye Le site

NewGenCoal Le site

Cliframework Le site

Un dragon en CSS uniquement, GROOAR…

27 27 27
février février

Un nouveau tutoriel CSS 3 pour faire une illustration sans passer par un logiciel de graphisme, cette fois nous allons construire un dragon, en utilisant toujours plus de CSS 3 et toujours plus de détails !

Je vais moins détailler les différentes étapes dans ce tutoriel, car le déroulement est globalement le même que pour le blob, je ne m’attarderai pas non plus que les 2 premiers attributs CSS 3 que nous avons précédemment vu (les dégradés et les border-radius), pour les revoir je vous envoie vers le tuto du blob.

Pour commencer voici l’aperçu et le tout compris :
La démonstration
Le pack à télécharger

Pour ce dragon nous allons introduire 2 nouveautés CSS : transform et shadow.
L’attribut transform permet une bonne quantité d’effet à lui tout seul, en effet vous allez pouvoir effectuer une modification sur élément comme un déplacement, une rotation… C’est un peu comme dans Illustrator la fonction transformation. Ici nous allons seulement effectuer un ‘rotate’ qui applique une simple rotation, mais si vous voulez voir tout ce dont le transform est capable je vous invite à lire cette page de Mozilla (même si elle site le webkit c’est surtout pour les utilisateurs de firefox).

Voici ce que donne une rotation de 30° dans votre CSS :

#rotate {
	-webkit-transform: rotate(30deg);
	-moz-transform: rotate(30deg);
}

Rien de bien sorcier, comme on aime. Voyons maintenant les ombres portées en CSS.

C’est pas bien compliqué non plus, il suffit d’indiquer la couleur hexadécimale dont vous souhaitez partir (vous pouvez donc faire une lumière plutôt qu’une ombre) et vous indiquez à la suite 3 valeurs, dans l’ordre : la distance horizontale, la distance verticale et la taille de l’ombre.

#shadow {
	-webkit-box-shadow: #879d20 0 5px 5px;
	-moz-box-shadow: #879d20 0 5px 5px;
	box-shadow: #879d20 0 5px 5px;
}

L’inconvénient c’est qu’on ne peut pas mettre de valeur en pourcentage apparemment.

Je vous mets à présent la structure HTML que je vais commenter au fur et à mesure. (excusez encore la non-indentation… ^^’)

Encore une fois nous avons beaucoup de zones en overflow:hidden qui nous permettent de ne faire apparaître ce qui nous intéresse.

Sans plus attendre voici le copieux CSS, commenté pour vous y retrouver un peu.
Une chose importante à prendre en compte, toutes les tailles sont en pourcentage et sont relatives à celle de #dragon vous pouvez donc afficher un dragon de 50px ou 10 000px sans problème. Il suffit de remplacer les taille de #dragon.

body {
	margin:0;
}
.relative {
	position:relative;
	width:100%;
	height:100%;
}
#dragon {
	position:relative;
	width:400px;/*Valeur à modifier si vous voulez changer la taille générale du dragon*/
	height:400px;/*Idem que width*/
	margin-top:10%;/*A modifier où enlever pour positionner autrement dans la page*/
	margin-left:35%;/*Idem pour la position*/

}
#corps {
	position:relative;
	float:right;
	width:75%;
	height:100%;
	background:#bfd12b;
	-webkit-border-radius: 50% 50% 10% 0;
	-moz-border-radius: 50% 50% 10% 0;
	border-radius: 50% 50% 10% 0;
	z-index:10;/*Indique le niveau du plan pour les superpositions*/
}

/*_________________________ YEUX _______________________*/
#oeil_gch,
#oeil_drt {
	position:absolute;
	overflow:hidden;
}
#oeil_gch .fond,
#oeil_gch .lumiere,
#oeil_gch .pupille,
#oeil_gch .lentille,
#oeil_gch .rond,
#oeil_gch .reflet1,
#oeil_gch .reflet2,
#oeil_drt .fond,
#oeil_drt .lumiere,
#oeil_drt .pupille,
#oeil_drt .lentille,
#oeil_drt .rond,
#oeil_drt .reflet1,
#oeil_drt .reflet2 {
	position:absolute;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
}
#oeil_gch {
	width:20%;
	height:15%;
	-webkit-transform: rotate(30deg);/*On fait tourner l'oeil dans son entier*/
	-moz-transform: rotate(30deg);
	top:20%;
	right:55%;
	border-top:2px solid #879d20;
}
#oeil_gch .fond {
	width:100%;
	height:100%;
	bottom:15%;
	left:0;
	background:#a3b726;
}
#oeil_gch .lumiere {
	width:100%;
	height:100%;
	bottom:5%;
	left:0;
	background:#d9ed38;
}
#oeil_gch .pupille {
	width:100%;
	height:100%;
	bottom:10%;
	left:0;
	background:#fff;
}
#oeil_gch .lentille {
	width:75%;
	height:75%;
	top:12.5%;
	left:20%;
	background:#f69154;
	background: -webkit-gradient(
	    linear,
	    left bottom,
	    left top,
	    color-stop(0.50, #fcbb56),
	    color-stop(0.75, #f78122)
	);
	background: -moz-radial-gradient(
	    center,
	    #fcbb56 50%,
	    #f78122 75%
	);
}
#oeil_gch .rond {
	width:25%;
	height:25%;
	top:37.5%;
	left:50%;
	background:#4c4c4c;
}
#oeil_gch .reflet1 {
	width:40%;
	height:40%;
	background:#fff;
	top:15%;
	left:20%;
}
#oeil_gch .reflet2 {
	width:20%;
	height:20%;
	background:#fff;
	top:43%;
	left:70%;
}
#oeil_drt {
	width:20%;
	height:15%;
	-webkit-transform: rotate(-30deg);
	-moz-transform: rotate(-30deg);
	top:20%;
	right:3%;
	border-top:2px solid #879d20;
}
#oeil_drt .fond {
	width:100%;
	height:100%;
	bottom:15%;
	left:0;
	background:#a3b726;
}
#oeil_drt .lumiere {
	width:100%;
	height:100%;
	bottom:5%;
	left:0;
	background:#d9ed38;
}
#oeil_drt .pupille {
	width:100%;
	height:100%;
	bottom:10%;
	right:0;
	background:#fff;
}
#oeil_drt .lentille {
	width:75%;
	height:75%;
	top:12.5%;
	right:20%;
	background:#f69154;
	background: -webkit-gradient(
	    linear,
	    left bottom,
	    left top,
	    color-stop(0.50, #fcbb56),
	    color-stop(0.75, #f78122)
	);
	background: -moz-radial-gradient(
	    center,
	    #fcbb56 50%,
	    #f78122 75%
	);
}
#oeil_drt .rond {
	width:25%;
	height:25%;
	top:37.5%;
	right:50%;
	background:#4c4c4c;
}
#oeil_drt .reflet1 {
	width:40%;
	height:40%;
	background:#fff;
	top:2%;
	left:18%;
}
#oeil_drt .reflet2 {
	width:20%;
	height:20%;
	background:#fff;
	top:58%;
	left:32%;
}

/*_________________________ BOUCHE _______________________*/
#bouche {
	position:absolute;
	overflow:hidden;
	width:80%;
	height:30%;
	top:36%;
	right:0;
}
#bouche .fond {
	position:absolute;
	width:200%;
	height:300%;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
	background:#553c11;
	bottom:-100%;
	left:0;
}
#bouche .surfond {
	position:absolute;
	width:200%;
	height:300%;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
	background:#fff;
	bottom:-100%;
	left:80%;
}
#bouche .dent1,
#bouche .dent2,
#bouche .dent3,
#bouche .dent4,
#bouche .dent5,
#bouche .dent6 {
	position:absolute;
	width:50%;
	height:90%;
	background:#bfd12b;
	-webkit-transform: rotate(45deg);
	-moz-transform: rotate(45deg);
	z-index:150;
}
#bouche .dent4,
#bouche .dent6 {
	background: -webkit-gradient(
	    linear,
	    left bottom,
	    left top,
	    color-stop(0.50, #fcbb56),
	    color-stop(0.75, #f78122)
	);
	background: -moz-linear-gradient(
	    bottom right,
	    #bfd12b 80%,
	    #9ead24 90%
	);
}
#bouche .dent5 {
	background: -webkit-gradient(
	    linear,
	    left bottom,
	    left top,
	    color-stop(0.50, #fcbb56),
	    color-stop(0.75, #f78122)
	);
	background: -moz-linear-gradient(
	    bottom right,
	    #bfd12b 70%,
	    #9ead24 85%
	);
}
#bouche .dent1 {
	top:-65%;
	left:0%;
}
#bouche .dent2 {
	top:-65%;
	left:45%;
}
#bouche .dent3 {
	top:-80%;
	left:75%;
}
#bouche .dent4 {
	top:90%;
	left:-5%;
}
#bouche .dent5 {
	top:80%;
	left:30%;
}
#bouche .dent6 {
	top:85%;
	left:70%;
}

/*_________________________ VENTRE _______________________*/
#ventre {
	position:absolute;
	right:5%;
	bottom:0;
	width:65%;
	height:30%;
	background:#a7ba26;
	-webkit-border-radius:50%;
	-moz-border-radius:20% 20% 20% 0;
	border-radius:50%;
}
#ventre .bande1,
#ventre .bande2 {
	width:100%;
	height:5%;
	position:absolute;
	top:35%;
}
#ventre .bande2 {
	top:65%;
}
#ventre .bande_ombre,
#ventre .bande_lumiere {
	width:100%;
	height:50%;
	background:#95a622;
	float:left;
}
#ventre .bande_lumiere {
	background:#b9d32b;
}

/*_________________________ PATTES _______________________*/
#pattes .pied_gch,
#pattes .pied_drt {
	width:30%;
	height:15%;
	position:absolute;
	bottom:0;
	right:55%;
}
#pattes .pied_drt {
	right:-20%;
}
#pattes .orteil1,
#pattes .orteil2,
#pattes .orteil3 {
	position:absolute;
	width:35%;
	height:100%;
	-webkit-border-radius:50% 50% 0 0;
	-moz-border-radius:50% 50% 0 0;
	border-radius:50% 50% 0 0;
	background:#bfd12b;
	background: -webkit-gradient(linear, left top, left bottom, from(#4a6378), to(#ccc), color-stop(0.5, #fff), color-stop(0.5, #6d94b4));
	background: -moz-linear-gradient(left, #879d20 5%, #bfd12b);

}
#pattes .orteil1 {
	z-index:100;
	left:0;
}
#pattes .orteil2 {
	z-index:75;
	left:30%;
}
#pattes .orteil3 {
	z-index:50;
	left:60%;
}
#pattes .ongle {
	position:absolute;
	bottom:0;
	left:40%;
	width:75%;
	height:30%;
	background:#eee;
	-webkit-border-radius:50% 50% 0 0;
	-moz-border-radius:50% 50% 0 0;
	border-radius:50% 50% 0 0;
}

/*_________________________ ECAILLES _______________________*/
.ecaille1,
.ecaille2,
.ecaille3,
.ecaille4,
.ecaille5 {
	width:10%;
	height:7.5%;
	position:absolute;
	background:#bfd12b;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
	-webkit-box-shadow: #879d20 0 5px 5px;
	-moz-box-shadow: #879d20 0 5px 5px;
	box-shadow: #879d20 0 5px 5px;
}
.ecaille1 {
	top:20%;
	left:10%;
}
.ecaille2 {
	top:65%;
	left:15%;
}
.ecaille3 {
	top:65%;
	left:87%;
}
.ecaille4 {
	top:80%;
	left:0%;
}
.ecaille5 {
	top:5%;
	left:60%;
}

/*_________________________ QUEUE _______________________*/
#queue {
	position:relative;
	float:left;
	width:25%;
	height:50%;
	top:50%;
	overflow:hidden;
}
#queue .queue {
	position:absolute;
	bottom:0;
	width:200%;
	height:100%;
	background:#bfd12b;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
}
#queue .masque {
	position:absolute;
	width:100%;
	height:50%;
	left:50%;
	top:-3%;
	background:#fff;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
}

/*_________________________ FLAMME _______________________*/
#flamme {
	position:absolute;
	width:50%;
	height:20%;
	right:-40%;
	top:36%;
	/*-webkit-transform: rotate(150deg);
	-moz-transform: rotate(150deg);*/
	z-index:100;
}
#flamme .flamme_gch,
#flamme .flamme_drt {
	width:50%;
	height:100%;
	float:left;
	overflow:hidden;
	position:relative;
}
#flamme .flamme_gch .feu {
	width:200%;
	height:200%;
	position:absolute;
	top:30%;
	left:0;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
	background:#f69154;
}
#flamme .flamme_gch .masque {
	width:400%;
	height:400%;
	position:absolute;
	top:70%;
	left:-100%;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
	background:#fff;
}
#flamme .flamme_drt .feu {
	width:200%;
	height:200%;
	position:absolute;
	bottom:30%;
	right:0;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
	background:#f69154;
	background: -webkit-gradient(linear, left top, left bottom, from(#4a6378), to(#ccc), color-stop(0.5, #fff), color-stop(0.5, #6d94b4));
	background: -moz-linear-gradient(left, #f69154 60%, #ffce57);
}
#flamme .flamme_drt .masque {
	width:400%;
	height:400%;
	position:absolute;
	bottom:70%;
	right:-100%;
	-webkit-border-radius:50%;
	-moz-border-radius:50%;
	border-radius:50%;
	background:#fff;
}

Et voilà le résultat :

C’est assez long comme vous pouvez le voir, mais le résultat c’est un dragon sympa, que vous pouvez positionner où vous voulez (sur fond uni), à la taille que vous voulez.

A bientôt pour un autre tutoriel d’illustration CSS !

Pseudo-class :target (suite), faisons un carrousel seulement en CSS

26 26 26
février février

Carrousel

Continuons notre petit tour d’horizon des possibilités de la pseudo-class :target avec un carrousel d’images ou de contenus.

Vous connaissez le principe du carrousel, Une série de contenus que dont on affiche un nombre limités d’éléments et qu’on fait défiler. ça se fait en 2 temps trois mouvement avec des effets de la mort en veux-tu en voilà… Mais en CSS, qu’en pensez-vous ? Vous n’utiliserez surement pas cette technique, mais c’est toujours bon de la connaitre.

Voici la solution que je vous propose :
La démonstration
Le Pack à télécharger

La technique que nous allons utiliser est une imbrication de div qui vont nous permettre de masquer les éléments au fur et à mesure. Nous attribuerons des id à chacune des div afin que à chaque fois que nous cliquerons sur un lien nous pourrons facilement désigner une ‘ancre’ avec :target dont nous cilqueront des éléments en particulier.
Pour résumer, Nous allons créer une div pour chaque évènement que nous voulons effectuer (avancer et reculer dans le carrousel).

Ce qu’il faut garder en tête, c’est qu’on ne peut cibler qu’un seul élément puisqu’il s’agit d’un élément avec un id, et vous le savez on ne met qu’un id par élément et on ne les répète pas ! Par conséquent on désigne plusieurs éléments en ciblant le conteneur.

La contrainte étant que plus avez d’éléments dans votre carrousel et plus vous aurez de niveaux à intégrer, ici nous allons faire un exemple avec 4 bloc de texte, dont voici la structure HTML (contrairement à mon highlighter, indentez bien votre code pour vous y retrouver dans cette pyramide) :

Hello Salut Comment va ? Bien, merci !

Si comme dans notre exemple vous voulez faire avancer le carrousel d’un élément à la fois, nous aurons autant de liens que d’éléments. Pour 4 éléments : 4 liens avancer et 4 liens reculer. En comptant bien le lien nul pour le début et la fin, sauf si vous voulez faire une boucle.

Voici le CSS qui nous sert en bonne partie pour habiller le site, la partie intéressante étant celle qui énumère les listes d’action :target.

body { margin:0; }
#container {
	width:700px;
	margin:50px auto;
}
a {
	text-decoration:none;
	font-weight:bold;
	color:#47817f;
	float:left;
	line-height:300px;
	text-align:center;
}
a:hover {
	color:#fff;
	background:#aaa;
}
#bloc {
	width:680px;
	padding:10px;
	background:#eee;
	border-bottom:3px solid #aaa;
	float:left;
}
#link_prev, #link_next,
#link_prev a, #link_next a,
#link_prev span, #link_next span {
	width:20px;
	float:left;
	height:300px;
}
#link_prev, #link_next { overflow:hidden; }
#link_prev a, #link_next a,
#link_prev span, #link_next span {
	text-align:center;
}/*La partie intéressante débute ici...*/
#bloc_open_2:target .a1,
#bloc_open_3:target .a2, #bloc_open_3:target .a1,
#bloc_open_4:target .a3, #bloc_open_4:target .a2, #bloc_open_4:target .a1,
#bloc_close_4:target .a2, #bloc_close_4:target .a1,
#bloc_close_3:target .a1 {
	display:none;
}
#bloc_close_4:target .a3,
#bloc_close_3:target .a2, #bloc_close_3:target .a3,
#bloc_close_2:target .a1 {
	display:block;
}/*Jusqu'ici.*/
#img .a4 { background:#f00; }
#img .a3 { background:#0ff; }
#img .a2 { background:#f0f; }
#img .a1 { background:#ff0; }
#img {
	width:640px;
	height:300px;
	overflow:hidden;
	float:left;
}
#img span {
	text-align:center;
	line-height:300px;
	float:left;
	width:310px;
	height:300px;
	margin:0 5px;
}

Et voilà cette technique est relativement simple même si peu pratique, mais je la trouve intéressante.

Si vous avez d’autres idées pour construire un carrousel ou utiliser la pseudo-class :target, n’hésitez pas à nous les faire partager !

A bientôt.