2015-06-16 26 views
11

Đây là plnkr example.Hoạt ảnh CSS cho cả di chuột và chạm (iOS)

Về cơ bản có một phong cách như thế

.hover-block { 
    -webkit-transition: all 1s linear; 
      transition: all 1s linear;  

} 

.hover-block:active { 
    pointer-events: none; 
    -webkit-transform: scale(1.5); 
      transform: scale(1.5); 
} 

.hover-block:hover { 
    -webkit-transform: scale(1.5); 
      transform: scale(1.5); 
} 

Tôi đang tìm cách hỗ trợ thường xanh và IE10/11, Chrome dành cho Android (4.4+), Mobile Safari (iOS 7 trở lên), và nó shouldn' làm tổn thương các sự kiện liên lạc khác (vuốt cuộn).

Dường như hoạt động như dự định trên mô phỏng thiết bị Android và Chrome, biến đổi không dính khi chạm là hành vi mong muốn.

Nhưng bằng cách nào đó người plunker này không hoạt động trên webkit iOS (iOS 8, tất cả các trình duyệt), nó không có gì liên lạc. Tôi khá chắc chắn rằng chính xác cùng một cách tiếp cận (khối phần tử, :active với pointer-events: none cộng :hover) đã làm việc cho tôi trong iOS 8 trước đây. Làm thế nào nó có thể được cố định?


Dường như trống touchstart/touchend JS xử lý sự kiện hoặc ontouchstart/ontouchend thuộc tính can activate touch behaviour on iOS (không thể chắc chắn nhưng nó có thể là nó xảy ra với tôi trước đó). Đây có phải là bản sửa lỗi đã biết cho sự cố hoặc có ít bản sửa lỗi hơn, phiên bản iOS nào bị ảnh hưởng không?

+1

Liệu: tập trung làm bất cứ điều gì? – BillyNate

+0

@BillyNate Không, không có thay đổi. – estus

+0

Tôi nghĩ rằng không có giải pháp nào tốt hơn cho tình huống của bạn (. –

Trả lời

3

Vì vậy, vấn đề bạn đang gặp phải là: ":active pseudo class matches when an element is being activated by the user". Không thể kích hoạt một phần tử độc lập <div> bởi người dùng và do đó sẽ không được đối sánh bởi lớp giả :active.

Nếu bạn nhìn dưới Browser Compatibility trong bài viết :active MDN bạn sẽ thấy rằng:

[1] Theo mặc định, Safari Mobile không sử dụng: trạng thái hoạt động, trừ khi có một handler touchstart sự kiện trên phần tử liên quan hoặc trên <body>.

MDN có list of pseudo classes có thể được sử dụng và bạn có thể có thể tìm thấy một phù hợp hơn với tình hình hoặc thêm một sự kiện touchstart nên làm các trick trong Safari của bạn.

Tôi đã có thể nhận được plnkr của bạn hoạt động rất nhanh bằng cách thay đổi thành phần <div class="hover-block"></div> thành <button class="hover-block"></button> và thay đổi .hover-block:active { thành .hover-block:focus {. Tôi cũng đã thêm display: block; border: 0; đến .hover-block.

Bạn, vì lý do rõ ràng, có thể không muốn thay đổi <div> thành <button> để hiệu quả, nhưng bằng cách sử dụng yếu tố có thể được kích hoạt, sử dụng lớp giả khác hoặc thêm sự kiện cho phép kích hoạt trong trình duyệt mục tiêu của bạn, bạn sẽ có thể đạt được hiệu quả mà bạn đang tìm kiếm trên thiết bị di động.

Hy vọng điều đó sẽ hữu ích!

+0

Cảm ơn bạn đã giải thích. Vì vậy, đây là hành vi dự kiến ​​và không phải là một hack. [Hướng dẫn của Google] (https://developers.google.com/web/fundamentals/input/touch/activestates/index#enabling-active-state-support-on-ios) nói rằng nó cũng được yêu cầu cho các nút. Bạn có một ý tưởng tại sao họ đã làm nó? Có phải ': tập trung' trong ví dụ của bạn nên tạo sự khác biệt? – estus

+0

Xin lỗi, không, tôi không biết tại sao họ làm theo cách này, kiểm tra thông số có thể cung cấp thêm thông tin cơ bản về điều đó. Tôi chỉ sử dụng: tập trung vào ví dụ của tôi vì nó là cách nhanh chóng và dơ bẩn để đạt được hiệu quả mong muốn và dễ dàng minh họa trên cả máy tính để bàn và thiết bị di động. Tôi có lẽ sẽ lựa chọn: hoạt động và cảm động trong tình huống của bạn. –

3

Trong html của bạn, thay vì <body>, làm <body ontouchstart=""> Hoặc trong html5, chỉ <body ontouchstart>

+0

Tôi đã chấp nhận câu trả lời vài phút trước, nhưng nó cũng giống như một câu trả lời tuyệt vời. Dường như nó có thể sửa chữa liên lạc cho tất cả các yếu tố trang. – estus

Các vấn đề liên quan