chore: complete update
This commit is contained in:
45
resources/js/modules/sticky-steps/index.js
Normal file
45
resources/js/modules/sticky-steps/index.js
Normal file
@@ -0,0 +1,45 @@
|
||||
// modules/sticky-steps/index.js
|
||||
import { Logger } from '../../core/logger.js';
|
||||
import {registerFrameTask, unregisterFrameTask} from '../../core/frameloop.js';
|
||||
|
||||
export function init(config = {}) {
|
||||
Logger.info('StickySteps init');
|
||||
|
||||
const defaultConfig = {
|
||||
containerSelector: '[data-sticky-container]',
|
||||
stepSelector: '[data-sticky-step]',
|
||||
activeClass: 'is-sticky-active',
|
||||
datasetKey: 'activeStickyStep'
|
||||
};
|
||||
|
||||
const settings = { ...defaultConfig, ...config };
|
||||
const containers = document.querySelectorAll(settings.containerSelector);
|
||||
|
||||
containers.forEach(container => {
|
||||
const steps = container.querySelectorAll(settings.stepSelector);
|
||||
const containerOffsetTop = container.offsetTop;
|
||||
|
||||
function update() {
|
||||
const scrollY = window.scrollY;
|
||||
const containerHeight = container.offsetHeight;
|
||||
|
||||
steps.forEach((step, index) => {
|
||||
const stepOffset = containerOffsetTop + index * (containerHeight / steps.length);
|
||||
const nextStepOffset = containerOffsetTop + (index + 1) * (containerHeight / steps.length);
|
||||
|
||||
const isActive = scrollY >= stepOffset && scrollY < nextStepOffset;
|
||||
step.classList.toggle(settings.activeClass, isActive);
|
||||
|
||||
if (isActive) {
|
||||
container.dataset[settings.datasetKey] = index;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
registerFrameTask(`sticky-steps-${container.dataset.moduleId || Math.random()}`, update, { autoStart: true });
|
||||
});
|
||||
}
|
||||
|
||||
export function destroy() {
|
||||
unregisterFrameTask('sticky-steps');
|
||||
}
|
||||
Reference in New Issue
Block a user