Có một `pointer-events: hoverOnly` hoặc tương tự trong CSS không?


104

Vừa mới chơi với pointer-eventsthuộc tính trong CSS.

Tôi có một divcái mà tôi muốn ẩn với tất cả các sự kiện chuột, ngoại trừ :hover.

Vì vậy, tất cả các lệnh nhấp chuột đi qua lệnh divbên dưới nó, nhưng div có thể báo cáo liệu con chuột có ở trên nó hay không.

Bất cứ ai có thể cho tôi biết nếu điều này có thể được thực hiện?

HTML:

<div class="layer" style="z-index:20; pointer-events:none;">Top layer</div>
<div class="layer" style="z-index:10;">Bottom layer</div>

CSS:

.layer {
    position:absolute;
    top:0px;
    left:0px;
    height:400px;
    width:400px;
}

2
Chỉ cần lưu ý, pointer-eventskhông được hỗ trợ tốt trong IE .
Vucko

2
có vẻ như bạn cần javascript
Pete

Đồng ý với Pete, tôi biết điều này đặc biệt là yêu cầu css, nhưng có cùng một vấn đề và giải pháp dễ dàng nhất cho tôi là chỉ cần yêu cầu đứa trẻ thực hiện một cú nhấp chuột vào cha mẹ bằng javascript stackoverflow.com/questions/35872534/…
Jerry Sha

Câu trả lời:


12

Tôi không nghĩ rằng bạn có thể đạt được mục tiêu của mình trong CSS. Tuy nhiên, như những người đóng góp khác đã đề cập, nó đủ dễ dàng để thực hiện trong JQuery. Đây là cách tôi đã thực hiện:

HTML

<div
  id="toplayer"
  class="layer"
  style="
    z-index: 20;
    pointer-events: none;
    background-color: white;
    display: none;
  "
>
  Top layer
</div>
<div id="bottomlayer" class="layer" style="z-index: 10">Bottom layer</div>

CSS (không thay đổi)

.layer {
    position:absolute;
    top:0px;
    left:0px;
    height:400px;
    width:400px;
}

JQuery

$(document).ready(function(){
    $("#bottomlayer").hover(
        function() {
            $("#toplayer").css("display", "block");
        },
        function() {
            $("#toplayer").css("display", "none");
        }
    );
});

Đây là JSFiddle: http://www.jsfiddle.net/ReZ9M


107

Chỉ di chuột. Nó rất dễ. Không có JS ... Cũng ngăn chặn hành động mặc định của liên kết.

a:hover {
	color: red;
}
a:active {
	pointer-events: none;
}
<a href="www.google.com">Link here</a>

Chỉnh sửa: được hỗ trợ trong IE 11 trở lên http://caniuse.com/#search=pointer-events


23
điều này 'hoạt động' - tuy nhiên nó không cho phép nhấp qua phần tử bên dưới (ít nhất là không khi phần tử đó là video YouTube) - đó có lẽ là lý do duy nhất mà mọi người sẽ cần hành vi đó ngay từ đầu
Simon_Weaver

1
điều này không yêu cầu một lần nhấp vào phần tử để tắt các sự kiện con trỏ khác?
Mindwin

3
đây là beutifull
user2860957

2
@Priyanshu: Bạn nghĩ điều gì sẽ xảy ra nếu người dùng nhấp vào nút?
Свободен Роб

1
thông minh 💐 (đó là tất cả những gì tôi cần nói)
Davious

24

"Đánh cắp" câu trả lời của Xanco nhưng không có jQuery xấu xí, xấu xí đó.

Đoạn mã : Thông báo DIV được xếp theo thứ tự ngược lại

.layer {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 400px;
  width: 400px;
}

#bottomlayer {
  z-index: 10
}

#toplayer {
  z-index: 20;
  pointer-events: none;
  background-color: white;
  display: none
}

#bottomlayer:hover~#toplayer {
  display: block
}
<div id="bottomlayer" class="layer">Bottom layer</div>
<div id="toplayer" class="layer">Top layer</div>


2
xin lỗi, tôi vẫn đang sử dụng jquery xấu xí. nhưng có một ủng hộ cho một giải pháp CSS duy nhất!
Jimmery

