มี "pointer-events: hoverOnly" หรือคล้ายกันใน CSS หรือไม่


109

เพิ่งเล่นกับpointer-eventsคุณสมบัติใน CSS

ฉันมีที่ฉันต้องการที่จะมองไม่เห็นเหตุการณ์ของเมาส์ทั้งหมดยกเว้นdiv:hover

ดังนั้นคำสั่งคลิกทั้งหมดจะไปที่คำสั่งdivด้านล่าง แต่ div สามารถรายงานได้ว่าเมาส์อยู่เหนือหรือไม่ยังอยู่

ใครช่วยบอกทีว่าทำได้ไหม

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
เพียงแค่ทราบ, pointer-eventsไม่ดีได้รับการสนับสนุนใน IE
Vucko

2
ดูเหมือนว่าคุณต้องใช้ javascript
Pete

เห็นด้วยกับ Pete ฉันรู้ว่านี่เป็นการถามหา css โดยเฉพาะ แต่มีปัญหาเดียวกันและวิธีแก้ปัญหาที่ง่ายที่สุดสำหรับฉันคือให้เด็กเริ่มต้นการคลิกไปยังผู้ปกครองด้วย javascript stackoverflow.com/questions/35872534/…
Jerry Sha

คำตอบ:


12

ฉันไม่คิดว่าจะบรรลุเป้าหมายใน CSS เพียงอย่างเดียว อย่างไรก็ตามตามที่ผู้ร่วมให้ข้อมูลรายอื่นได้กล่าวไว้มันง่ายพอที่จะทำใน JQuery นี่คือวิธีที่ฉันได้ทำ:

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 (ไม่เปลี่ยนแปลง)

.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");
        }
    );
});

นี่คือ JSFiddle: http://www.jsfiddle.net/ReZ9M


113

วางเมาส์เหนือเท่านั้น มันง่ายมาก ๆ. ไม่มี JS ... ป้องกันการกระทำเริ่มต้นของลิงก์ด้วย

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

แก้ไข: รองรับใน IE 11 ขึ้นไป http://caniuse.com/#search=pointer-events


23
สิ่งนี้ใช้งานได้ - แต่ไม่อนุญาตให้คลิกผ่านไปยังองค์ประกอบด้านล่าง (อย่างน้อยก็ไม่ใช่เมื่อองค์ประกอบนั้นเป็นวิดีโอ YouTube) ซึ่งอาจเป็นเหตุผลเดียวที่ทุกคนต้องการพฤติกรรมนั้นในตอนแรก
Simon_Weaver

1
ไม่จำเป็นต้องคลิกที่องค์ประกอบเพื่อปิดใช้งานตัวชี้เหตุการณ์เพิ่มเติมหรือไม่
Mindwin

3
นี่คือ beutifull
user2860957

2
@PriyanshuJain สิ่งที่คุณคิดว่าจะเกิดขึ้นหากผู้ใช้คลิกที่ปุ่ม?
СвободенРоб

1
ฉลาด💐 (นั่นคือทั้งหมดที่ฉันต้องพูด)
Davious

24

"ขโมย" คำตอบของ Xanco แต่ไม่มี jQuery ที่น่าเกลียดน่าเกลียด

Snippet : สังเกตว่า DIV อยู่ในลำดับย้อนกลับ

.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
ขออภัยฉันใช้ jquery ที่น่าเกลียดอยู่แล้ว แต่มีการโหวตเพิ่มสำหรับโซลูชัน CSS เท่านั้น!
Jimmery

นี้เป็นที่ดี - เพียงแค่ FYI น่าเสียดายที่มันไม่ทำงานอย่างถูกต้องหากชั้นล่างมี iframe: jsfiddle.net/ReZ9M/82
Simon_Weaver

1
วิธีนี้ช่วยแก้ปัญหาได้อย่างไร OP ขอคำสั่งคลิกเพื่อผ่านองค์ประกอบที่มองเห็นได้ในตอนแรก ในโซลูชันของคุณพวกเขาไม่สังเกตว่าข้อความ "เลเยอร์บนสุด" ไม่สามารถเน้นได้อย่างไร ...
Trever Thompson

