Implementarea modelului de formular pentru etichete plutitoare

Folosind designul de interacțiune al formularului mobil al lui Matt Smith ca ghid, vom crea o interacțiune de formular uimitoare pentru web care este atât de frumoasă și accesibilă folosind HTML, CSS și JavaScript.


Prezentare generală

Formarea formelor și interacțiunea pe web pot fi un subiect sensibil. O multitudine de preocupări privind accesibilitatea formelor și cele mai bune practici pot face ca proiectarea unei interacțiuni de formă convingătoare să fie foarte dificilă, spre deosebire de designul pe platforme native.

Matt Smith a creat recent o interacțiune de formă convingătoare pe care a trimis-o la Dribbble:


Aruncați o privire la fotografia originală Dribbble pe floatlabel.com

Deși este conceput pentru o aplicație nativă iOS, această interacțiune poate fi recreată pentru web utilizând HTML, CSS și Javascript,.

Conceptul de etichetă flotantă a adus o atenție destul de mare, ceea ce a dus la discuții și experimente pe toată lumea.

Într-adevăr demo rece de @zelph http://t.co/Szw1bE2tib punerea în aplicare super forma de etichetă float etichetă de interacțiune http://t.co/NhKfErgd2Q de @mds

- Brad Frost (@brad_frost) 23 octombrie 2013

Mai degrabă decât să folosiți aceleași câmpuri de formulare în designul lui Matt, vom crea un simplu formular de contact pe care l-ați putea folosi pe site-ul dvs. propriu. Deci, hai să ne aruncăm!


Anatomia formelor

Mai întâi, să observăm și să înregistrăm interacțiunile pe care le-a creat Matt. Acest lucru ne va permite să predeterminăm modul în care forma noastră ar trebui marcată. De asemenea, ne va da o bună înțelegere a modului de a modela forma și a crea interacțiunile cu JavaScript.

Forma structurii

Formularul are următoarele elemente la care putem traduce HTML:

  • element
  • element

Aici setăm un container de formular cu un antet de "Contact Me" și elementele de formă corespunzătoare structurate în elementele de listă. Rețineți că am atribuit și câmpul de e-mail type = "email". Aceasta oferă tastaturi virtuale contextuale pentru dispozitivele care le suportă, precum și validare simplificată a browserului pentru acele browsere care acceptă tipuri de intrări HTML5. Pentru cei care nu o fac, devine un câmp simplu de text.

Ceea ce avem acum sunt foarte elementele de baza ale unei forme care va functiona oriunde si structurata corespunzator pentru accesibilitate simpla.


Notă: Nu acoperim depunerea sub formă de server în acest tutorial, deci nu ezitați să schimbați metoda de depunere a formularului după cum este necesar.


Crearea de stiluri de bază de pagină

Acum avem o formă de lucru în HTML. Acum vom face primul pas în îmbunătățirea progresivă: aplicarea CSS stiluri. Să creăm stiluri pentru a face formularul nostru mai atrăgător din punct de vedere vizual, reținându-ne, de asemenea, să păstrăm forma funcțională și accesibilă.

Să creăm un stil de bază pentru containerul de pagină și de formă. În din documentul nostru am creat un link către un fișier numit styles.css, așa că vom crea acel fișier acum și îl vom salva în rădăcina proiectului nostru.

Incepem prin importarea stilurilor de la Eric Meyer CSS reinițializați în propriul dosar. Puteți lua aceste stiluri aici și le puteți copia în propria pagină de stil.

Apoi, să creăm câteva stiluri generale de pagini:

 / * General ==================================== * / *, *: înainte, *: după -moz-box-size: caseta de margine; -webkit-box-size: caseta de frontieră; box-size: caseta de margine;  corp fundal: # eaedf1;  corp, intrare, textarea font: 1em / 1.5 Arial, Helvetica, sans-serif;  .container max-width: 25em; marja: 2em auto; lățime: 95%;  .titul font-size: 1.5; padding: .5em 0; text-align: centru; fundal: # 323a45; culoare albă; raza de graniță: 5px 5px 0 0; 

Veți observa că folosim abordarea sugerată de Paul Irish pentru modelul de cutie atunci când formează formularele: box-size: caseta de margine;.

Acum avem ceva ceva mai bun, dar va avea nevoie de ceva mai multă muncă.



Crearea stilurilor listei formelor

Să aplicăm anumite stiluri elementelor noastre de formă. Acestea vor face ca forma noastră să arate mai asemănătoare cu cea a lui Matt.

