28 lines
976 B
JavaScript
28 lines
976 B
JavaScript
export const scrollToBottom = (ref, smooth = false) => {
|
|
const element = ref.current;
|
|
const scroll_height = element.scrollHeight - element.clientHeight;
|
|
|
|
if (smooth) {
|
|
const duration = 300; // スクロールにかける時間(ミリ秒)
|
|
const start_time = performance.now();
|
|
const scroll_top = element.scrollTop;
|
|
|
|
const scroll = (current_time) => {
|
|
const elapsed = current_time - start_time;
|
|
const progress = Math.min(elapsed / duration, 1);
|
|
const ease_in_out_quad = (t) => t < 0.5
|
|
? 2 * t * t
|
|
: -1 + (4 - 2 * t) * t;
|
|
element.scrollTop = scroll_top + (scroll_height - scroll_top) * ease_in_out_quad(progress);
|
|
|
|
if (progress < 1) {
|
|
requestAnimationFrame(scroll);
|
|
}
|
|
};
|
|
|
|
requestAnimationFrame(scroll);
|
|
} else {
|
|
element.scrollTop = scroll_height;
|
|
}
|
|
};
|