From e6352bd0076c16068acb5532b5d7b9d943ae7434 Mon Sep 17 00:00:00 2001 From: Andrew Serong <14988353+andrewserong@users.noreply.github.com> Date: Thu, 13 Apr 2023 14:32:45 +1000 Subject: [PATCH 1/2] DOM: Update getScrollContainer to be aware of horizontal scroll --- packages/dom/src/dom/get-scroll-container.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/dom/src/dom/get-scroll-container.js b/packages/dom/src/dom/get-scroll-container.js index 6c472e6195496..b2d8063e26aca 100644 --- a/packages/dom/src/dom/get-scroll-container.js +++ b/packages/dom/src/dom/get-scroll-container.js @@ -26,6 +26,16 @@ export default function getScrollContainer( node ) { } } + // Scrollable if scrollable width exceeds displayed... + if ( node.scrollWidth > node.clientWidth ) { + // ...except when overflow is defined to be hidden or visible + const { overflowX } = getComputedStyle( node ); + + if ( /(auto|scroll)/.test( overflowX ) ) { + return node; + } + } + if ( node.ownerDocument === node.parentNode ) { return node; } From dda80bdeea7bf80f979bae0d4dc79a51be24d171 Mon Sep 17 00:00:00 2001 From: Andrew Serong <14988353+andrewserong@users.noreply.github.com> Date: Fri, 14 Apr 2023 10:30:36 +1000 Subject: [PATCH 2/2] Update to add a direction param --- packages/dom/README.md | 1 + packages/dom/src/dom/get-scroll-container.js | 40 ++++++++++++-------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/packages/dom/README.md b/packages/dom/README.md index 4a2fc100174e1..f87ccbb3ac731 100644 --- a/packages/dom/README.md +++ b/packages/dom/README.md @@ -131,6 +131,7 @@ Given a DOM node, finds the closest scrollable container node or the node itself _Parameters_ - _node_ `Element | null`: Node from which to start. +- _direction_ `?string`: Direction of scrollable container to search for ('vertical', 'horizontal', 'all'). Defaults to 'vertical'. _Returns_ diff --git a/packages/dom/src/dom/get-scroll-container.js b/packages/dom/src/dom/get-scroll-container.js index b2d8063e26aca..da46f23c660ba 100644 --- a/packages/dom/src/dom/get-scroll-container.js +++ b/packages/dom/src/dom/get-scroll-container.js @@ -7,32 +7,37 @@ import getComputedStyle from './get-computed-style'; * Given a DOM node, finds the closest scrollable container node or the node * itself, if scrollable. * - * @param {Element | null} node Node from which to start. - * + * @param {Element | null} node Node from which to start. + * @param {?string} direction Direction of scrollable container to search for ('vertical', 'horizontal', 'all'). + * Defaults to 'vertical'. * @return {Element | undefined} Scrollable container node, if found. */ -export default function getScrollContainer( node ) { +export default function getScrollContainer( node, direction = 'vertical' ) { if ( ! node ) { return undefined; } - // Scrollable if scrollable height exceeds displayed... - if ( node.scrollHeight > node.clientHeight ) { - // ...except when overflow is defined to be hidden or visible - const { overflowY } = getComputedStyle( node ); + if ( direction === 'vertical' || direction === 'all' ) { + // Scrollable if scrollable height exceeds displayed... + if ( node.scrollHeight > node.clientHeight ) { + // ...except when overflow is defined to be hidden or visible + const { overflowY } = getComputedStyle( node ); - if ( /(auto|scroll)/.test( overflowY ) ) { - return node; + if ( /(auto|scroll)/.test( overflowY ) ) { + return node; + } } } - // Scrollable if scrollable width exceeds displayed... - if ( node.scrollWidth > node.clientWidth ) { - // ...except when overflow is defined to be hidden or visible - const { overflowX } = getComputedStyle( node ); + if ( direction === 'horizontal' || direction === 'all' ) { + // Scrollable if scrollable width exceeds displayed... + if ( node.scrollWidth > node.clientWidth ) { + // ...except when overflow is defined to be hidden or visible + const { overflowX } = getComputedStyle( node ); - if ( /(auto|scroll)/.test( overflowX ) ) { - return node; + if ( /(auto|scroll)/.test( overflowX ) ) { + return node; + } } } @@ -41,5 +46,8 @@ export default function getScrollContainer( node ) { } // Continue traversing. - return getScrollContainer( /** @type {Element} */ ( node.parentNode ) ); + return getScrollContainer( + /** @type {Element} */ ( node.parentNode ), + direction + ); }