Controlling pointer-events

You can control what elements can be the target of mouse events with CSS.

Disable Pointer-Events

pointer-events is the CSS attribute that determines whether an element can be the target of a mouse event. By default, DOM elements are clickable and register these mouse events.

To disallow the mouse event to register on the DOM event, disable it via:

.some-element { pointer-events: none; }

(There are some caveats regarding event listeners that the MDN docs explore nicely.)

Layering Pass Through

When you position DOM elements on top of one another such that they're layered, the top-most element will be the one to receive a mouse event in the case of a click. But when pointer-events: none has disabled the mouse event registration on the element, the event will pass through the element to the DOM element layered beneath it.

This becomes very useful if you have something layered visually on top that you don't want clickable, but you do want to click the thing beneath or behind it.

This works nicely when the elements are in a sibling structure:

<div>
  <div class="on-bottom" /> 
  <div class="on-top" /> 
</div>
.on-top { /* ... */ pointer-events: none; }
.on-bottom { /* ... */ }

Child Re-enabled

If you have a parent with pointer-events: none, you have to explicitly turn the pointer events back on for the children. There's no automatic pass through in this case. You affect all children until you re-enabled pointer events on them:

<div class="parent">
  <div class="child" /> 
</div>
.parent { /* ... */ pointer-events: none; }
.child { /* ... */ pointer-events: all; }

What are some other things that you watch out for when controlling pointer events?