Magazine Informatica

Realizzare una form di iscrizione multi-step utilizzando CSS3 e jQuery

Creato il 29 novembre 2010 da Dymissy

 

Realizzare una form di iscrizione multi-step utilizzando CSS3 e jQuery

Questo articolo è la traduzione del mio post pubblicato su WebExpedition18: How to Create A Multi-Step Signup Form With CSS3 and jQuery.

In questo tutorial vedremo quanto sia semplice realizzare una form di iscrizione multi-step usando il CSS3 e jQuery. La form che andremo a realizzare conterrà anche un’utilissima progress bar che consentirà agli utenti di vedere la pecentuale di completamento dell’iscrizione.

 

Cliccando sulla seguente immagine possiamo vedere demo completamente funzionante di quello che andremo a realizzare.

Create A Multi-Step Signup Form With CSS3 and jQuery DEMO

La form che creeremo sarà suddivisa in quattro ste fondamentali:

  1. Username e password
  2. Nome, Cognome e indirizzo email
  3. Età, sesso e paese
  4. Riassunto dei dati immessi

HTML Code

La prima cosa da fare è realizzare la struttura html. Abbiamo bisogno di un box contenitore con quattro div, uno per ogni step. Il codice HTML è il seguente:

    

        
        
        
        

    

All’interno di ogni box inseriremo i campi di input ed una label. Il codice necessario al primo step della form è il seguente:

    

SIGN UP FOR A FREE WEBEXP18 ACCOUNT

At least 4 characters. Uppercase letters, lowercase letters and numbers only. At least 4 characters. Use a mix of upper and lowercase for a strong password. If your passwords aren’t equal, you won’t be able to continue with signup.

Ho usato tre campi di input: username, password e conferma password e, in fondo al box, un campo input di submit per procedere con il prossimo step. Gli altri box sono stati realizati seguendo l’esempio del primo.

Create A Multi-Step Signup Form With CSS3 and jQuery

In fondo al box contenitore possiamo vedere la progress bar. E’ stata realizzata con il seguente codice:

    
    0% Complete

Il codice HTML completo dell’esempio è il seguente:

	
        

            
            
                

SIGN UP FOR A FREE WEBEXP18 ACCOUNT

At least 4 characters. Uppercase letters, lowercase letters and numbers only. At least 4 characters. Use a mix of upper and lowercase for a strong password. If your passwords aren’t equal, you won’t be able to continue with signup.

SIGN UP FOR A FREE WEBEXP18 ACCOUNT

Your First Name. Your Last Name. Your email address. We send important administration notices to this address

SIGN UP FOR A FREE WEBEXP18 ACCOUNT

0 - 17 18 - 25 26 - 40 40+ Your age range. Male Female Your Gender. United States United Kingdom Canada Serbia Italy Your country.

SIGN UP FOR A FREE WEBEXP18 ACCOUNT

Summary

Username

Password

Email

Name

Age

Gender

Country

0% Complete

Come potete vedere, nel quarto ed ultimo step la tabella riassuntiva contiene dei campi vuoti. Questi campi verranno riempiti al termine della procedura attraverso jQuery.

CSS Code

Ora abbiamo bisogno di aggiungere lo stile alla form. La prima cosa da fare è utilizzare un font personalizzato attraverso la regola @fontface. Nell’esempio ho utilizzato il Cantarell font.Il codice CSS completo è il seguente:

/* CSS Reset (Eric Meyer) */
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,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent;margin:0;padding:0}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}:focus{outline:0}ins{text-decoration:none}del{text-decoration:line-through}table{border-collapse:collapse;border-spacing:0}

@font-face {
   font-family: 'Cantarell';
   src: url(../fonts/Cantarell-Regular.eot);
   src: local('Cantarell'), url('../fonts/Cantarell-Regular.ttf') format('truetype');
}

body {
    background-color: #f9f9f9;
    color: #222;
    font-family: Cantarell, Verdana, sans-serif;
    font-size: 12px;
}

input[type="submit"]::-moz-focus-inner, input[type="button"]::-moz-focus-inner { border : none; }
input[type="submit"]:focus, input[type="button"]:focus { outline : none; }

.clear { clear: both; }

#container {
    background: url('../images/container.png') no-repeat;
    width: 754px;
    height: 370px;
    margin: 20px auto;
    padding: 50px 0;
    overflow: hidden;
    position: relative;
}
    #container #first_step, #second_step, #third_step, #fourth_step { display: none; }
    #container #first_step { display: block; }

    #container .form { margin: 66px 72px 0 72px; }

    #container h1, #container h2 {
        font-size: Cantarell, Verdana, sans-serif;
        text-align: center;
        font-size: 24px;
        text-shadow: 1px 1px 2px #222;
    }
        #container h1 span { color: #a90329; }

    #container h2 {
        color: #888;
        font-size: 20px;
        text-align: left;
        text-shadow: none;
    }

    #container table {
        margin: 20px 40px;
        font-size: 14px;
        font-weight: bold;
    }
        #container table td {
            padding: 5px 10px;
        }
            #container table td:nth-child(2) {
                color: #a90329;
            }

    #container input, #container select {
        background: url('../images/input.png') no-repeat;
        color: #888;
        border: 1px solid #ccc;
        font-family: Cantarell, Verdana, sans-serif;
        font-weight: bold;
        font-size: 15px;
        width: 300px;
        height: 35px;
        padding: 0 25px;
        margin: 20px 0;
        float: left;

        border-radius: 6px;
        -moz-border-radius: 6px;
        -webkit-border-radius: 6px;
    }
        #container input.submit {
            background: url('../images/button.png') no-repeat;
            border: none;
            cursor: pointer;
            width: 85px;
            height: 38px;
            position: relative;
            bottom: 2px;
            left: 655px;
        }
            #container input.submit:focus { border: none; }

        #container input.send{ background: url('../images/send.png') no-repeat; }

        #container input.error { border: 1px solid red; }
        #container input.valid { border: 1px solid #1FFF00; }

        #container input:focus, #container select:focus {
            border: 1px solid #a90329;
            color: #a90329;
        }

    #container select { padding: 5px 0 5px 25px; }
        #container option { padding: 0 15px; }

    #container label {
        color: #666;
        font-size: 12px;
        font-weight: bold;
        line-height: 14px;
        float: right;
        margin: 23px -25px;
        width: 270px;
    }

#progress_bar {
    background: url('../images/progress_bar.png') no-repeat;
    width: 339px;
    height: 24px;
    margin: 0 auto;
    position: relative;
}

#progress {
    background: url('../images/progress.png') repeat-x;
    width: 0px;
    height: 23px;

    border-radius: 20px;
    -webkit-border-radius: 20px;
    -moz-border-radius: 20px;
}
#progress_text {
    position: relative;
    line-height: 21px;
    text-align: center;
    font-weight: bold;
    color: white;
    text-shadow: 1px 1px 2px #222;
    width: 339px;
    height: 24px;
    top: -23px;
    left: 0;
}

Create A Multi-Step Signup Form With CSS3 and jQuery

jQuery Code

Abbiamo realizzato la pagina completa ma ora abbiamo bisogno di jQuery per:

  • navigare tra gli step
  • verificare l’integrità dei dati inseriti
  • modificare la percentuale di completamento della progress bar

Create A Multi-Step Signup Form With CSS3 and jQuery

Innanzitutto carichiamo la libreria nella pagina, dopodichè faremo uso di altri due plugin:

- jQuery UI, probabilmente la più famosa libreria che estende le funzionalità di jQuery.

- jQuery inputfocus, un plugin da me realizzato per gestire gli eventi focus e blur dei campi di input e delle textarea.

Il codice jQuery utilizzato è il seguente:

