Trả lời vào năm 2019:
Cách tốt nhất (thực ra là cách duy nhất *) để mô phỏng sự kiện nhấp thực tế chỉ bằng CSS (thay vì chỉ di chuột trên một phần tử hoặc làm cho phần tử hoạt động, trong đó bạn không có mouseUp ) là sử dụng hack hộp kiểm. Nó hoạt động bằng cách gắn một label
đến một <input type="checkbox">
yếu tố qua của nhãn for=""
thuộc tính.
Tính năng này có hỗ trợ trình duyệt rộng (lớp :checked
giả là IE9 +).
Áp dụng cùng một giá trị cho một <input>
's ID thuộc tính và kèm theo <label>
' s for=""
thuộc tính, và bạn có thể nói với các trình duyệt để tái kiểu nhãn trên nhấp chuột với :checked
pseudo-class, nhờ thực tế là nhấp chuột vào một nhãn sẽ kiểm tra và bỏ chọn "Liên kết" <input type="checkbox">
.
* Bạn có thể mô phỏng một "lựa chọn" sự kiện thông qua :active
hoặc :focus
pseudo-class trong IE7 + (ví dụ cho một nút đó là bình thường 50px
rộng, bạn có thể thay đổi chiều rộng của nó trong khi active
: #btnControl:active { width: 75px; }
), nhưng đó là không đúng sự thật "click" sự kiện. Chúng "sống" trong toàn bộ thời gian phần tử được chọn (chẳng hạn như bằng cách Tabsử dụng bàn phím của bạn), khác một chút so với sự kiện nhấp chuột thực sự, kích hoạt một hành động trên - thông thường - mouseUp
.
Bản demo cơ bản của hộp kiểm hack (cấu trúc mã cơ bản cho những gì bạn đang hỏi):
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>
Ở đây tôi đã định vị nhãn ngay sau khi nhập vào đánh dấu của tôi. Điều này là để tôi có thể sử dụng bộ chọn anh chị em liền kề ( +phím) để chỉ chọn nhãn ngay sau #demo
hộp kiểm của mình . Vì lớp :checked
giả áp dụng cho hộp kiểm, #demo:checked + label
sẽ chỉ áp dụng khi hộp kiểm được chọn.
Bản demo để định cỡ lại hình ảnh khi nhấp, đó là những gì bạn đang hỏi:
#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>
Với con người mà nói, có là một số tin xấu. Bởi vì một nhãn chỉ có thể được liên kết với một điều khiển biểu mẫu tại một thời điểm , điều đó có nghĩa là bạn không thể thả một nút bên trong các <label></label>
thẻ và gọi nó là một ngày. Tuy nhiên, chúng ta có thể sử dụng một số CSS để làm cho nhãn trông và hoạt động khá gần với cách một nút HTML trông và hành xử.
Bản trình diễn để bắt chước hiệu ứng nhấp vào nút, bên trên và ngoài những gì bạn đang hỏi:
#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>
Hầu hết các CSS trong bản demo này chỉ để tạo kiểu cho phần tử nhãn. Nếu bạn không thực sự cần một nút và bất kỳ yếu tố cũ nào cũng đủ, thì bạn có thể xóa gần như tất cả các kiểu trong bản demo này, tương tự như bản demo thứ hai của tôi ở trên.
Bạn cũng sẽ nhận thấy tôi có một tài sản tiền tố ở đó , -moz-outline-radius
. Một thời gian trước, Mozilla đã thêm tài sản phi thông số tuyệt vời này vào Firefox, nhưng những người ở WebKit đã quyết định rằng họ sẽ không thêm nó , thật không may. Vì vậy, hãy xem dòng CSS đó chỉ là một cải tiến tiến bộ cho những người sử dụng Firefox.
:active
hoạt động trong khi chuột xuống Tùy thuộc vào những gì bạn đang cố gắng thực hiện, bạn có thể làm cho nó hoạt động bằng cách sử dụng lớp giả CSS4:target
.