demo · v149

Multi-Popover Hover Test

Open three nested popovers above a host card. In Chrome 149, hovering inside any popover does not trigger :hover on the host card or on outer popovers — each top-layer element stops the pseudo-class from propagating up through the DOM. A live state table and event log capture every mouseenter/mouseleave transition.

Host card (not a popover)
Base element

This card turns blue when hovered. In Chrome 149, hovering inside any of the three popovers above does not trigger :hover on this card.

Element Open :hover (direct) Boundary
Host card no N/A
Popover L1 closed no
Popover L2 closed no
Popover L3 closed no innermost
Popover L1 (auto) — yellow

Hovering here — host card :hover should stay off

Popover L2 (auto) — pink

Hovering here — L1 :hover should stay off

Popover L3 (auto) — green

Hovering here — L1 and L2 :hover should stay off

Hover event log

/* Chrome 149: :hover stops at the top-layer boundary */

/* This DOES light up when you hover the card directly */
.host-card:hover { background: lightblue; }

/* This does NOT light up when you hover inside popover-l1 */
.host-card:hover { ... }

/* Because popover-l1 is in the top layer, :hover propagation stops there.
   Chrome 149 aligns with CSS Selectors Level 4:
   user-action pseudo-classes match ancestors only up to the top-layer boundary */

/* Same for :focus-within and :active — they all respect the boundary */

see also

implementation reference

Need the exact API surface, compatibility boundaries, errors, lifecycle, and source links? Read the matching gendn reference ↗