Użyteczne formularze
Aplikacje sieciowe rządzą się swoimi prawami, jednym z nich jest niemożliwość uniknięcia formularzy. Te ostatnie można zaprojektować lepiej lub gorzej, zastanówmy się więc, co zrobić, aby były chociaż ciut wygodniejsze w użyciu.
Przede wszystkim należy się wystrzegać układu wielokolumnowego. Schemat najwygodniejszy dla oka to dwie kolumny, gdzie jedna zawiera opisy pól, zaś druga to kontrolki niezbędne do wprowadzania danych. Kolumnę z nagłówkami można wyrównać - wedle uznania - do lewej lub prawej, jednak jej centrowanie jest raczej kiepskim pomysłem - zabija to ideę układu dwukolumnowego, gdzie wszystkie dane wyrównane są do jednej (w przypadku wyrównania nagłówków do prawej) lub dwóch (w przypadku wyrównania do lewej) osi. Może się wydawać, że zysk na czytelności jest niewielki, jednak badania prowadzone z udziałem ludzi po czterdziestym roku życia pokazują, że dla nich różnica jest znaczna.
Należy grupować logicznie powiązane ze sobą dane w nazwane zestawy pól. Służy do tego element <fieldset/> w połączeniu z obowiązkowym elementem <legend/>. Zwiększa to czytelność formularza, usuwa wrażenie bezładu i uzasadnia taką a nie inną kolejność pól.
Powinno się unikać nadmiarowych pól. Jeśli aplikacja nie wymaga poszczególnych składowych adresu (jak np. numer domu), to znacznie ułatwimy życie swoim gościom, jeśli skleimy pola typu ulica, nr domu, nr lokalu, kod pocztowy i miasto w jedno większe pole zatytułowane adres, podając pod spodem oczekiwany format adresu. Powód jest prosty - większość użytkowników do przełączania się pomiędzy polami formularza używa myszy, więc konieczność wypełnienia kilku pól więcej jest bardzo uciążliwa.
Staraj się, aby wszystkie pola były podobnej długości, nie wprowadzaj więcej niż dwie - trzy różne długości pól, w ten sposób łatwiej podążać wzrokiem za nagłówkami, nie skupiając się na samych polach.
Do reprezentacji alternatywy wybieraj odpowiednie kontrolki. Jeśli opcje są dwie, to odpowiedni będzie checkbox (dla odpowiedzi tak/nie) lub 2 radiobuttony (w pozostałych przypadkach), niedopuszczalne jest np. użycie checkboksa do wyboru pomiędzy dwoma kolorami (zaznacz, jeśli produkt ma być czerwony, w przeciwnym wypadku będzie żółty
). Radiobuttony są najlepszym wyjściem, kiedy opcji jest więcej niż dwie - zapewniają największą czytelność, bo wszystkie opcje widoczne są jednocześnie. Mają jednak jedną wadę - zajmują dużo miejsca, co bardzo przeszkadza, kiedy opcji jest więcej. Wtedy lepiej użyć rozwijalnej listy, jednak powinna to być ostateczność, bo jej użycie wymaga dodatkowego kliknięcia, zanim pojawią się dostępne opcje. Wystrzegać za to należy się listy (selectbox z liczbą wierszy większą niż jeden) - internauci nie są przyzwyczajeni do tej kontrolki i często nie wiedzą, jak z niej korzystać.
Do wyboru kilku spośród równorzędnych opcji zawsze najlepsza jest seria checkboksów. Niech nikomu nawet przez myśl nie przejdzie implementacja takiego wyboru za pomocą listy z włączoną opcją kilku wyborów. Lista jest przede wszystkim niewygodna - wymaga przewijania w celu dostania się do potrzebnych nam opcji. Jest też nieintuicyjna - wybranie kilku opcji wymaga przytrzymania klawisza Control (lub innego w przypadku architektur różnych od PC), z czego niewiele osób zdaje sobie sprawę. Ewentualne zaoszczędzone względem checkboksów miejsce trzebaby poświęcić na instrukcję obsługi korzystania z kontrolki listy.
Nie ma nic bardziej denerwującego niż klikanie na wielki napis tak, zgadzam się
tylko po to, żeby dowiedzieć się, że nie jest on klikalny i musimy celować w niewielkich rozmiarów biały kwadracik checkboksa znajdującego się obok. Należy korzystać z elementu <label/>, pozwala on na uzyskanie fokusa przez kontrolkę po kliknięciu na jej opis i jest szalenie wygodne w przypadku każdego typu pól. Wystarczy atrybut for elementu <label/> ustawić na taką samą wartość, jak atrybutowi id odpowiedniej kontrolki.
Osoby starsze bardzo pozytywnie reagują na mały zabieg, polegający na wyróżnieniu aktywnego pola za pomocą niewielkiej zmiany kolorów. Można to uzyskać przez odpowiednie reguły CSS, jednak efekt ten nie zadziała w IE. Niestety, ta przeglądarka wymaga dodatkowych skryptów JS.
Na koniec najprostszy zabieg - zatrudnienie do pracy JavaScriptu. Pozwala to na przetworzenie i zweryfikowanie formularza jeszcze przed wysłaniem go na serwer. Jak często zdarzyło się wam klikać wyślij
dziesiąty raz z rzędu, aby po minucie ładowania otrzymać kolejny komunikat o niewypełnionym polu? Jeśli przeglądarka wspiera JS, to można przygotować nieinwazyjny skrypt, który sam po cichu podłączy się do formularzy na stronie i przed ich wysłaniem upewni się, że wszystko wpisaliśmy zgodnie z intencjami autora serwisu. Tutaj uwaga - wyświetlenie komunikatu nie wypełniłeś wymaganych pól
nie mówi użytkownikowi wiele. Należy przy okazji wskazać mu pola, o których zapomniał.
Przykład zastosowania JavaScriptu do wstępnej walidacji formularza można znaleźć na mojej stronie demonstracyjnej.
Można tam też zobaczyć niewielki gadżet - pasek postępu
wysyłania formularza, który daje użytkownikowi poczucie, że coś się dzieje, co jest szczególnie ważne w przypadku uploadu dużych plików za pomocą formularza na stronie.
Na drugiej stronie demonstracyjnej można zobaczyć przykład innego skryptu - wyświetlania podpowiedzi wewnątrz pól edycyjnych, co przydaje się szczególnie, jeśli na stronie nie ma miejsca na opis dla danego pola (np. mini-wyszukiwarki umieszczane w nagłówkach stron).
Oczywiście, nie wyczerpałem tutaj tematu i nawet nie miałem takiego zamiaru - jest to tylko garść (mam nadzieję, że przydatnych) porad.

