Như các câu trả lời khác đã nêu, iOS Safari không kích hoạt lớp :active
giả trừ khi một sự kiện cảm ứng được gắn vào phần tử, nhưng cho đến nay hành vi này là "phép thuật". Tôi đã xem qua điều này trên Thư viện nhà phát triển Safari giải thích nó (tôi nhấn mạnh):
Bạn cũng có thể sử dụng thuộc tính -webkit-tap-highlight-color
CSS kết hợp với việc đặt sự kiện cảm ứng để định cấu hình các nút hoạt động tương tự như màn hình. Trên iOS, các sự kiện chuột được gửi nhanh đến mức không bao giờ nhận được trạng thái hoạt động hoặc ngừng hoạt động. Do đó, :active
trạng thái giả chỉ được kích hoạt khi có sự kiện chạm được đặt trên phần tử HTML — ví dụ: khi ontouchstart được đặt trên phần tử như sau:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
Giờ đây khi nhấn và giữ nút trên iOS, nút sẽ chuyển sang màu được chỉ định mà không xuất hiện màu xám trong suốt xung quanh.
Nói cách khác, việc thiết lập một ontouchstart
sự kiện (ngay cả khi nó trống) là thông báo rõ ràng cho trình duyệt phản ứng với các sự kiện chạm.
Theo ý kiến của tôi, đây là hành vi thiếu sót, và có lẽ đã có từ thời điểm web "di động" về cơ bản không tồn tại (hãy xem những ảnh chụp màn hình đó trên trang được liên kết để hiểu ý tôi), và mọi thứ đều được định hướng bằng chuột. Điều thú vị cần lưu ý là các trình duyệt di động khác, mới hơn, chẳng hạn như trên Android, hiển thị trạng thái giả `: active 'khi chạm tốt mà không có bất kỳ hack nào như những gì cần thiết cho iOS.
(Lưu ý: Nếu bạn muốn sử dụng các kiểu tùy chỉnh của riêng mình trên iOS, bạn cũng có thể tắt hộp mờ màu xám mặc định mà iOS sử dụng thay cho :active
trạng thái giả bằng cách sử dụng thuộc tính -webkit-tap-highlight-color
CSS, như được giải thích trong cùng một trang được liên kết ở trên .)
Sau một số thử nghiệm, giải pháp dự kiến đặt ontouchstart
sự kiện trên <body>
phần tử mà tất cả các sự kiện chạm vào bong bóng không hoạt động đầy đủ. Nếu phần tử hiển thị trong chế độ xem khi tải trang, thì phần tử đó hoạt động tốt, nhưng việc cuộn xuống và nhấn vào một phần tử nằm ngoài chế độ xem không kích hoạt :active
trạng thái giả như nó nên làm. Vì vậy, thay vì
<!DOCTYPE html>
<html><body ontouchstart></body></html>
đính kèm sự kiện vào tất cả các phần tử thay vì dựa vào sự kiện nổi lên phần thân (sử dụng jQuery):
$('body *').on('touchstart', function (){});
Tuy nhiên, tôi không biết về tác động hiệu suất của điều này, vì vậy hãy cẩn thận.
CHỈNH SỬA: Có một lỗ hổng nghiêm trọng với giải pháp này: ngay cả khi chạm vào một phần tử trong khi cuộn trang sẽ kích hoạt :active
trạng thái giả. Độ nhạy quá mạnh. Android giải quyết vấn đề này bằng cách tạo ra một độ trễ rất nhỏ trước khi trạng thái được hiển thị, trạng thái này sẽ bị hủy nếu trang được cuộn. Về vấn đề này, tôi khuyên bạn chỉ nên sử dụng điều này trên các phần tử được chọn. Trong trường hợp của tôi, tôi đang phát triển một ứng dụng web để sử dụng trong lĩnh vực này về cơ bản là danh sách các nút để điều hướng các trang và gửi hành động. Vì toàn bộ trang có khá nhiều nút trong một số trường hợp, điều này sẽ không hiệu quả với tôi. Tuy nhiên, bạn có thể đặt :hover
trạng thái giả để điền vào thay thế. Sau khi vô hiệu hóa hộp màu xám mặc định, điều này hoạt động hoàn hảo.
ontouchstart
mà không có dấu là đủ=""
? (HTML5)