Come creare una semplice finestra di dialogo in jQuery
Articolo pubblicato il 12-01-2010.
Categorie: CSS, jQuery, PHP e.., Tutorial testuali.
Commenti: 16.

Ammetto di aver cercato in lungo ed in largo una guida che spiegasse come creare un popup, o una finestra di dialogo, in jQuery, prima di esser arrivato alla soluzione finale di smanettare da solo. In verità, ho trovato alcuni tutorial, ma la maggior parte non mi assicuravano una perfetta compatibilità con IE 7+ ed avevano alcuni problemi di CSS. Inoltre, cercavo qualcosa di davvero semplice e mi sembrava futile installare qualche libreria per jQuery solo per fare una cosa banalissima. Ma bando alle ciance, ecco una demo, molto minimale, di ciò che dovreste ottenere. Partiamo con il codice!
Strutturiamo così il nostro css:
/* Alcune righe di codice di convenzione */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { border:0pt none; font-family:inherit; font-size:100%; font-style:inherit; font-weight:inherit; margin:0pt; padding:0pt; vertical-align:baseline; } /* Ci servirà per oscurare la pagina */ #nero{ /* Imposto il colore nero */ background-color:#000000; /* Imposto come puntatore la manina */ cursor:pointer; /* Imposto i valori di altezza e larghezza a 100% */ height:100%; width:100%; /* Ci servirà in modo tale che non ci siano margini */ left:0; top:0; /* Impostiamo come posizione la fissa */ position:fixed; /* Aggiungiamo i codice per opacizzare lo sfondo. */ opacity: 0.65; -moz-opacity: 0.65; filter:alpha(opacity=65); /* E' utile nel caso in cui ci siano altri oggetti in posizione assoluta o fissa */ z-index:1000; /* Lo rendiamo non visibile */ display:none; } /* Questo sarà il nostro popup */ .messaggio{ /* Impostiamo il bianco come colore di sfondo e creiamo un piccolo bordo */ background-color:#FFFFFF; border:3px solid #AAAAAA; /* Impostiamo un leggero margine interno */ padding:5px; /* Impostiamo la posizione come fissa. Ci servirà in modo tale che il popup segua lo scrolling della pagina */ position:fixed; /* Impostiamo lo z-index come 1001. Lo z-index è una sorta di gestore di livelli. Chi avrà il numero maggiore si troverà davanti a chi ha numero minore. Facile no? */ z-index:1001; /* Rendiamo il popup non visibile */ display: none; /* Impostiamo la grandezza del box. Ci servirà in quanto così possiamo facilmente impostare il box centrato nella pagina */ width: 350px; height: 350px; /* Impostiamo i valori di top e left a 50% */ left: 50%; top: 50%; /* Il margin left e top dovrà essere pari alla metà delle dimensioni del box. Ci servirà per centrare il box */ margin-left: -175px; margin-top: -175px; text-align:center; /* Impostiamo un'ombra con CSS3 */ -webkit-box-shadow: 0px 0px 10px #525252; -moz-box-shadow: 0px 0px 10px #525252; }
Mentre questo sarà il nostro codice html:
<button id="cliccaqui" style="width: 100px; height: 50px;"> Clicca qui! </button> <div class="messaggio"> On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty through weakness of will, which is the same as saying through shrinking from toil and pain. These cases are perfectly simple and easy to distinguish. In a free hour, when our power of choice is untrammelled and when nothing prevents our being able to do what we like best, every pleasure is to be welcomed and every pain avoided. But in certain circumstances and owing to the claims of duty or the obligations of business it will frequently occur that pleasures have to be repudiated and annoyances accepted. The wise man therefore always holds in these matters to this principle of selection: he rejects pleasures to secure other greater pleasures.</div>
Saranno inseriti, quindi, sia il div nero che il div messaggio, ma ambedue non sono visibili (display: none). Nell’head del documento, richiamiamo la libreria jQuery:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"><!--mce:0--></script>
E creiamo il nostro script:
$(document).ready(function () { //Al click dell'id "cliccaqui".. $("#cliccaqui").click(function(){ //Apparirà il div messaggio. FadeIn cambia il display del div a cui si riferisce da none a block. $(".messaggio").fadeIn("slow"); //Allora perchè non usarlo anche qua? Perchè fadeIn, annulla anche la trasparenza, quindi o chiamiamo prima un fadeIn e poi modifichiamo il valore di opacità, o andiamo a modificare "manualmente" il css del div. $("#nero").css("display", "block"); //Al click del div nero (cioè tutto lo sfondo dietro il popup) $("#nero").click(function(){ //Scompare l'effetto scuro e il messaggio $("#nero").css("display", "none"); $(".messaggio").fadeOut("slow"); }); }); });
Ecco il nostro popup completato! Ecco il codice completo utilizzato.
n <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"><!--mce:1--></script> <script type="text/javascript"><!--mce:2--></script> <button id="cliccaqui" style="width: 100px; height: 50px;"> Clicca qui! </button> <div class="messaggio"> On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty through weakness of will, which is the same as saying through shrinking from toil and pain. These cases are perfectly simple and easy to distinguish. In a free hour, when our power of choice is untrammelled and when nothing prevents our being able to do what we like best, every pleasure is to be welcomed and every pain avoided. But in certain circumstances and owing to the claims of duty or the obligations of business it will frequently occur that pleasures have to be repudiated and annoyances accepted. The wise man therefore always holds in these matters to this principle of selection: he rejects pleasures to secure other greater pleasures.</div>
Vi ricordo che per vedere una demo potete cliccare qui, mentre potete scaricare il popup da qui. Per qualsiasi domanda o dubbio vi rimandiamo ai commenti
Rispondendo a una domanda posta nei commenti, illustriamo, inoltre, come far chiudere il popup al click di un’icona. Aggiungiamo l’immagine in un punto qualsiasi del popup.
<img id="chiudi" src="chiudi.gif" alt="Chiudi il popup" />Con il relativo CSS:
#chiudi{ cursor:pointer; position:absolute; right:0; top:0; width:34px; }
E infine nel jQuery aggiungiamo:
$("#chiudi").click(function(){ $("#nero").css("display", "none"); $(".messaggio").fadeOut("slow"); });
In questo modo, al click dell’icona o dello sfondo, scomparirà il popup
16 commenti

























AstorinoGD
gennaio 12th, 2010
secondo me sarebbe ottimo anche applicare il fadeout al background nero
Rispondi
Artedelweb
gennaio 12th, 2010
Purtroppo è sconveniente. Se si utilizza fadeOut, l'opacità del div nero diventerà pari a 0, e quindi se il popup dovesse essere aperto un'altra volta non apparirebbe lo sfondo opacizzato
Rispondi
WebDesigner92
gennaio 14th, 2010
E se volessimo mettere una croce per chiudere il poput in alto a sinistra sarebbe difficile a farsi?
Sarebbe interessante vedere come si fa
Rispondi
Artedelweb
gennaio 15th, 2010
Ho aggiornato l'articolo un esempio abbastanza sbrigativo
Rispondi
Francesco
gennaio 15th, 2010
Wow fantastico grazie! Più facile di quello che mi immaginavo a dire il vero…
Comunque mi chiedo come mai se è così facile da realizzare il tutto esistono cose come LightBox e simili
Rispondi
Artedelweb
gennaio 15th, 2010
Perchè LightBox presenta molte più funzionalità o anche solo perchè è più semplice da usare
Francesco
gennaio 15th, 2010
Grazie per i chiarimenti
Artedelweb
gennaio 15th, 2010
Di nulla ;D
luisa
gennaio 22nd, 2011
E se invece volessimo che la popup si aprisse all’apertura della pagina senza dover cliccare come potremmo fare?
Rispondi
Artedelweb
gennaio 23rd, 2011
Ciao Luisa! Ti basta eliminare la riga 3
$("#cliccaqui").click(function(){e la 16});Rispondi
viali
febbraio 9th, 2011
Ciao, mi sarebbe comodissimo, ho bisogno di creare una pagina con alcuni link che aprano finestre popup…ho caricato la cartella zippata e aperto il file index, funziona bene ma putroppo non riesco se duplico il bottone non funziona , funziona solo il primo
come posso fare? grazie
Rispondi
Artedelweb
febbraio 10th, 2011
Dovresti cambiare i vari ID dei div sia nel CSS che nel corrispondente jQuery.. se si tratta di numerose finestre, ti conviene optare per plugin già pronti come http://jqueryui.com/demos/dialog/#animated
Rispondi
Graziano
giugno 14th, 2011
Ciao Artedelweb e complimenti il tuo articolo è il più chiaro.
Mi servirebbe, e penso sia utile anche ad altri, sapere come fare per far si che la finestra modale si apra una sola volta alla prima visita, so che bisogna usare un cookie ma l’implementazione nel tuo script mi è difficile da apprendere, tu mi puoi aiutare?
Grazie
Graziano
Rispondi
Simone
luglio 16th, 2011
Ciao,
articolo interessantissimo.
Si può modificare lo script in modo che il popup si apra dopo un tot di secondi?
Rispondi
Artedelweb
agosto 27th, 2011
prova a vedere qui: http://api.jquery.com/delay/
Rispondi
azcoit
novembre 8th, 2011
Ciao come potre fare per implementare a questa popup uno scrollbar per inserire più testo pur mantenendo le dimensioni?
grazie.
Ottimo tutorial……
Rispondi