Skip to content

Poliklot/scroll-father

Repository files navigation

Scroll Father

Scroll Father β€” это лёгкая ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° JavaScript/TypeScript, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со скроллом Π² Π²Π΅Π±-прилоТСниях. Она позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, импортируя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ способствуСт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ

  • ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ: Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.
  • Π‘ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»: Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ для опрСдСлСния направлСния скролла, ΠΏΠ»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ, отслСТивания элСмСнтов Π½Π° страницС ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.
  • Высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ влияниСм Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π°Π½Π΄Π»Π°.
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° TypeScript: ΠŸΠΎΠ»Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ автодополнСния.
  • Π›Ρ‘Π³ΠΊΠΎΡΡ‚ΡŒ использования: ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ ΠΈ понятныС API для быстрой ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ.

Установка

УстановитС Ρ‡Π΅Ρ€Π΅Π· npm:

npm i scroll-father

Или Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ‡Π΅Ρ€Π΅Π· CDN:

<script src="https://cdn.jsdelivr.net/npm/scroll-father/dist/ScrollFather.min.js"></script>

Быстрый старт

Π˜ΠΌΠΏΠΎΡ€Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹:

// Π˜ΠΌΠΏΠΎΡ€Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
import { trackScrollState, smoothScrollToElement } from 'scroll-father';

Или ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всё сразу (Π½Π΅ стоит Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ):

// Π˜ΠΌΠΏΠΎΡ€Ρ‚ всСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
import * as ScrollFather from 'scroll-father';

ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

1. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ состояния скролла

АвтоматичСски добавляСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, data-scrolled) ΠΊ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ элСмСнту ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ΅ страницы.

import { trackScrollState } from 'scroll-father';

trackScrollState({
	attribute: 'data-scrolled', // Имя Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 'data-scrolled')
	element: document.body, // Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ для установки Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ document.body)
	onScrollStart: () => console.log('Π‘ΠΊΡ€ΠΎΠ»Π» начался!'),
	onScrollReset: () => console.log('Π‘ΠΊΡ€ΠΎΠ»Π» ΡΠ±Ρ€ΠΎΡˆΠ΅Π½!'),
});

2. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ направлСния скролла

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ скролла ΠΈ устанавливаСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ (data-scroll-direction="up" ΠΈΠ»ΠΈ "down") Π½Π° элСмСнтС <body>.

import { initScrollDirectionTracking } from 'scroll-father';

initScrollDirectionTracking();

3. РСализация бСсконСчной ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ

Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ достигаСт ΠΊΠΎΠ½Ρ†Π° страницы.

import { initInfiniteScroll } from 'scroll-father';

initInfiniteScroll(
	async () => {
		// Π’Π°Ρˆ ΠΊΠΎΠ΄ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°
		await fetchMoreData();
	},
	{
		threshold: 300, // ΠŸΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² пиксСлях Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° страницы (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 300)
	},
);

4. ДСбаунс события ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ

ДобавляСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ с дСбаунсом, гарантируя, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ колбэк Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‡Π°Ρ‰Π΅, Ρ‡Π΅ΠΌ с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ.

import { debounceScroll } from 'scroll-father';

debounceScroll(() => {
	// Π’Π°Ρˆ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ΅ с дСбаунсом
}, 200); // Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π² миллисСкундах ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 200)

5. ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ видимости элСмСнта

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ отслСТиваниС элСмСнта с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ IntersectionObserver. Π’Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ появлСнии ΠΈΠ»ΠΈ исчСзновСнии элСмСнта ΠΈΠ· области просмотра.

import { initIntersectionSection } from 'scroll-father';

const $section = document.querySelector('#my-section');

initIntersectionSection(
	$section,
	() => {
		// Ѐункция вызываСтся, ΠΊΠΎΠ³Π΄Π° элСмСнт Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости
		console.log('Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ появился Π² области видимости');
	},
	() => {
		// Ѐункция вызываСтся, ΠΊΠΎΠ³Π΄Π° элСмСнт Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости
		console.log('Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π²Ρ‹ΡˆΠ΅Π» ΠΈΠ· области видимости');
	},
	{
		rootMargin: '-50% 0px', // ΠžΡ‚ΡΡ‚ΡƒΠΏΡ‹ для области видимости (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ '-50% 0px')
		threshold: 0, // ΠŸΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ видимости (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 0)
	},
);

6. Плавная ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ° для якорных ссылок

ДобавляСт ΠΏΠ»Π°Π²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΡƒ ΠΊΠΎ всСм ссылкам-якорям Π½Π° страницС.

import { smootherAllAnchorLinks } from 'scroll-father';

smootherAllAnchorLinks();

МоТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ отступ статичный

	let offset = 0;
	if (window.innerWidth >= breakpoints['2xl']) offset = 96;
	else offset = 60;
	smootherAllAnchorLinks({
		offset,
	});

МоТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ отступ динамичСский ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π½ΠΎΠ²Ρ‹ΠΌ скроллом

	const setOffsetBeforeScroll = () => {
		if (document.body.getAttribute('data-scroll-direction') === 'up') {
			if (window.innerWidth >= breakpoints['2xl']) {
				return 96;
			}
			return 60;
		}
		return 0;
	};
	smootherAllAnchorLinks({
		setOffsetBeforeScroll,
	});

ОписаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

  • debounceScroll(callback, delay?) ДобавляСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ с дСбаунсом. Колбэк callback Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‡Π°Ρ‰Π΅, Ρ‡Π΅ΠΌ Ρ€Π°Π· Π² delay миллисСкунд.

  • initInfiniteScroll(loadMoreCallback, options?) Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΡƒ, вызывая loadMoreCallback, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ достигаСт ΠΊΠΎΠ½Ρ†Π° страницы. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ options.threshold опрСдСляСт, Π·Π° сколько пиксСлСй Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° страницы слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ колбэк.

  • initIntersectionSection($section, onStart, onEnd, options?) ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ‚ элСмСнт $section с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ IntersectionObserver. Π’Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ onStart, ΠΊΠΎΠ³Π΄Π° элСмСнт появляСтся Π² области видимости, ΠΈ onEnd, ΠΊΠΎΠ³Π΄Π° исчСзаСт.

  • initScrollDirectionTracking() ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ скролла ΠΈ устанавливаСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ data-scroll-direction Π½Π° <body> со значСниями "up" ΠΈΠ»ΠΈ "down".

  • trackScrollState(options?) ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ‚ состояниС скролла страницы ΠΈ устанавливаСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ data-scrolled) Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ элСмСнтС ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ΅.

  • smootherAllAnchorLinks() ДобавляСт ΠΏΠ»Π°Π²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΡƒ ΠΊΠΎ всСм ссылкам-якорям Π½Π° страницС, обСспСчивая Π±ΠΎΠ»Π΅Π΅ ΠΏΠ»Π°Π²Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ элСмСнтам.

БотрудничСство

ΠœΡ‹ привСтствуСм Π²ΠΊΠ»Π°Π΄! НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΠ»ΠΈ ΠΏΡƒΠ»-рСквСсты Ρ‡Π΅Ρ€Π΅Π· наш Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π½Π° GitHub.

ЛицСнзия

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Π»ΠΈΡ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT β€” см. Ρ„Π°ΠΉΠ» LICENSE для подробностСй.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •