Odpowiedź od 2019 r .:
Najlepszym sposobem (właściwie jedynym sposobem *) na symulację rzeczywistego zdarzenia kliknięcia przy użyciu tylko CSS (zamiast najechania myszką na element lub aktywowania elementu, gdy nie masz mouseUp ), jest użycie hackowania pola wyboru. Działa poprzez dołączenie a label
do <input type="checkbox">
elementu za pomocą for=""
atrybutu etykiety .
Ta funkcja ma szeroką obsługę przeglądarki ( :checked
pseudo-klasa to IE9 +).
Stosować tę samą wartość do <input>
„s atrybut ID i towarzyszącej <label>
” s for=""
atrybutu, i można powiedzieć, przeglądarkę do ponownego stylu etykieta na kliknięcia z :checked
pseudo-klasie, dzięki temu, że kliknięcie etykiety sprawdzi i odznacz "powiązany"<input type="checkbox">
.
* Można symulować „wybrane” zdarzenie za pośrednictwem :active
lub :focus
pseudo-klasy w IE7 + (np za pomocą przycisku, który jest zwykle 50px
szeroki, można zmienić jego szerokość, natomiast active
: #btnControl:active { width: 75px; }
), ale te nie są prawdziwe „kliknięcie” wydarzenia. Są one „aktywne” przez cały czas wybierania elementu (na przykład przez Tabbing za pomocą klawiatury), co nieco różni się od zdarzenia prawdziwego kliknięcia, które uruchamia akcję - zazwyczaj - mouseUp
.
Podstawowe demo hacka pola wyboru (podstawowa struktura kodu o co pytasz):
label {
display: block;
background: lightgrey;
width: 100px;
height: 100px;
}
#demo:checked + label {
background: blue;
color: white;
}
<input type="checkbox" id="demo"/>
<label for="demo">I'm a square. Click me.</label>
Tutaj umieściłem etykietę zaraz po danych wejściowych w znacznikach. Jest tak, że mogę użyć sąsiedniego selektora rodzeństwa ( +klawisza), aby zaznaczyć tylko etykietę, która następuje bezpośrednio po moim polu #demo
wyboru. Ponieważ :checked
pseudoklasa dotyczy pola wyboru,#demo:checked + label
będzie obowiązywać tylko wtedy, gdy pole wyboru jest zaznaczone.
Demo zmiany rozmiaru obrazu po kliknięciu, o co pytasz:
#btnControl {
display: none;
}
#btnControl:checked + label > img {
width: 70px;
height: 74px;
}
<input type="checkbox" id="btnControl"/>
<label class="btn" for="btnControl"><img src="http://placekitten.com/200/140" id="btnLeft" /></label>
Biorąc to pod uwagę, są złe wieści. Ponieważ etykieta może być skojarzona tylko z jedną kontrolką formularza na raz , oznacza to, że nie można po prostu wrzucić przycisku do <label></label>
tagów i nazwać go dniem. Jednak możliwe użyć CSS, aby etykieta wyglądała i zachowywała się dość blisko tego, jak przycisk HTML wygląda i zachowuje się.
Demo naśladujące efekt kliknięcia przycisku, wykraczający poza to, o co pytasz:
#btnControl {
display: none;
}
.btn {
width: 60px;
height: 20px;
background: silver;
border-radius: 5px;
padding: 1px 3px;
box-shadow: 1px 1px 1px #000;
display: block;
text-align: center;
background-image: linear-gradient(to bottom, #f4f5f5, #dfdddd);
font-family: arial;
font-size: 12px;
line-height:20px;
}
.btn:hover {
background-image: linear-gradient(to bottom, #c3e3fa, #a5defb);
}
.btn:active {
margin-left: 1px 1px 0;
box-shadow: -1px -1px 1px #000;
outline: 1px solid black;
-moz-outline-radius: 5px;
background-image: linear-gradient(to top, #f4f5f5, #dfdddd);
}
#btnControl:checked + label {
width: 70px;
height: 74px;
line-height: 74px;
}
<input type="checkbox" id="btnControl"/>
<label class="btn" for="btnControl">Click me!</label>
Większość CSS w tym demo służy tylko do stylizacji elementu etykiety. Jeśli tak naprawdę nie potrzebujesz przycisku , a wystarczy dowolny stary element, możesz usunąć prawie wszystkie style z tej wersji demo, podobnie jak w mojej drugiej wersji powyżej.
Zauważysz również mam jedną właściwość ustaloną z góry w tam -moz-outline-radius
. Jakiś czas temu Mozilla dodała tę niesamowitą nieokreśloną właściwość do Firefoksa, ale ludzie z WebKit zdecydowali, że nie zamierzają jej dodawać , niestety. Więc rozważ tę linię CSS jako progresywne ulepszenie dla osób korzystających z Firefoksa.
:active
działa, gdy mysz jest wciśnięta. W zależności od tego, co próbujesz zrobić, możesz być w stanie sprawić, że będzie działać przy użyciu pseudoklasy CSS4:target
.