13 lipca 2005 o 23:49:10
"Osoby starsze bardzo pozytywnie reagują na mały zabieg" - wtf? :) Mam 19 lat i _kocham_ takie wyróżnienie.. pomaga _bardzo_.
A tak poza tym to artykuł świetny. Byłby dla mnie odkryciem różnych fajnych rzeczy, gdyby nie art bhanga na NoFrontiers, przeczytany kiedys (choc tam troszke bledow bylo).
Dzieki jeszcze raz :) - zwlaszcza za przyklady ze skryptami JS.
14 lipca 2005 o 08:50:37
Co do skryptów JS, to zapomniałeś napisać (dla Ciebie pewnie to oczywiste, ale nie dla każdego), że formularz powinien być używalny także przy wyłączonym JS. Nieźle muszę kombinować ze zmianą konfiguracji pewnych modemów (zarządzanych przez WWW) z konsoli tekstowej, bo przycisk "Send" jest tam włączany przez skrypt pod przyciskiem "Verify"... Swoją drogą, interfejsy WWW do zarządzania sprzętem sieciowym zwykle są idealnymi przykładami jak nie robić interfejsów użytkownika i w jaki sposób nie należy używać JS ;-)
14 lipca 2005 o 08:52:20
Jajcuś:
U mnie w przykładzie jest zwykły formularz z pełną funkcjonalnością. Skrypty JS podłączają się do niego same, więc jeśli ktoś nie ma JS to form będzie mu działał jak zwykły form ;]
14 lipca 2005 o 08:56:17
Patrys: ja to wiedziałem, nawet nie oglądając tych przykładów. ;-)
Ale zapewniam Cię, że znalazło by się wielu, co by uznało, że skoro taki Patrys napisał („gdzieś w sieci było napisane”), że JS w formularzach to dobra rzecz, to jak ktoś może się potem czepiać, że JS jest wymagany przez jakiś formularz...
14 lipca 2005 o 09:46:46
Żaden z przykładów nie działa w Operze. Nie wiem czy testowałeś, może to po prostu wina tego, że korzystam z wersji beta (czyt: 8.02), a innej nie mam pod ręką.
Konsola JavaScriptu nie pokazuje błedów.
14 lipca 2005 o 11:35:19
Fakt, nie testowałem pod Operą, ale to prawdopodobnie błąd w addEvent() jakiś - przykład jest żywcem wycięty z systemu CMS, nad którym pracujemy i tam wszystko działa w Operze.
14 lipca 2005 o 16:17:36
Na drugiej stronie demonstracyjnej jest denerwujący zabieg jak nie ma się JS, bo trzeba ręcznie te podpowiedzi wymazywać. Można by się może pokusić o większy skrypt, który weźmie opisy do tych pól z dokumentu, wstawi je do pola <input> i ukryje orginał. Wtedy bez JS byłyby nieinwazyjne opisy :) Tylko czy warte aż tyle zachodu?
14 lipca 2005 o 16:49:51
Ale te opisy wstawia sam JS, więc jeśli go nie masz włączonego, to się nie pojawią wcale.
14 lipca 2005 o 16:52:23
A racja... nie wiem czemu mi Fx zostawił teksty po wyłączenu JS i przeładowaniu... zwracam honor :)
15 lipca 2005 o 05:59:06
@Taeril: moze dlatego, ze firefox nigdy nie czysci tego co masz w polachformularza po relaodzie, chyba ze mu kazesz za pomoca ctrl+shift+r
16 lipca 2005 o 10:52:43
Patrys - skad wiadomo, ze internauci nie wiedza, jak korzystac z komponentu <select> z wieloma wierszami?
Taki komponent nalezy do standardowych komponentow GUI. Poza tym nikt nie kaze czynic tego komponentu multiselectem. Wreszcie mozna w ten sposob pokazac np. 5 z 30 opcji do wyboru, co jest odpowiednikiem "ciagle rozwinietego" selecta z size=1, a zajmuje mniej miejsca, niz 30 radiobuttonow.
Jakis link, wyniki badan, chocby Alertbox Nielsena ;P, sugerujace, ze internauci nie rozumieja selecta z size>1??
17 lipca 2005 o 22:18:08
Warto również przejrzeć sobie "hall of shame" z różnymi przykładami, jak nie należy robić interfejsu użytkownika (http://www.frankmahler.de/mshame/Termino.htm).
Polecam szczególnie ten obrazek:
http://www.frankmahler.de/mshame/TerminoGifs/cse60.gif
24 lipca 2005 o 03:46:19
http://nf.hyperreal.info/patrz/dostepne-formularze/