Skip to content

Commit a3ecf93

Browse files
committed
feat(core dom): Add get_scroll_x and get_scroll_y helper methods to get the horizontal/vertical scrolling position.
1 parent 95c16b8 commit a3ecf93

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

src/core/dom.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,38 @@ const find_scroll_container = (el, direction, fallback = document.body) => {
270270
return fallback;
271271
};
272272

273+
/**
274+
* Get the horizontal scroll position.
275+
*
276+
* @param {Node} scroll_reference - The element to get the scroll position from.
277+
*
278+
* @returns {number} The horizontal scroll position.
279+
*/
280+
const get_scroll_x = (scroll_reference) => {
281+
// scroll_listener == window: window.scrollX
282+
// scroll_listener == html: html.scrollLeft == window.scrollX
283+
// scroll_listener == DOM node: node.scrollLeft
284+
return typeof scroll_reference.scrollLeft !== "undefined"
285+
? scroll_reference.scrollLeft
286+
: scroll_reference.scrollX;
287+
};
288+
289+
/**
290+
* Get the vertical scroll position.
291+
*
292+
* @param {Node} scroll_reference - The element to get the scroll position from.
293+
*
294+
* @returns {number} The vertical scroll position.
295+
*/
296+
const get_scroll_y = (scroll_reference) => {
297+
// scroll_listener == window: window.scrollY
298+
// scroll_listener == html: html.scrollTop == window.scrollY
299+
// scroll_listener == DOM node: node.scrollTop
300+
return typeof scroll_reference.scrollTop !== "undefined"
301+
? scroll_reference.scrollTop
302+
: scroll_reference.scrollY;
303+
};
304+
273305
/**
274306
* Get data stored directly on the node instance.
275307
* We are using a prefix to make sure the data doesn't collide with other attributes.
@@ -351,6 +383,8 @@ const dom = {
351383
create_from_string: create_from_string,
352384
get_css_value: get_css_value,
353385
find_scroll_container: find_scroll_container,
386+
get_scroll_x: get_scroll_x,
387+
get_scroll_y: get_scroll_y,
354388
get_data: get_data,
355389
set_data: set_data,
356390
delete_data: delete_data,

src/core/dom.test.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,62 @@ describe("core.dom tests", () => {
710710
});
711711
});
712712

713+
describe("get_scroll_y", function () {
714+
it("get vertical scroll from window", function (done) {
715+
jest.replaceProperty(window, "scrollY", 2000);
716+
expect(dom.get_scroll_y(window)).toBe(2000);
717+
done();
718+
});
719+
720+
it("get vertical scroll from window when scrollY is 0", function (done) {
721+
jest.replaceProperty(window, "scrollY", 0);
722+
expect(dom.get_scroll_y(window)).toBe(0);
723+
done();
724+
});
725+
726+
it("get vertical scroll from an element", function (done) {
727+
const el = document.createElement("div");
728+
jest.spyOn(el, "scrollTop", "get").mockReturnValue(2000);
729+
expect(dom.get_scroll_y(el)).toBe(2000);
730+
done();
731+
});
732+
733+
it("get vertical scroll from an element when scrollTop is 0", function (done) {
734+
const el = document.createElement("div");
735+
jest.spyOn(el, "scrollTop", "get").mockReturnValue(0);
736+
expect(dom.get_scroll_y(el)).toBe(0);
737+
done();
738+
});
739+
});
740+
741+
describe("get_scroll_x", function () {
742+
it("get horizontal scroll from window", function (done) {
743+
jest.replaceProperty(window, "scrollX", 2000);
744+
expect(dom.get_scroll_x(window)).toBe(2000);
745+
done();
746+
});
747+
748+
it("get horizontal scroll from window when scrollX is 0", function (done) {
749+
jest.replaceProperty(window, "scrollX", 0);
750+
expect(dom.get_scroll_x(window)).toBe(0);
751+
done();
752+
});
753+
754+
it("get horizontal scroll from an element", function (done) {
755+
const el = document.createElement("div");
756+
jest.spyOn(el, "scrollLeft", "get").mockReturnValue(2000);
757+
expect(dom.get_scroll_x(el)).toBe(2000);
758+
done();
759+
});
760+
761+
it("get horizontal scroll from an element when scrollLeft is 0", function (done) {
762+
const el = document.createElement("div");
763+
jest.spyOn(el, "scrollLeft", "get").mockReturnValue(0);
764+
expect(dom.get_scroll_x(el)).toBe(0);
765+
done();
766+
});
767+
});
768+
713769
describe("set_data, get_data, delete_data", function () {
714770
it("can be used to store and retrieve data on DOM nodes.", function () {
715771
const el = document.createElement("div");

0 commit comments

Comments
 (0)