Met behulp van Matt Smiths ontwerp voor interactie met mobiele vormen als leidraad, zullen we een verbluffende vorminteractie voor het web creëren die zowel mooi als toegankelijk is met HTML, CSS en JavaScript.
Vormgeving en interactie op het web kan een gevoelig onderwerp zijn. Een groot aantal vormen van bereikbaarheid en best practices kunnen het ontwerpen van een aantrekkelijke vorminteractie erg moeilijk maken, in tegenstelling tot vormontwerp op native platforms.
Matt Smith heeft onlangs een boeiende formulierinteractie gemaakt die hij op Dribbble heeft gepost:
Hoewel deze vorm is ontworpen voor een native iOS-applicatie, kan deze formulierinteractie opnieuw worden gemaakt voor het web met behulp van HTML, CSS en Javascript, terwijl ook de toegankelijkheid van formulieren toegankelijk wordt gehouden.
Het concept van het float-label heeft nogal wat aandacht getrokken, wat heeft geleid tot discussies en experimenten over het hele internet.
Echt coole demo door @zelph http://t.co/Szw1bE2tib de super awesome float-labelvorminteractie implementeren http://t.co/NhKfErgd2Q door @mds
- Brad Frost (@brad_frost) 23 oktober 2013
In plaats van dezelfde formuliervelden in het ontwerp van Matt te gebruiken, zullen we een eenvoudig contactformulier maken dat u op uw eigen website zou kunnen gebruiken. Dus laten we erin duiken!
Laten we eerst de vorminteracties bekijken en vastleggen die Matt heeft gemaakt. Op deze manier kunnen we vooraf bepalen hoe ons formulier moet worden gemarkeerd. Het zal ons ook een goed begrip geven van hoe het formulier moet worden vormgegeven en interacties met JavaScript kunnen maken.
Het formulier heeft de volgende elementen die we kunnen vertalen HTML:
elementen
elementen
elementplaceholder
attributenDoor de interacties te observeren die Matt heeft gecreëerd, kunnen we regels opstellen voor de interactie van de formulierelementen die we gaan maken. Deze regels zullen nuttig zijn bij het maken van onze markeringen, stijlregels en JavaScript-interacties.
elementen
&
elementen:
elementen
&
elementen:
elementen
&
elementen:
elementen
&
elementen: Nu hebben we de vorm bepaald HTML elementen samen met de interactieregels kunnen we beginnen met het maken ervan.
Laten we beginnen met een paar basis-startercodes.
Neem contact met mij op
Laten we nu de opmaak voor onze vorm maken:
Neem contact met mij op
Hier stellen we een formuliercontainer in met een koptekst van 'Contact' en de bijbehorende formulierelementen die zijn gestructureerd in lijstelementen. Merk op dat we ook het e-mailveld hebben toegewezen type = "email"
. Dit biedt contextuele virtuele toetsenborden voor apparaten die deze ondersteunen, evenals eenvoudige, browser-ondersteunde validatie voor die browsers die HTML5-invoertypen ondersteunen. Voor degenen die dat niet doen, wordt het een eenvoudig tekstveld.
Wat we nu hebben, zijn de basis van een formulier dat overal werkt en goed is gestructureerd voor eenvoudige toegankelijkheid.
Notitie: We behandelen formulieren voor server-side-formulieren niet in deze zelfstudie, dus u kunt de indieningsmethode van het formulier naar behoefte wijzigen.
We hebben nu een werkformulier in HTML. Nu gaan we onze eerste stap zetten in progressieve verbetering: toepassen CSS stijlen. Laten we stijlen maken om onze vorm visueel aantrekkelijker te maken en tegelijkertijd te onthouden om de vorm functioneel en toegankelijk te houden.
Laten we een basisstijl voor de pagina en formuliercontainer maken. In de van ons document hebben we een link gemaakt naar een bestand met de naam
styles.css
, dus we zullen dat bestand nu aanmaken en het opslaan in de root van ons project.
We beginnen met het importeren van de stijlen van Eric Meyer's CSS opnieuw instellen op ons eigen bestand. Je kunt die stijlen hier pakken en ze naar je eigen stylesheet kopiëren.
Laten we vervolgens een aantal algemene paginastijlen maken:
/ * Algemeen ==================== * / *, *: voor, *: na -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; body background: # eaedf1; body, input, textarea font: 1em / 1.5 Arial, Helvetica, sans-serif; .container max-width: 25em; marge: 2em auto; breedte: 95%; .title font-size: 1.5em; opvulling: .5em 0; text-align: center; achtergrond: # 323a45; kleur wit; grensradius: 5px 5px 0 0;
U merkt dat we de door Paul Irish voorgestelde benadering van het doosmodel gebruiken bij het stylen van vormen: box-sizing: border-box;
.
Nu hebben we iets iets beters, maar het zal wat meer werk nodig hebben.
Laten we enkele stijlen toepassen op onze formulierelementen. Deze zullen onze vorm meer lijken op die van Matt.
Eerst zullen we de lijstelementen die onze formulierelementen bevatten, vormgeven.
/ * Form ==================== * / .form ul background: white; margin-bottom: 1em; .form li border: 1px solid #ccc; border-bottom: 0; margin-bottom: 0px; positie: relatief; .form li: first-child border-top: 0; .form li: last-child border-bottom: 1px solid #ccc;
Nu hebben we al onze vormelementen visueel ingeperkt. Je zou zoiets als dit moeten hebben:
Laten we doorgaan met het vormgeven van onze formulierelementen om het ontwerp van Matt te evenaren, terwijl we ook rekening houden met de toegankelijkheidsbeperkingen van internet.
Stijl de invoervelden als grote elementen op blokniveau in de vorm:
label, invoer, tekstveld display: block; rand: 0; input, textarea width: 100%; hoogte: 100%; opvulling: 2.25em 1em 1em; overzicht: 0; textarea height: 16em; formaat wijzigen: geen;
Je zou zoiets als dit moeten hebben:
Dan style het formulier elementen zitten ongeveer een derde van de weg vanaf de bovenkant van elk invoerblok.
label font-size: .8125em; / * 13/16 * / positie: absoluut; top: 1.23em; links: 1.23em; kleur: # f1773b; dekking: 1;
Notitie: heb je de ondoorzichtigheid
regel? We zullen dat eigendom gebruiken (samen met de top
eigendom) om het te animeren element later met behulp van JavaScript.
Je zou iets moeten hebben dat veel op Matt's vormontwerp lijkt te lijken.
Vervolgens moet u onze knop Formulier verzenden aanpassen.
invoer [type = "submit"] background: # f1773b; margin-bottom: 1em; kleur wit; grensradius: 3px; opvulling: .75em; -webkit-uiterlijk: geen; / * standaardbrowser verwijderen
Merk op dat we de attribuutselector hebben gebruikt om alleen de verzendknop te targeten. We hebben enkele basisstijlen toegevoegd, samen met een eenvoudige interactie op de : hover
en :actief
states (oudere browsers die dit niet ondersteunen CSS transformaties
zal gewoon geen mooie interactie hebben, maar de vorm werkt nog steeds). Je zou nu zoiets als dit moeten hebben:
Ons formulier is gestileerd op een manier die lijkt op het ontwerp van Matt, maar ook is afgestemd op de toegankelijkheidsproblemen van het web. U ziet hoe het formulier zonder JavaScript nog steeds toegankelijk is en dat de formuliervelden te allen tijde worden weergegeven. Voor gebruikers met oudere browsers die geen ondersteuning bieden voor de placeholder
attribuut, ze kunnen nog steeds de formuliervelden zien en nagaan welke informatie van hen nodig is.
tevens de en
elementen bestrijken het hele formulierveldblok, dus het doelgebied voor elke invoer is vrij groot en toegankelijk.
Dit is bijvoorbeeld hoe het formulier eruit zou zien op dit punt in Internet Explorer 8:
We denken nu na over het implementeren van de interactie die Matt met JavaScript heeft gemaakt. We zullen dit grotendeels bereiken door toe te voegen en te verwijderen CSS klassen.
U merkt vlak voor de sluiting tag plaatsen we een link naar ons aangepaste JavaScript-bestand met de naam
scripts.js
. We kunnen dat bestand nu aanmaken en de browser vertellen om de code uit te voeren wanneer het DOM is gereed:
$ (document) .ready (function () // Onze code hier);
placeholder
ondersteuningIn het geval dat u het nog niet gemerkt heeft, is deze interactie in hoge mate afhankelijk van de ondersteuning voor plaatshouders. Het kenmerk placeholder wordt breed ondersteund in moderne browsers. Omdat onze formulierinteractie zo afhankelijk is van tijdelijke aanduidingondersteuning, zullen we eerst testen of de browser tijdelijke tekst ondersteunt. Als dit het geval is, zullen we de formulierinteractie implementeren. Als dit niet het geval is (IE8 en IE9), geven we eenvoudig het basisformulier zonder JavaScript-interactie. Progressieve verbetering voor de overwinning!
Laten we eerst jQuery's gebruiken $ .Support ()
om te zien of de browser tijdelijke tekst ondersteunt. Dit zal instellen $ .support.placeholder
naar waar of onwaar, afhankelijk van de ondersteuning van de browser voor tijdelijke tekst.
// Test voor tijdelijke aanduiding ondersteuning $ .support.placeholder = (function () var i = document.createElement ('input'); retourneer 'placeholder' in i;) ();
Als tekst van placeholder wordt ondersteund, kunnen we de tekst verbergen elementen op de pagina laden. Zoals eerder vermeld, kan het verbergen van de labels met JavaScript nadat de pagina is geladen ervoor zorgen dat browsers met JavaScript uitgeschakeld (en die zonder ondersteuning voor plaatshouders) nog steeds het formulier kunnen gebruiken.
// Verberg labels standaard als tijdelijke aanduidingen worden ondersteund als ($. Support.placeholder) $ ('. Form li'). Each (function () $ (this) .addClass ('js-hide-label'); ); // Code voor het toevoegen / verwijderen van klassen hier
Merk op dat we een klasse hebben toegevoegd aan elk genoemd lijstitem js-hide-label
. Dit komt omdat, volgens de interactieregels aan het begin van de zelfstudie, de standaardweergave van het formulier de formulierveldlabels heeft verborgen. De js-hide-label
klasse wordt toegepast op bovenliggend niveau elementen wanneer de afstammeling
element is leeg van gebruikersinhoud.
Om te helpen bij het begrip en de code-onderhoudbaarheid, voegen we de klassen toe die we toevoegen of verwijderen met JavaScript met 'js-'. Laten we die klasse toevoegen aan onze stylesheet en deze gebruiken om alle afstammelingen te verbergen label
elementen uit het zicht. Weet je nog hoe we de ondoorzichtigheid
regel? Dit is waar we het gebruiken om het te verbergen elementen:
.js-hide-label label opacity: 0; top: 1.5em
Notitie: De ondoorzichtigheid
eigenschap wordt ondersteund in alle moderne browsers. IE8 zal het niet herkennen, maar dat is prima, want IE8 ondersteunt ook geen tijdelijke aanduidingen, dus we voeren eigenlijk niet het JavaScript uit om de klasse toe te passen in IE8. Win-win!
Als je goed in de gaten houdt, laat het interactieontwerp van Matt zien dat de veldveldlabels niet alleen verschijnen en verdwijnen, maar dit ook doen met een kleine op en neergaande beweging. Omdat onze labelelementen absoluut zijn gepositioneerd, kan de browser dit effect overzetten wanneer we een klasse toevoegen die de toppositionering (of links, rechts of onderaan) wijzigt. Het enige wat we moeten doen is een overgangseigenschap aan het label zelf toevoegen.
Laten we teruggaan naar onze label
element in de CSS en voeg een overgangseigenschap toe voor de top
en ondoorzichtigheid
eigenschappen:
label -webkit-transition: .333s ease top, .333s troebelheid; overgang: .333s gemak top, .333s opaciteit;
Hierdoor kunnen de labels niet alleen vloeiend verschijnen en verdwijnen, maar op en neer wiebelen wanneer ze volledig ondoorzichtig of transparant worden, zoals:
Je zou nu iets als dit moeten hebben wanneer je de pagina laadt (in een moderne browser natuurlijk).
Zoals eerder vermeld, zijn we klassen aan het toevoegen en verwijderen elementen en richt zich op kinderen die styling nodig hebben. Op dit punt (op pagina laden) hebben we een klasse toegevoegd
js-hide-label
die alle labels in het formulier verbergt. Nu hebben we nog een klas nodig voor het verwijderen van de markeerkleur uit de elementen:
.js-unhighlight-label label color: # 999
Nu hebben we een formulier dat geleidelijk wordt uitgebreid en klaar is voor enige JavaScript-interactie (in moderne browsers) wanneer de gebruiker begint te communiceren met het formulier.
In de tijdelijke aanduiding als
verklaring die we hierboven schreven, laten we beginnen met het toevoegen en verwijderen van onze js-
lessen op het juiste moment. Eerst zullen we onze formulierelementen selecteren en een gebeurtenislistener toevoegen aan de vervagen
, focus
, en keyup
evenementen (we gebruiken keyup
liever dan toets neer
of toets indrukken
omdat deze gebeurtenissen voortijdig worden geactiveerd):
$ ('. form li'). find ('input, textarea'). on ('keyup blur focus', functie (e) // Cache onze selectors var $ this = $ (this), $ parent = $ this .parent (); // Klassen toevoegen of verwijderen als (e.type == 'keyup') // keyup-code hier else if (e.type == 'blur') // blur code here else if (e.type == 'focus') // focuscode hier);
Hier is een korte uitleg van wat we hier doen:
$ ('. form li')
. Vervolgens vinden we binnen die selectie alles
en
velden .find ('input, textarea')
. Dit zorgt ervoor dat de laatste invoer in onze opmaak (de verzendknop) niet is opgenomen in onze selectie.vervagen
, focus
, en keyup
gebeurtenissen en eenvoudig het gebeurtenistype controleren met e.type
om te bepalen welke klassen we op specifieke momenten zullen toevoegen of verwijderen.keyup
Volgens de interactieregels die we aan het begin hebben opgesteld en die overeenkomen met het ontwerp van Matt, wanneer een gebruiker begint met het invoeren van tekst (niet wanneer ze zich op het veld concentreren) willen we het label laten zien.
Dus, met behulp van de keyup
gebeurtenis, elke keer dat de gebruiker een teken invoert, kunnen we controleren of het invoerveld leeg is (deze code gaat naar binnen if (e.type == 'key-up')
:
if ($ this.val () == ") $ parent.addClass ('js-hide-label'); else $ parent.removeClass ('js-hide-label');
Merk op dat onze logica als volgt werkt:
U zou nu iets moeten hebben dat zo werkt wanneer u tekst invoert of verwijdert uit een invoerveld:
vervagen
Nu, volgens onze interactieregels (opnieuw), weten we dat wanneer een gebruiker de focus van het ene invoerveld naar het volgende verplaatst (vervagen
evenement), moeten we de kleur van de element afhankelijk van of de gebruiker daadwerkelijk iets in het veld heeft ingevoerd.
Binnen in de anders als (e.type == 'vervagen')
, we zullen de volgende code toevoegen:
if ($ this.val () == ") $ parent.addClass ('js-hide-label'); else $ parent.removeClass ('js-hide-label'). addClass ('js-unhighlight -label');
Merk op dat onze logica als volgt werkt:
js-hide-label
klasse.js-hide-label
en benadruk de kleur van het label door de klasse 'js-unhighlight-label' toe te voegen.Je zou nu iets moeten hebben dat de nadruk legt op de kleur van het label wanneer je focus verwijdert, zoals dit:
focus
Ten slotte moeten we een beetje logica toevoegen voor wanneer een gebruiker zich op een invoer richt. Volgens onze interactieregels gebruiken we het volgende JavaScript in de else if (e.type == 'focus')
sectie:
if ($ this.val ()! == ") $ parent.removeClass ('js-unhighlight-label');
Onze logica werkt als volgt:
Wanneer een gebruiker zich nu concentreert op een formulierveld, als het niet leeg is, wordt het label benadrukt met de markeringskleur, zoals:
We kunnen nog veel meer doen met dit formulier, inclusief de toevoeging van client- en server-side validatie. We kunnen ook een paar meer klassen maken voor het opmaken van geldige en ongeldige veldwaarden. We zouden bijvoorbeeld stijlen kunnen toevoegen aan een klasse van 'js-error' die zou gaan op de ouder element wanneer de waarde van de invoer ongeldig is, zoals:
.js-error border-colour: # f13b3b! important; / * negeer alle gevallen * / .js-error + li border-top-colour: # f13b3b; .js-error label color: # f13b3b;
Dit soort validatiestijlen kan onze vorm er ongeveer zo uit laten zien:
Deze zelfstudie was echter bedoeld om te laten zien hoe we een toegankelijke, geleidelijk verbeterde vorm kunnen creëren die het ontwerp van Matt nabootst. En ik moet zeggen dat ik denk dat we het redelijk goed hebben gedaan.
U kunt dit formulier op elk gewenst moment in uw eigen projecten kopiëren, wijzigen of verbeteren!