@@ -89,6 +89,22 @@ const getPaddedBoundingBox = (element: DOMRect, padding: number) => ({
8989 left : element . left + padding
9090} ) ;
9191
92+ // A naive way to estimate the z-index of an element.
93+ // This does not take each and every stacking context rules
94+ // into account but merely adds up every z-indexes set on
95+ // the element's ancestors.
96+ const getZIndex = ( element : HTMLElement ) : number => {
97+ const base =
98+ element . offsetParent instanceof HTMLElement
99+ ? getZIndex ( element . offsetParent )
100+ : 0 ;
101+
102+ const style = window . getComputedStyle ( element ) ;
103+ const z = parseInt ( style . zIndex , 10 ) || 0 ;
104+
105+ return base + z ;
106+ } ;
107+
92108// Resolves a visual collision between two elements, either
93109// by scrolling the page or moving one of them.
94110// We're only resolving collisions on the vertical axis, as
@@ -99,6 +115,14 @@ export const resolveCollision = (fixed: HTMLElement, mobile: HTMLElement) => {
99115 return ;
100116 }
101117
118+ // If the fixed element is meant to obscure the mobile
119+ // one (i.e. positionned absolutely above), there is no
120+ // need to move anything.
121+ if ( getZIndex ( fixed ) > getZIndex ( mobile ) ) {
122+ translateElementY ( mobile , 0 ) ;
123+ return ;
124+ }
125+
102126 // We're padding the fixed element's bounding box to
103127 // avoid snapping the mobile one right on its border.
104128 const fixedRect = getPaddedBoundingBox (
0 commit comments