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.
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:
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!
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.
Formularul are următoarele elemente la care putem traduce HTML:
element
element
elementînlocuitor
atributeObservând interacțiunile create de Matt, putem formula reguli pentru interacțiunea elementelor de formă pe care le vom crea. Aceste reguli vor fi utile în crearea marcajului nostru, a regulilor stilului și a interacțiunilor JavaScript.
element
&
elemente:
element
&
elemente:
element
&
elemente:
element
&
elemente: Acum că am determinat formularul HTML elemente împreună cu regulile de interacțiune, putem începe să o creăm.
Să începem prin obținerea unui cod de pornire de bază.
Contacteaza-ma
Acum, să creăm marcajul pentru formularul nostru:
Contacteaza-ma
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.
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ă.
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:
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:
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);
î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!
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).
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
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:
$ (formular li)
. Apoi, în interiorul acelei selecții găsim totul
și
câmpuri .găsi ('input, textarea')
. Acest lucru asigură faptul că ultima intrare din marcajul nostru (butonul de trimitere) nu este inclusă în selecția noastră.estompa
, concentra
, și keyup
evenimente și pur și simplu verificați tipul de eveniment folosind e.type
pentru a determina ce clase vom adăuga sau elimina la anumite momente.keyup
Conform regulilor de interacțiune pe care le-am stabilit la început care corespund designului lui Matt, atunci când un utilizator începe să introducă textul (nu când se concentrează pe câmp) vrem să prezentăm eticheta.
Deci, folosind keyup
eveniment, de fiecare dată când utilizatorul introduce un caracter, putem verifica dacă câmpul de intrare este necompletat (acest cod intră dacă (e.type == 'keyup')
:
dacă $ this.val () == ") $ parent.addClass ('js-hide-label'); altceva $ parent.removeClass ('js-hide-label'
Observați că logica noastră funcționează astfel:
Ar trebui să aveți acum ceva care funcționează astfel, atunci când introduceți sau ștergeți text dintr-un câmp de introducere:
estompa
Acum, conform regulilor noastre de interacțiune (din nou), știm că atunci când un utilizator mișcă focalizarea de la un câmp de introducere la altul (estompa
eveniment), ar trebui să de-accentuăm culoarea element în funcție de faptul că utilizatorul a introdus efectiv ceva în câmp.
În interiorul altfel dacă (e.type == 'blur')
, vom adăuga următorul cod:
dacă $ this.val () == ") $ parent.addClass ('js-hide-label'); altceva $ parent.removeClass ('js-hide-label' -eticheta');
Observați că logica noastră funcționează astfel:
js-ascunde-etichetă
clasă.js-ascunde-etichetă
și de-accentua culoarea etichetei prin adăugarea clasei "js-unhighlight-label".Ar trebui să aveți acum ceva care de-accentuează culoarea etichetei atunci când eliminați focalizarea, după cum urmează:
concentra
În sfârșit, trebuie să adăugăm o mică logică atunci când un utilizator se concentrează pe o intrare. În conformitate cu regulile noastre de interacțiune, să folosim următorul cod JavaScript în interiorul altfel dacă (e.type == 'focus')
secțiune:
dacă ($ this.val ()! == ") $ parent.removeClass ('js-unhighlight-label');
Logica noastră funcționează astfel:
Acum, atunci când un utilizator se concentrează pe un câmp de formular, dacă nu este gol, eticheta va fi subliniată cu culoarea evidențiată, după cum urmează:
Există mult mai multe posibilități pentru acest formular, inclusiv adăugarea validării de la client și server. De asemenea, am putea crea mai multe clase pentru a modela valori valide și nevalide ale câmpului. De exemplu, am putea adăuga stiluri unei clase de "js-error" care ar merge pe părinte atunci când valoarea de intrare este nevalidă, după cum urmează:
.js-error limita-culoare: # f13b3b! important; / * suprascrie toate cazurile * / .js-error + li border-top-color: # f13b3b; .js-eroare etichetă culoare: # f13b3b;
Aceste tipuri de stiluri de validare ar putea face ca formularul nostru să arate mai mult ca acesta:
Cu toate acestea, acest tutorial a fost menit să arate modul în care am putea crea o formă accesibilă, progresiv îmbunătățită, care să imite designul lui Matt. Și, trebuie să spun, cred că am făcut destul de bine.
Simțiți-vă liber să copiați, să modificați sau să îmbunătățiți acest formular în oricum văd că este potrivit în proiectele proprii!