În primul rând, vom modela elementele din listă care conțin elementele noastre de formă.

 / * Formă ==================================== * / .form ul fundal: alb; marginea inferioară: 1em; . form li graniță: 1px solid #ccc; frontieră de fund: 0; margin-bottom: 0px; poziție: relativă; . form li: primul-copil border-top: 0; . form li: ultimul copil border-bottom: 1px solid #ccc; 

Acum avem toate elementele noastre de formă vizibile. Ar trebui să aveți ceva de genul:



Crearea de stiluri de elemente de formular

Să continuăm să stylizăm elementele noastre de formă pentru a se potrivi cu designul lui Matt, luând în considerare, de asemenea, constrângerile de accesibilitate ale webului.

Modelați câmpurile de intrare ca elemente mari la nivel de bloc în forma:

 etichetă, intrare, textarea display: block; frontieră: 0;  intrare, textarea lățime: 100%; înălțime: 100%; umplutura: 2,25 sem 1em 1em; contur: 0;  textarea height: 16em; redimensionare: nici una; 

Ar trebui să aveți ceva de genul:


Apoi stilul de forma elemente pentru a sta poziționat aproximativ o treime din drumul din partea de sus a fiecărui bloc de intrare.

 etichetă font-size: .8125em; / * 13/16 * / poziție: absolută; top: 1,23; stânga: 1,23; culoare: # f1773b; opacitate: 1; 

Notă: ați observat opacitate regulă? Vom folosi acea proprietate (împreună cu top proprietate) pentru a anima element mai târziu folosind JavaScript.

Ar trebui să aveți ceva care începe să arate mai mult ca designul lui Matt.


Apoi, trebuie să stilul butonul de prezentare a formularului.

 introduceți [type = "trimiteți"] background: # f1773b; marginea inferioară: 1em; culoare albă; raza de graniță: 3 pixeli; padding: .75em; -webkit-aspect: nici unul; / * elimina browserul implicit 

Rețineți că am folosit selectorul de atribute pentru a viza numai butonul de trimitere. Am adăugat câteva stiluri de bază împreună cu o simplă interacțiune pe :planare și :activ (browsere mai vechi care nu acceptă CSS transformatele pur și simplu nu va avea o interacțiune fantezie, dar forma încă funcționează). Acum ar trebui să aveți ceva de genul:


Forma noastră a fost decorată într-un mod asemănător cu designul lui Matt, dar și adaptat pentru a ușura preocupările legate de accesibilitatea web-ului. Observați cum, fără JavaScript, formularul este încă accesibil, câmpurile de formă fiind afișate în orice moment. Pentru utilizatorii cu browsere mai vechi care nu acceptă înlocuitor vor fi în continuare capabili să vadă câmpurile de formă și să verifice ce informații sunt necesare pentru ele.

In plus și elementele acoperă întregul bloc de câmp, astfel încât zona țintă pentru fiecare intrare este destul de mare și accesibilă.

De exemplu, acesta este modul în care forma ar arăta la acest moment în Internet Explorer 8:



Utilizarea JavaScript pentru o formă îmbunătățită progresiv

Am început să ne gândim acum cum să implementăm interacțiunea pe care Matt a creat-o folosind JavaScript. Vom realiza acest lucru în mare măsură prin adăugarea și eliminarea CSS clase.

Veți observa chiar înainte de închidere eticheta am pus un link la fișierul nostru personalizat JavaScript numit scripts.js. Putem crea acel fișier acum și să îi spunem browserului să ruleze codul atunci când DOM este gata:

 $ (document) .ready (funcția () // Codul nostru aici);

Verificarea pentru înlocuitor a sustine

În cazul în care nu ați observat, această interacțiune este extrem de dependentă de suportul înlocuitorului. Atributul substituent este suportat pe scară largă în browserele moderne. Întrucât interacțiunea dintre formularul nostru este atât de dependentă de suportul înlocuitorului, vom testa mai întâi dacă browserul acceptă textul cu substituent. În caz contrar, vom implementa interacțiunea formularului. Dacă nu (IE8 & IE9) vom furniza pur și simplu forma de bază fără interacțiunea JavaScript. Îmbunătățirea progresivă pentru câștig!

Mai întâi, să folosim jQuery $ .Support () pentru a vedea dacă browserul acceptă textul cu substituentul. Acest lucru va fi setat $ .support.placeholder la adevărat sau fals, în funcție de suportul browserului pentru textul cu substituent.

 // Test pentru suportul înlocuitorului $ .support.placeholder = (funcția () var i = document.createElement ('input'); return 'placeholder' în i;) ();

Dacă este acceptat textul cu substituent, putem ascunde elemente la încărcarea paginii. După cum sa menționat anterior, ascunderea etichetelor cu JavaScript după încărcarea paginilor asigură că browserele cu JavaScript dezactivat (și cele fără suport înlocuitor) pot utiliza în continuare formularul.

 // ascunde etichetele în mod implicit dacă sunt suportate opțiunile de substituție dacă ($. Support.placeholder) $ ('.formul li') fiecare (funcția () $ (this) .addClass ('js-hide-label'); ); // Cod pentru adăugarea / eliminarea clasei aici

Observați că am adăugat o clasă la fiecare element de listă numit js-ascunde-etichetă. Acest lucru se datorează faptului că, conform regulilor de interacțiune de la începutul tutorialului, aspectul implicit al formularului are etichetele câmpului de formă ascunse. js-ascunde-etichetă clasa va fi aplicată părintelui

  • elemente atunci când descendentul elementul este gol de conținutul utilizatorului.

    Pentru a ajuta la înțelegerea și mentenabilitatea codului, prefixăm clasele pe care le adăugăm sau le eliminăm cu JavaScript cu 'js-'. Să adăugăm acea clasă la foaia de stil și să o folosim pentru a ascunde toți descendenții eticheta elemente din vedere. Amintiți-vă cum am fost de gând să folosim opacitate regulă? Aici îl folosim pentru a ascunde elemente:

     .jc-ascunde eticheta etichetă opacity: 0; top: 1.5em

    Notă: opacitate proprietatea este susținută în toate browserele moderne. IE8 nu o va recunoaște, dar asta e bine deoarece IE8 nu suportă atribute de substituent, deci nu executăm de fapt JavaScript pentru a aplica clasa în IE8. Win-win!

    O notă privind tranzițiile

    Dacă observați îndeaproape, designul de interacțiune al lui Matt arată că etichetele câmpului de formă nu apar doar și dispar, ci fac o mișcare mică în sus și în jos. Deoarece elementele noastre de etichetare sunt poziționate absolut, atunci când adăugăm o clasă care își schimbă poziția de top (sau stânga, dreapta sau jos), browserul poate trece la acest efect. Tot ce trebuie să facem este să adăugăm o proprietate de tranziție la eticheta în sine.

    Să ne întoarcem la noi eticheta element în CSS și adăugați o proprietate de tranziție pentru top și opacitate proprietăţi:

     etichetă -webkit-tranziție: .333s ușurință în sus, .333s ușurința opacitate; tranziție: .333s ușurință în sus, .333 ușurează opacitatea; 

    Acest lucru permite ca etichetele să nu apară și să dispară ușor, ci să bobbleze în sus și în jos atunci când devin complet opace sau transparente, cum ar fi:


    Ar trebui să aveți acum ceva de genul acesta atunci când încărcați pagina (într-un browser modern desigur).



    Eliminarea culorii evidențierii

    Așa cum am menționat mai sus, adăugăm și eliminăm clase din

  • elemente și care vizează toți copiii care au nevoie de stil. În acest moment (la încărcarea paginii) am adăugat o clasă de js-ascunde-etichetă care ascunde toate etichetele în formă. Acum avem nevoie de încă o clasă pentru eliminarea culorii de evidențiere din elemente:

     .JS-etichetă cu etichetă neîntreruptă culoare: # 999

    Adăugarea ascultătorilor de evenimente

    Acum avem un formular care este progresiv îmbunătățit și pregătit pentru o anumită interacțiune cu JavaScript (în browserele moderne) atunci când utilizatorul începe să interacționeze cu formularul.

    În interiorul substituentului dacă declarația pe care am scris-o mai sus, să începem să adăugăm și să eliminăm js- clase la momentul potrivit. În primul rând, vom selecta elementele formularului nostru și vom adăuga un ascultător al evenimentului pe estompa, concentra, și keyup evenimente (folosim keyup Decat Tasta în jos sau keypress deoarece aceste evenimente se vor declanșa prematur):

     $ (', formarea') pe ('keyup blur focus', funcția (e) // Cache-ul nostru selector var $ this = $ (this), $ parent = $ this .Parent (); // Adăugați sau eliminați clase dacă (e.type == 'keyup') // tastați codul aici altceva dacă (e.type == 'blur') // blur cod aici altceva dacă (e.type == 'focus') / / codul de foc aici);

    Iată o scurtă explicație a ceea ce facem aici:

    • Selectăm toate elementele listate care fac parte din formularul nostru $ (formular li). Apoi, în interiorul acelei selecții găsim totul și