Skip to content

Commit 36fb964

Browse files
committed
Used getBoundingClientRect function instead of getOffsetSum
1 parent 0d2098f commit 36fb964

File tree

2 files changed

+9
-29
lines changed

2 files changed

+9
-29
lines changed

src/moveTo.js

+6-29
Original file line numberDiff line numberDiff line change
@@ -25,28 +25,6 @@ const MoveTo = (() => {
2525
return -c * (t * t * t * t - 1) + b;
2626
}
2727

28-
/**
29-
* Returns html element's top and left offset
30-
* @param {HTMLElement} elem - Element
31-
* @return {object} Element top and left offset
32-
*/
33-
function getOffsetSum(elem) {
34-
if(typeof elem.getBoundingClientRect == 'function') {
35-
return elem.getBoundingClientRect();
36-
} else {
37-
let top = 0;
38-
let left = 0;
39-
while (elem) {
40-
top += elem.offsetTop;
41-
left += elem.offsetLeft;
42-
elem = elem.offsetParent;
43-
}
44-
return {
45-
top, left,
46-
};
47-
}
48-
}
49-
5028
/**
5129
* Merge two object
5230
*
@@ -132,12 +110,11 @@ const MoveTo = (() => {
132110

133111
options = mergeObject(this.options, options);
134112

135-
let to = typeof target === 'number' ? target : getOffsetSum(target).top;
113+
let distance = typeof target === 'number' ? target : target.getBoundingClientRect().top;
136114
const from = window.pageYOffset;
137-
to -= options.tolerance;
138-
const change = to - from;
139115
let startTime = null;
140116
let lastPageYOffset;
117+
distance -= options.tolerance;
141118

142119
// rAF loop
143120
const loop = (currentTime) => {
@@ -154,24 +131,24 @@ const MoveTo = (() => {
154131

155132
if (lastPageYOffset) {
156133
if (
157-
(change > 0 && lastPageYOffset > currentPageYOffset) ||
158-
(change < 0 && lastPageYOffset < currentPageYOffset)
134+
(distance > 0 && lastPageYOffset > currentPageYOffset) ||
135+
(distance < 0 && lastPageYOffset < currentPageYOffset)
159136
) {
160137
return options.callback(target);
161138
}
162139
}
163140
lastPageYOffset = currentPageYOffset;
164141

165142
const val = this.easeFunctions[options.easing](
166-
timeElapsed, from, change, options.duration
143+
timeElapsed, from, distance, options.duration
167144
);
168145

169146
window.scroll(0, val);
170147

171148
if (timeElapsed < options.duration) {
172149
window.requestAnimationFrame(loop);
173150
} else {
174-
window.scroll(0, to);
151+
window.scroll(0, distance + from);
175152
options.callback(target);
176153
}
177154
};

tests/moveTo-spec.js

+3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ function createMockDomElement(options) {
2121
},
2222
removeEventListener: function(event, cb) {
2323
delete this._listeners[event];
24+
},
25+
getBoundingClientRect: function() {
26+
return {top: options.offsetTop || 0};
2427
}
2528
};
2629
}

0 commit comments

Comments
 (0)