Créez une fenêtre modale avec CSS et jQuery

Date de publication : 04 mars 2011.

Par Soh Tanaka (SohTanaka)
 Didier Mouronval (Traducteur)
 

Cet article est la traduction de l'article : Inline Modal Window w/ CSS and jQuery. Retrouvez toutes les traductions de Soh Tanaka disponibles sur http://sohtanaka.developpez.com/.
Tout au long de cet article, l'auteur vous présente une méthode permettant de créer une popup CSS du même style que celles utilisées par la bibliothèque Lightview.
28 commentaires Donner une note à l'article (4.5)

Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us MySpace Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Windows Live Favorites      



Présentation
La structure HTML
La mise en forme avec le CSS
Mise en place de jQuery
La touche finale : le code jQuery
Démo et conclusion
Remerciements


Présentation

Il existe de nombreux scripts de fenêtres modales (de type pop-up) simples à implémenter et élégantes. Mais la plupart du temps, ces scripts peuvent rentrer en conflit avec la logique propre de la page.
J'ai été récemment confronté à un cas où il m'était impossible d'utiliser les scripts comme en fancybox ou en prettyPhoto. J'ai donc dû développer ma propre fenêtre modale pour y insérer du code (X)HTML.
Je vais vous expliquer comment j'ai procédé.

Voir une démo en ligne


La structure HTML

Commençons par ajouter une balise <a> avec les attributs suivants :

  • href - #?w=500 : spécifie la largeur de la fenêtre ;
  • rel : définit la relation avec la pop-up à ouvrir ;
  • class="poplight" : classe CSS pour gérer les pop-up.

<a href="#?w=500" rel="popup_name" class="poplight">En savoir plus</a>
Ensuite, nous ajoutons le code (X)HTML des fenêtres.
Vous pouvez les placer où vous voulez dans la page, pour ma part, j'ai opté pour les mettre en fin de code.
Notez bien que l'attribut id correspond à l'attribut rel de la balise <a>. Cela permet d'établir la relation entre le lien et la fenêtre correspondante.

<div id="popup_name" class="popup_block">
	<h2>Developpez.com</h2>
	<p>Soh Tanaka est traduit sur developpez.com.</p>
</div>

La mise en forme avec le CSS

Le code CSS est commenté afin de vous expliquer comment il fonctionne.
Notez que nous ne précisons pas le margin pour la classe .popup_block : comme la taille de la fenêtre peut varier, c'est jQuery qui le calculera à l'étape suivante.

#fade { /*--Masque opaque noir de fond--*/
	display: none; /*--masqué par défaut--*/
	background: #000;
	position: fixed; left: 0; top: 0;
	width: 100%; height: 100%;
	opacity: .80;
	z-index: 9999;
}
.popup_block{
	display: none; /*--masqué par défaut--*/
	background: #fff;
	padding: 20px;
	border: 20px solid #ddd;
	float: left;
	font-size: 1.2em;
	position: fixed;
	top: 50%; left: 50%;
	z-index: 99999;
	/*--Les différentes définitions de Box Shadow en CSS3--*/
	-webkit-box-shadow: 0px 0px 20px #000;
	-moz-box-shadow: 0px 0px 20px #000;
	box-shadow: 0px 0px 20px #000;
	/*--Coins arrondis en CSS3--*/
	-webkit-border-radius: 10px;
	-moz-border-radius: 10px;
	border-radius: 10px;
}
img.btn_close {
	float: right;
	margin: -55px -55px 0 0;
}
/*--Gérer la position fixed pour IE6--*/
*html #fade {
position: absolute;
}
*html .popup_block {
position: absolute;
}

Mise en place de jQuery

info Pour ceux qui ne sont pas familiers avec jQuery, je vous invite à mieux connaitre cette librairie sur leur site pour comprendre comment elle fonctionne.
Vous pouvez choisir de télécharger ou de le charger depuis le site Google.

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
Après avoir chargé jQuery, vous pouvez ouvrir une nouvelle balise <script> et commencer votre code avec l'événement $(document).ready, ce qui permet au code jQuery d'être exécuté dès que le DOM est disponible.
Le reste du code nécessaire au script s'y trouvera.

$(document).ready(function() {
	//Le code ici
});

La touche finale : le code jQuery

Le code suivant est commenté pour vous permettre de comprendre le fonctionnement du script.

//Lorsque vous cliquez sur un lien de la classe poplight et que le href commence par #
$('a.poplight[href^=#]').click(function() {
	var popID = $(this).attr('rel'); //Trouver la pop-up correspondante
	var popURL = $(this).attr('href'); //Retrouver la largeur dans le href

	//Récupérer les variables depuis le lien
	var query= popURL.split('?');
	var dim= query[1].split('&');
	var popWidth = dim[0].split('=')[1]; //La première valeur du lien

	//Faire apparaitre la pop-up et ajouter le bouton de fermeture
	$('#' + popID).fadeIn().css({
		'width': Number(popWidth)
	})
	.prepend('');

	//Récupération du margin, qui permettra de centrer la fenêtre - on ajuste de 80px en conformité avec le CSS
	var popMargTop = ($('#' + popID).height() + 80) / 2;
	var popMargLeft = ($('#' + popID).width() + 80) / 2;

	//On affecte le margin
	$('#' + popID).css({
		'margin-top' : -popMargTop,
		'margin-left' : -popMargLeft
	});

	//Effet fade-in du fond opaque
	$('body').append(''); //Ajout du fond opaque noir
	//Apparition du fond - .css({'filter' : 'alpha(opacity=80)'}) pour corriger les bogues de IE
	$('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();

	return false;
});

//Fermeture de la pop-up et du fond
$('a.close, #fade').live('click', function() { //Au clic sur le bouton ou sur le calque...
	$('#fade , .popup_block').fadeOut(function() {
		$('#fade, a.close').remove();  //...ils disparaissent ensemble
	});
	return false;
});

Démo et conclusion

Voir la démo en ligne

Si vous êtes à l'aise avec jQuery et que vous voyez des améliorations à apporter au code, n'hésitez pas à les proposer.
A l'inverse, si vous êtes débutant et que des points ne vous semblent pas clairs, faites la demande sur le forum.
28 commentaires Donner une note à l'article (4.5)


Remerciements

Ce tutoriel a été traduit avec l'aimable autorisation de en Soh Tanaka (en voir l'article original).

Merci à ClaudeLELOUP pour sa relecture attentive et efficace.



               Version PDF (Miroir)   Version hors-ligne (Miroir)

Valid XHTML 1.0 TransitionalValid CSS!

Copyright © 2011 Soh Tanaka. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC. Cette page est déposée.

 
 
 
 
Partenaires

Hébergement Web