$(function(){
    //original field values
    var field_values = {
            //id        :  value
            'username'  : 'username',
            'password'  : 'password',
            'cpassword' : 'password',
            'firstname'  : 'first name',
            'lastname'  : 'last name',
            'email'  : 'email address'
    };

    //inputfocus
    $('input#username').inputfocus({ value: field_values['username'] });
    $('input#password').inputfocus({ value: field_values['password'] });
    $('input#cpassword').inputfocus({ value: field_values['cpassword'] });
    $('input#lastname').inputfocus({ value: field_values['lastname'] });
    $('input#firstname').inputfocus({ value: field_values['firstname'] });
    $('input#email').inputfocus({ value: field_values['email'] });

    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text], #first_step input[type=password]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<4 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();
            }
        } else return false;
    });

    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' & !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#third_step').slideDown();
        } else return false;

    });

    $('#submit_third').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#username').val(),
            $('#password').val(),
            $('#email').val(),
            $('#firstname').val() + ' ' + $('#lastname').val(),
            $('#age').val(),
            $('#gender').val(),
            $('#country').val()
        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();
    });

    $('#submit_fourth').click(function(){
        //send information to server
        alert('Data sent');
    });

});

Il codice da riga 3 a riga 20 attiva il plugin inputfocus su ogni campo di input. Il codice da riga 27 a 64 verifica la validità dei dati inseriti dall’utente nel primo step (se username e password sono maggiori di 4 caratteri e se le due password coincidono) dopodichè, se i dati sono validi, aggiorna la progress bar e procede con il prossimo step.

Il codice da riga 71 a 100 verifica i dati inseriti nel secondo step e così via. Il resto è molto simile al codice precedente tranne il quarto step in cui semplicemente vengono aggiornati i dati nella tabella con quelli inseriti dall’utente.

Create A Multi-Step Signup Form With CSS3 and jQuery

Conclusioni e Download

Abbiamo visto che è davvero molto semplice realizzare un form di iscrizione suddividendolo in step. Ovviamente questo è un esempio per cui sono stati omessi molti controlli e caratteristiche (tra cui il bottone per tornare indietro). Ad ogni modo l’esempio è pronto per essere utilizzato, è sufficiente modificare il parametro action della form con il link allo script e modificare la riga 125 del codice jQuery in: $(‘form’).submit();. Si può anche decidere di utilizzare lo script attraverso una chiamata AJAX, il codice da aggiungere è davvero pochissimo.

Aggiungo una piccola nota rispetto all’articolo in inglese vista la polemica sollevata da un utente nei commenti. Viene definito il mio articolo completamente inutile poichè, se si volesse modificare la form aggiungendo altri campi, ci sarebbe bisogno di aggiungere innumerevoli righe di codice e, a sua detta, non siamo più nel 2001. Ora tralasciando la scelta della data

:)
, la cosa che mi preme specificare è la regola su cui sono basati tutti i miei articoli, tutorial, ecc. presenti, passati e futuri. Difficilmente i lavori da me realizzati sono completi di tutte le funzionalità necessarie nella realtà perchè a me non è mai piaciuta l’idea del vengo, prendo, uso e me ne frego. I miei articoli sono sempre spunti e basi di partenza per lavori più complessi che richiedono all’utente almeno un minimo di lavoro proprio. Ho sempre preferito spiegare passo passo le fasi più importanti dettagliando anche il ragionamento e la teoria che c’è dietro. Ragion per cui anche questo articolo, come è stato ampiamente spiegato nella conclusioni, difetta di alcuni dettagli importanti che non richiedono certamente chissà quali conoscenze per essere integrati.

La demo del tutorial appena visto è disponibile cliccando sull’immagine in basso:

Create A Multi-Step Signup Form With CSS3 and jQuery DEMO

Se vuoi scaricare il pacchetto completo, puoi farlo attraverso il seguente link:

signup form with css3 and jQuery files

Like this post? Share It! :)

Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :