Skip to content

Commit 440ebaa

Browse files
authored
Create js-子元素在父元素中滚动到可视区域.js
1 parent ef69277 commit 440ebaa

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* @param parent 父容器元素
3+
* @param target 滚动的目标元素
4+
* @param time 滚动时间 ms
5+
*/
6+
export function targetScrollTo(parent, target, time) {
7+
let pos = getRelativePos(target);
8+
scrollTo(parent, pos.top, time, () => {
9+
console.log('Scroll End');
10+
});
11+
}
12+
13+
function getRelativePos(element) {
14+
let parentPos = element.parentNode.getBoundingClientRect(), // parent pos
15+
targetPos = element.getBoundingClientRect(), // target pos
16+
pos = {} as any;
17+
(pos.top = targetPos.top - parentPos.top + element.parentNode.scrollTop),
18+
(pos.right = targetPos.right - parentPos.right),
19+
(pos.bottom = targetPos.bottom - parentPos.bottom),
20+
(pos.left = targetPos.left - parentPos.left);
21+
return pos;
22+
}
23+
24+
function easeInOutQuad(time) {
25+
return time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time;
26+
}
27+
28+
function scrollTo(element, to, duration, onDone?) {
29+
let start = element.scrollTop,
30+
change = to - start,
31+
startTime = performance.now(),
32+
now,
33+
elapsed,
34+
scrollTime;
35+
36+
function animateScroll() {
37+
now = performance.now();
38+
elapsed = now - startTime;
39+
scrollTime = elapsed / duration;
40+
41+
element.scrollTop = start + change * easeInOutQuad(scrollTime);
42+
43+
if (scrollTime < 1) {
44+
window.requestAnimationFrame(animateScroll);
45+
} else {
46+
onDone && onDone();
47+
}
48+
}
49+
animateScroll();
50+
}

0 commit comments

Comments
 (0)