Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 

182 рядки
5.4 KiB

  const scrollThrottleCallback = (callback, timeout) => {
    let wait = false;
    return () => {
      if (wait) return;
      callback.call();
      wait = true;
      setTimeout(() => { wait = false; }, timeout);
    };
  };
  
  function getAbsolutePosition(element) {
    const rect = element.getBoundingClientRect();
    
    return {
        top: rect.top + window.scrollY,    // Add vertical scroll
        left: rect.left + window.scrollX,  // Add horizontal scroll
        bottom: rect.bottom + window.scrollY,
        right: rect.right + window.scrollX
    };
  }
  function getPositionRelativeToParent(element) {
    const parent = element.parentElement;
    const parentRect = parent.getBoundingClientRect();
    const elementRect = element.getBoundingClientRect();
    
    return {
        top: elementRect.top - parentRect.top,
        left: elementRect.left - parentRect.left,
        bottom: elementRect.bottom - parentRect.top,
        right: elementRect.right - parentRect.left
    };
  }
  function smoothScrollToElement(element, offset = 0) {
    const elementPosition = getAbsolutePosition(element);
    const targetScroll = elementPosition.top - offset;
    
    // Smooth scroll with animation
    window.scrollTo({
        top: targetScroll,
        behavior: 'smooth'
    });
  }
  // Enhanced version with progress callback
  function scrollToElementWithProgress(element, offset = 0, onProgress) {
    const start = window.scrollY;
    const elementPosition = getAbsolutePosition(element);
    const target = elementPosition.top - offset;
    const distance = target - start;
    const duration = 1000; // ms
    const startTime = performance.now();
    
    function animate(currentTime) {
        const elapsed = currentTime - startTime;
        const progress = Math.min(elapsed / duration, 1);
        
        // Easing function for smooth animation
        const easeProgress = 1 - Math.pow(1 - progress, 3);
        
        const currentPosition = start + (distance * easeProgress);
        window.scrollTo(0, currentPosition);
        
        if (onProgress) {
            onProgress(progress);
        }
        
        if (progress < 1) {
            requestAnimationFrame(animate);
        }
    }
    
    requestAnimationFrame(animate);
  }
  function scrollToElement(elementSelector) {
    const element = document.querySelector(elementSelector);
    if (element) {
      const methode=1;
      switch (methode) {
        case 1 :
          element.scrollIntoView();
          break;
        case 2 :
          smoothScrollToElement(element);
          break;
        case 3 :
          scrollToElementWithProgress(element, 0, (progress) => {
            logMsg('htmlElement',`Scroll progress: ${Math.round(progress * 100)}%`);
          });
          break;
      }
    }
    logMsg('htmlElement','scrollTo '+elementSelector);
  }
  function getAbsolutePosition(element) {
    const rect = element.getBoundingClientRect();
    
    return {
        top: rect.top + window.scrollY,    // Add vertical scroll
        left: rect.left + window.scrollX,  // Add horizontal scroll
        bottom: rect.bottom + window.scrollY,
        right: rect.right + window.scrollX
    };
  }
  function getPositionRelativeToParent(element) {
    const parent = element.parentElement;
    const parentRect = parent.getBoundingClientRect();
    const elementRect = element.getBoundingClientRect();
    
    return {
        top: elementRect.top - parentRect.top,
        left: elementRect.left - parentRect.left,
        bottom: elementRect.bottom - parentRect.top,
        right: elementRect.right - parentRect.left
    };
  }
  function smoothScrollToElement(element, offset = 0) {
    const elementPosition = getAbsolutePosition(element);
    const targetScroll = elementPosition.top - offset;
    
    // Smooth scroll with animation
    window.scrollTo({
        top: targetScroll,
        behavior: 'smooth'
    });
  }
  // Enhanced version with progress callback
  function scrollToElementWithProgress(element, offset = 0, onProgress) {
    const start = window.scrollY;
    const elementPosition = getAbsolutePosition(element);
    const target = elementPosition.top - offset;
    const distance = target - start;
    const duration = 1000; // ms
    const startTime = performance.now();
    
    function animate(currentTime) {
        const elapsed = currentTime - startTime;
        const progress = Math.min(elapsed / duration, 1);
        
        // Easing function for smooth animation
        const easeProgress = 1 - Math.pow(1 - progress, 3);
        
        const currentPosition = start + (distance * easeProgress);
        window.scrollTo(0, currentPosition);
        
        if (onProgress) {
            onProgress(progress);
        }
        
        if (progress < 1) {
            requestAnimationFrame(animate);
        }
    }
    
    requestAnimationFrame(animate);
  }
  function scrollToElement(elementSelector) {
    const element = document.querySelector(elementSelector);
    if (element) {
      const methode=1;
      switch (methode) {
        case 1 :
          element.scrollIntoView();
          break;
        case 2 :
          smoothScrollToElement(element);
          break;
        case 3 :
          scrollToElementWithProgress(element, 0, (progress) => {
            logMsg('htmlElement',`Scroll progress: ${Math.round(progress * 100)}%`);
          });
          break;
      }
    }
    logMsg('htmlElement','scrollTo '+elementSelector);
  }