P
r o v a |
<table border="1"> <tr> <td rowspan="2" width="30"> <center> <div style="border:3px outset green;background:green" onclick="intv_esp= setInterval('espandi()',1);quale=uno;i=0;" onmousedown="this.style.border='3px inset green'" onmouseup="this.style.border='3px outset green'" onmouseover="this.style.cursor='hand'" onmouseout="this.style.cursor='default';this.style.border='3px outset green'"> P<br>r<br>o<br>v<br>a </div> </center> </td> <td style="visibility:hidden" id="uno"> </td> </tr> </table> <script language="javascript"> var i=0; var m=300; var intv_esp; var quale; var direz=false; function espandi() { /////////////Gestione espansione if(direz==false) { if(i<301) { quale.style.width=i; i+=5; } if(i>300) { clearInterval(intv_esp); direz=true; return; } } /////////////// //////////////Gestione ritiro if(direz==true) { if(m>0) { quale.style.width=m; m-=5; } if(m<=0) { clearInterval(intv_esp); direz=false; m=300; return; } } ///////////// } </script> |
La prima parte del codice crea una tabella. Non viene specificata la larghezza delle celle per due motivi: la prima contiene un <div> con una parola scritta in verticale (semplicemente vado a capo con <br> dopo ogni lettera), quindi molto sottile, e la seconda deve non avere misura perché deve essere "mobile". Se infatti guardate la seconda cella noterete che contiene soltanto un carattere di spazio forzato   per rendere visibile la cornice della cella stessa. Quello che ci interessa di più è il tag <div>. Esso è infatti il bottone vero e proprio. Ha un bordo di 3px verde in rilievo e lo sfondo verde; quando si fa click su di esso creiamo una variabile e la associamo ad un intervallo di 1 millisec per la funzione espandi(). L'intervallo deve essere assegnato ad una variabile perché altrimenti non sarebbe possibile disattivare tale intervallo una volta raggiunta la dimensione massima di espansione (qui sono 300 pixel). La variabile quale serve per indicare la cella da espandere (nel caso sia abbia più di un menu) e poi la var i viene portata a zero. Gli onmousedown, onmouseup, onmouseover e onmouseout servono rispettivamente per creare l'effetto bottone premuto, cambiando stile del bordo quando il mouse viene premuto/rilasciato, per cambiare il cursore con quello a forma di mano quando si passa sopra il bottone e per ripristinare il cursore di default quando siamo fuori dal bottone. Lo script crea cinque variabili e una funzione. Le variabili sono in ordine:
La funzione espandi() si divide in due parti tramite il controllo sul valore di direz. Se è false allora bisogna espandere in menu. Fino a che non si è raggiunta la larghezza stabilita (300 px) si assegna il valore i alla larghezza e si incrementa tale variabile di 5. Raggiunta la dimensione desiderata (i maggiore della dimensione massima stabilita) si rimuove l'intervallo, si inverte direz e si mette un return per uscire. Se al click direz è true allora il menu va fatto contrarre con del codice uguale ma "inverso" a quello per espanderlo. |
<table border="1"> <tr> <td rowspan="2" width="30"> <center> <div style="border:3px outset green;background:green" onclick="intv_esp= setInterval('espandi()',1);quale=uno;i=0;" onmousedown="this.style.border='3px inset green'" onmouseup="this.style.border='3px outset green'" onmouseover="this.style.cursor='hand'" onmouseout="this.style.cursor='default';this.style.border='3px outset green'"> <br>P<br>r<br>o<br>v<br>a<br><br> </div> </center> </td> <td style="visibility:hidden" id="uno"> </td> </tr> </table> <script language="javascript"> var i=0; var m=300; var intv_esp; var quale; var direz=false; function espandi() { /////////////Gestione espansione if(direz==false) { if(i<301) { quale.style.width=i; i+=5; } if(i>300) { clearInterval(intv_esp); direz=true; setup_testo(quale); return; } } /////////////// //////////////Gestione ritiro if(direz==true) { clear_text(quale); if(m>0) { quale.style.width=m; m-=5; } if(m<=0) { clearInterval(intv_esp); direz=false; m=300; return; } } ///////////// } var uno_txt = "Primo elemento\<br\>\<a href\=\"http:\/\/web.tiscali.it\/alexmfm\" target\=\"_blank\"\>Link secondo elemento\<\/a\>\<br\>\<br\>\<div style\=\"border:3px outset green\"\>Terzo oggetto\<\/div\>\<br\>"; function setup_testo(id_menu) { if(id_menu==uno) { id_menu.innerHTML=uno_txt; id_menu.style.visibility="visible"; } } function clear_text(id_menu) { if(id_menu==uno) { id_menu.style.visibility="hidden"; id_menu.innerHTML=""; } } </script> |
Vediamo soltanto i cambiamenti apportati al codice precedente: ci sono tre tag <br> nel testo prova del "bottone", giusto per rendere l'area del bottone più alta, dato che altrimenti quando appaiono le voci del menu, il tasto si sposta. Nella funzione espandi(), quando tutto il menu è espanso (ovvero nel caso i>300) viene richiamata la funzione setup_testo() che imposta il contenuto della cella con la stringa inizializzata più sotto con il testo appropriato e successivamente lo rende visibile. Quando invece si fa click per chiudere il menu, il testo viene prima reso invisibile e poi "tolto" dal menu, impostando come testo interno al menu una stringa vuota grazie al metodo clear_text(). Nota: tutti quei backslash nella stringa di testo servono per scongiurare che il browser interpreti i segni di uguale, maggiore o minore o apici in modo non corretto. Anche se l'unico problema reale dovrebbe essere con gli apici, dato che il javascript non è "schizzinoso", qualche backslash in più non crea problemi. |
P r o v a |