Het Float Label-formulierpatroon implementeren

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.


Overzicht

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:


Bekijk de originele Dribbble-opname op floatlabel.com

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!


Vorm anatomie

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.

Formulierstructuur

Het formulier heeft de volgende elementen die we kunnen vertalen HTML:

  • elementen
  • elementen

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.


Basispaginastijlen maken

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.



Formulierenlijststijlen maken

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:



Formulierstijlstijlen maken

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:



JavaScript gebruiken voor een progressief verbeterd formulier

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);

Controleren op placeholder ondersteuning

In 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!

    Een opmerking over overgangen

    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).



    De markeringskleur verwijderen

    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

    Event-luisteraars toevoegen

    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:

    • We selecteren alle lijstitems die deel uitmaken van ons formulier $ ('. form li'). Vervolgens vinden we binnen die selectie alles en