Chciałbym mieć alternatywę dla standardowego pola wyboru - w zasadzie chciałbym używać obrazów, a gdy użytkownik kliknie obraz, wygaszam go i nakładam pole wyboru.
Krótko mówiąc, chcę zrobić coś takiego, jak Recaptcha 2, gdy powoduje to kliknięcie obrazów spełniających określone kryteria. Możesz zobaczyć tutaj demo Recaptcha, ale czasami może to spowodować rozwiązanie pytań tekstowych, w przeciwieństwie do wyboru obrazu. Oto zrzut ekranu:
Po kliknięciu jednego z obrazów (w tym przypadku zawierającego obrazek steku), obraz, który klikasz, zmniejsza się i pojawia się niebieski znacznik wskazujący, że został on zaznaczony.
Powiedzmy, że chcę odtworzyć dokładnie ten przykład.
Zdaję sobie sprawę, że mogę mieć 9 ukrytych pól wyboru i dołączam trochę jQuery, aby po kliknięciu obrazu zaznaczało / odznaczało ukryte pole wyboru. Ale co z kurczeniem się obrazu / nakładaniem kleszcza?
źródło
:before
magicznie na obraz zaznaczenia?Odpowiedzi:
Czysto semantyczne rozwiązanie HTML / CSS
Jest to łatwe do wdrożenia we własnym zakresie, nie jest konieczne żadne gotowe rozwiązanie. Również wiele Cię nauczy, ponieważ nie wydajesz się zbyt łatwy w CSS.
Oto, co musisz zrobić:
Twoje pola wyboru muszą mieć różne
id
atrybuty. Pozwala to na podłączenie<label>
do niego przy użyciufor
-atrybut etykiety .Przykład:
Dołączenie etykiety do pola wyboru wywoła zachowanie przeglądarki: za każdym razem, gdy ktoś kliknie etykietę (lub znajdujący się w niej obraz), pole wyboru zostanie przełączone.
Następnie ukryjesz to pole wyboru, przykładając się
display: none;
do niego na przykład .Teraz pozostaje tylko ustawić żądany styl dla swojego
label::before
pseudoelementu (który będzie używany jako wizualne elementy zastępujące pole wyboru):Ostatnim trudnym krokiem jest użycie
:checked
pseudoselektora CSS do zmiany obrazu, gdy pole wyboru jest zaznaczone:+
( Sąsiaduje selektor rodzeństwa ) sprawi, że tylko zmiana etykiety, które bezpośrednio śledzić ukryte pole wyboru w znacznikach.Możesz to zoptymalizować, umieszczając oba obrazy w mapie spritem i stosując tylko zmianę
background-position
zamiast zamiany obrazu.Oczywiście musisz prawidłowo
display: block;
ustawić etykietę oraz nałożyć i ustawić prawidłowewidth
iheight
.Edytować:
Przykład codepen i fragment kodu, który utworzyłem po tych instrukcjach, używają tej samej techniki, ale zamiast używać obrazów dla pól wyboru, zamiany pól wyboru są wykonywane wyłącznie za pomocą CSS , tworząc
::before
na etykiecie, którą po zaznaczeniu macontent: "✓";
. Dodaj zaokrąglone krawędzie i słodkie przejścia, a wynik będzie naprawdę przyjemny!Oto działający kod, który prezentuje technikę i nie wymaga obrazów dla pola wyboru:
Oto ten sam kod we fragmencie:
źródło
:hover
:)Czyste rozwiązanie CSS
Wywołane są trzy zgrabne urządzenia:
:checked
selektor::before
Pseudo selektorcontent
.źródło
<input type="radio" name="myRadio" id="myRadio1" />
także zmienia swój css, aby ukryć punktor:input[type=radio]{display: none;}
Zobacz tę wtyczkę jQuery: imgCheckbox (na npm i bower )
Zastrzeżenie: do rozwiązania tego problemu nie jest potrzebny skrypt javascript. Napięcie występuje między łatwością konserwacji a wydajnością kodu. Chociaż nie jest potrzebna wtyczka (ani żaden javascript), z pewnością przyspiesza tworzenie i często ułatwia zmianę.
Rozwiązanie Barebones:
Z bardzo prostym HTML (bez bałaganu z polami wyboru i etykietami itp.):
Możesz użyć toggleClass jQuery, aby włączyć / wyłączyć a
selected
lubchecked
klasę wclick
zdarzeniu:Zaznaczone elementy są pobierane za pomocą
Plus Coolness:
Możesz stylizować obrazy na podstawie tego, ale dużym problemem jest to, że bez innych elementów DOM nie możesz nawet używać
::before
i::after
dodawać rzeczy takie jak znaczniki wyboru. Rozwiązaniem jest owinięcie obrazów innym elementem (i sensowne jest również dołączenie odbiornika kliknięć do opakowanego elementu).Dzięki temu Twój kod HTML jest naprawdę czysty, a plik js niewiarygodnie czytelny. Spójrz na fragment ...
Pokaż fragment kodu
Korzystanie z wtyczki imgCheckbox jQuery:
Zainspirowany powyższym rozwiązaniem zbudowałem wtyczkę, której można używać równie łatwo jak:
Zobacz to w akcji (i zobacz źródło )
źródło
Dodałbym dodatkowy element div z
position: relative;
i,class="checked"
który ma taką samą szerokość / wysokość jak obraz i pozycję wleft: 0; top: 0;
zawierającym ikonę. Zaczyna się oddisplay: none;
.Teraz możesz posłuchać
click
zdarzenia:W ten sposób możesz uzyskać ikonę, a także zmienić rozmiar obrazu na mniejszy.
Uwaga: Chciałem tylko pokazać "logikę" stojącą za moimi myślami, ten przykład może nie działać lub zawiera pewne błędy.
źródło
Zauważyłem, że inne odpowiedzi albo nie używają
<label>
(dlaczego nie?), Albo wymagają dopasowaniafor
iid
atrybutów. Oznacza to, że jeśli masz sprzeczne identyfikatory, twój kod nie będzie działał i musisz pamiętać, aby za każdym razem tworzyć unikalne identyfikatory.Ponadto, jeśli ukryjesz za
input
pomocądisplay:none
lubvisibility:hidden
, przeglądarka nie skupi się na nim.Pole wyboru i jego tekst (lub w tym przypadku obraz) można umieścić w etykiecie:
źródło
Oto szybki przykład wyboru obrazu, takiego jak pole wyboru
Zaktualizowany przykład przy użyciu Knockout.js:
źródło
Aby rozwinąć zaakceptowaną odpowiedź dla każdego, kto używa WordPress i GravityForms do generowania swoich formularzy i chce automatycznie wypełniać pola wyboru listą postów i powiązaną z nimi miniaturą
Oraz CSS:
źródło