7

นอกจากนี้คุณยังสามารถตรวจจับการวางเมาส์บนองค์ประกอบที่แตกต่างกันและใช้สไตล์กับลูกของมันหรือใช้ตัวเลือก css อื่น ๆ เช่นลูกที่อยู่ติดกันเป็นต้น

ขึ้นอยู่กับกรณีของคุณ

เมื่อวางเมาส์เหนือองค์ประกอบหลัก ฉันทำอย่างนี้:

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

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

1

ผมใช้:hoverหลอกองค์ประกอบของเท่ากับขนาดแม่ / ภาชนะเพื่อจำลองการวางเมาส์เหนือ div ซ้อนทับของฉันแล้วตั้งซ้อนทับของpointer-eventsการnoneที่จะต้องผ่านการคลิกไปยังองค์ประกอบดังต่อไปนี้


0

โซลูชัน CSS บริสุทธิ์สำหรับคำขอของคุณ (คุณสมบัติความทึบมีไว้เพื่อแสดงให้เห็นถึงความจำเป็นในการเปลี่ยน):

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

มันทำอะไร:

เมื่อเมาส์เข้าสู่ช่องจะเรียกใช้ไฟล์ :hoverสถานะ อย่างไรก็ตามในสถานะนั้นตัวชี้เหตุการณ์จะถูกปิดใช้งาน

แต่ถ้าคุณไม่ได้ตั้งค่าตัวจับเวลาการเปลี่ยน Div จะยกเลิกสถานะโฮเวอร์เมื่อเมาส์เคลื่อนที่ สถานะโฮเวอร์จะกะพริบในขณะที่เมาส์เคลื่อนที่ภายในองค์ประกอบ คุณสามารถรับรู้สิ่งนี้ได้โดยใช้โค้ดด้านบนพร้อมคุณสมบัติความทึบ

การตั้งค่าความล่าช้าในการเปลี่ยนจากสถานะโฮเวอร์จะช่วยแก้ไขได้ 2sค่าสามารถ tweaked เพื่อให้เหมาะกับความต้องการของคุณ

เครดิตในการเปลี่ยนการปรับแต่ง: patadสำหรับคำตอบนี้


องค์ประกอบติดอยู่ในสถานะ "โฮเวอร์" เมื่อฉันลองวิธีแก้ปัญหานี้
Flimm

0

เพียงแค่cssบริสุทธิ์ไม่จำเป็นต้องใช้jquery :

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

สวัสดี - ขอบคุณมากสำหรับสิ่งนี้ - คุณสามารถเพิ่มการสาธิตให้กับคำตอบของคุณได้ (เช่นข้อมูลโค้ดหรือลิงก์ไปยังโค้ดนี้ใน codepen หรือ jsfiddle?) - และคุณรู้หรือไม่ว่าสิ่งนี้มีความเข้ากันได้อย่างไร? เป็นฟีเจอร์ CSS3 ใหม่หรือไม่ ถ้าได้ผลฉันจะให้ติ๊กแน่นอน :)
Jimmery

ขออภัยฉันไม่สามารถสร้างการสาธิตได้ แต่ในตรรกะของฉันมันทำงานได้ทุกเบราว์เซอร์ (ฉันไม่รู้เกี่ยวกับเช่นเพราะฉันไม่มีเช่น) และสนับสนุนจาก css1 :)
Bariq Dharmawan

caniuse.com/#feat=pointer-events - จะไม่ทำงานใน IE ใด ๆ ยกเว้น 11 ... ถ้าคุณสร้างการสาธิตที่ใช้งานได้เกี่ยวกับสิ่งที่คุณหมายถึงที่นี่codepen.ioฉันจะทดสอบให้คุณและถ้ามันใช้งานได้ฉันจะ ให้รางวัลคุณด้วยคำตอบที่ถูกต้อง - ขออภัยฉันไม่สามารถให้รางวัลนี้เป็นรหัสทางทฤษฎีได้ - เป็นเพียงการสาธิตที่ใช้งานได้
Jimmery

@brillout เพิ่ม snippet ได้ไหม Bcz It's work for me
Bariq Dharmawan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.