9

In css, how can I stop the :hover event being triggered in a parent element when a child event is hovered, so that it only gets triggered when the parent itself gets hovered? In this case my child element is actually positioned outside it's parent element with absolute positioning, so it's a bit weird when the parent changes when the child gets hovered.

I made a JSFiddle to illustrate the problem.

Here's a JSFiddle of the used solution to my example.

3 Answers 3

17

There is a pure css solution (even two in fact) but both come at a cost.

  1. You can add pointer-events:none; to your child element - but it will not respond to it's own hover styles either. Pointer-events unfortunately are not supported in IE below version 11 (http://caniuse.com/#search=pointer-events).

  2. Wrap content of your parent element (apart from positioned child) in another one (thats the cost of this method) and apply hover styles to this wrapper.

Examples of both methods here.

.parent-2,
.parent { position:relative; background:#ddd; width:100px; height:100px; }
.parent:hover { background:blue; }
.child { position:absolute; top:0; left:130px; width:100px; height:50px; border:1px solid blue; pointer-events:none; }
/* doesn't work in opera and ie */


.content { position:absolute; top:0; left:0; width:100%; height:100%; z-index:0;}
.content:hover { background:blue; }
Sign up to request clarification or add additional context in comments.

Comments

5

Simply: don't nest your #inner div inside. Little demo: little link. Note that I added:

html, body {
    position: relative;
}

Which is necessary in this case.

Edit: in case you insist on having it nested, a bit of JavaScript is necessary. Here's a sample:

var inn = document.getElementById("inner"), outt = document.getElementById("holder");
outt.onmouseover = function() {
   this.style.backgroundColor = "rgb(0, 162, 232)"; /*I like this color :)*/
}
outt.onmouseout = function() {
   this.style.backgroundColor = "orange";
}
inn.onmouseover = function(ev) {
   ev.stopPropagation();
}

(This would be shorter if written using jQuery, but the idea is the same).

Here's a demo: little link.

10 Comments

I don't think it's necessary.
@BoltClock Well, I've tried without it; apparently html and body don't get position: relative; by default.
The element needs to be nested in it's parent
@CupOfTea696 Probably not. :hover states in CSS are propagated -- no real way of preventing them. Although, I must point out, the snippet in my answer doesn't use jQuery :)
Well, you could add a transparent element over the child, but that feels a bit dirty to me.
|
0

You need to use a bit of JavaScript to stop the event from bubbling. Take a look at this example:

css :hover only affect top div of nest

1 Comment

Yea, but I was actually wondering if there's a CSS only solution.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.