này là rất tốt - chỉ FYI tiếc là nó không hoạt động đúng nếu lớp dưới cùng chứa một iframe: jsfiddle.net/ReZ9M/82
Simon_Weaver

1
Làm thế nào để giải quyết câu hỏi này? OP yêu cầu các lệnh nhấp để đi qua phần tử có thể nhìn thấy ban đầu. Trong giải pháp của bạn không, thông báo như thế nào "Top Layer" text không thể được đánh dấu ...
Trever Thompson

6

Bạn cũng có thể phát hiện di chuột trên các phần tử khác nhau và áp dụng các kiểu cho phần tử con đó hoặc sử dụng các bộ chọn css khác như phần tử con liền kề, v.v.

Tuy nhiên, nó phụ thuộc vào trường hợp của bạn.

Trên di chuột phần tử mẹ. Tôi đã làm điều này:

.child {
    pointer-events: none;
    background-color: white;
}

.parent:hover > .child {
    background-color: black;
}

1

Tôi sử dụng :hoverpseudo-yếu tố của một phụ huynh / thùng kích thước bằng nhau để mô phỏng một di chuột qua div lớp phủ của tôi, sau đó thiết lập của lớp phủ pointer-eventsđể noneđi qua nhấp chuột vào các yếu tố dưới đây.


0

Giải pháp CSS thuần túy cho yêu cầu của bạn (thuộc tính độ mờ ở đó chỉ để minh họa nhu cầu chuyển đổi):

.hoverOnly:hover {
    pointer-events: none;
    opacity: 0.1;
    transition-delay: 0s;
}
.hoverOnly {
    transition: ,5s all;
    opacity: 0.75;
    transition-delay: 2s;
}

Những gì nó làm:

Khi chuột vào hộp, nó sẽ kích hoạt :hovertrạng thái. Tuy nhiên, ở trạng thái đó, các sự kiện con trỏ bị vô hiệu hóa.

Nhưng nếu bạn không đặt bộ hẹn giờ chuyển đổi, div sẽ hủy trạng thái di chuột khi chuột di chuyển; trạng thái di chuột sẽ nhấp nháy trong khi chuột di chuyển bên trong phần tử. Bạn có thể nhận ra điều này bằng cách sử dụng đoạn mã trên với thuộc tính độ mờ.

Đặt độ trễ để chuyển đổi ra khỏi trạng thái di chuột sẽ khắc phục được sự cố. Các 2sgiá trị có thể được tinh chỉnh để phù hợp với nhu cầu của bạn.

Tín dụng cho tinh chỉnh chuyển tiếp: vỗ về câu trả lời này .


Phần tử chỉ bị kẹt ở trạng thái "di chuột" khi tôi thử giải pháp này.
Flimm

0

Chỉ cần css thuần túy , không cần jquery :

div:hover {pointer-events: none}
div {pointer-events: auto}

Xin chào - rất cám ơn vì điều này - bạn có thể thêm bản trình diễn vào câu trả lời của mình (như đoạn mã hoặc liên kết tới cái này trong codepen hoặc jsfiddle không?) - và bạn có biết cái này có khả năng tương thích gì không? nó có phải là một tính năng CSS3 mới không? Nếu công trình này, tôi chắc chắn sẽ cung cấp cho bạn một đánh dấu :)
Jimmery

xin lỗi tôi không thể tạo bản demo. Nhưng theo logic của tôi, nó chắc chắn hoạt động trên tất cả các trình duyệt (tôi không biết về nghĩa là, vì tôi không có tức là). Và, nó hỗ trợ từ CSS1 :)
Bariq Dharmawan

caniuse.com/#feat=pointer-events - sẽ không hoạt động trong bất kỳ trình duyệt IE nào ngoại trừ 11 ... nếu bạn tạo bản trình diễn hoạt động theo ý bạn ở đây codepen.io, tôi sẽ kiểm tra nó cho bạn và nếu nó hoạt động, tôi sẽ giải thưởng cho bạn những câu trả lời đúng - xin lỗi, tôi không thể giải thưởng này để mã lý thuyết - chỉ là một bản demo làm việc
Jimmery

@brillout bạn có thể thêm đoạn mã không? Bcz nó làm việc cho tôi
Bariq Dharmawan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.