① import { useScrollHighlight } from '@/utils/useAnchorScroll';

    // 切换滚动到对应位置锚点
    useScrollHighlight(nav_list, activeName, '.system-warp-box', 99, isClickScrolling,1,'sections-');


如果dom没渲染完的情况使用下面
  // 切换滚动到对应位置锚点
  const { handleScroll } =useScrollHighlight(nav_list, current_id, '.history-warp', 99, isClickScrolling,activeType);

  onMounted(() => {
    const el = document.querySelector('.history-warp');
    if (el) {
    el.addEventListener('scroll', handleScroll);
    }
    
  });

③// useScrollHighlight.ts方法

// useScrollHighlight.ts
import { onMounted, onBeforeUnmount,onUpdated } from 'vue';

export function useScrollHighlight(
  navListRef: any,//锚点数组
  activeNameRef: any,//active的值
  scrollContainerSelector: string,//详情容器的id
  offset = 99,
  isClickScrollingRef: any = { value: false } ,
  activeType: number = 1,//控制动态active的值
  sectionPrefix: string = 'section-', // 默认前缀,详情每个锚点详情的id
) {
  const handleScroll = () => {
    // console.log('🚀 ~ navListRef①:', navListRef?.value);
    // console.log('🚀 ~ activeNameRef②:', activeNameRef?.value);
    // console.log('🚀 ~ scrollContainerSelector③:', scrollContainerSelector);
    // console.log('🚀 ~ offset④:', offset);
    // console.log('🚀 ~ isClickScrollingRef⑤:', isClickScrollingRef?.value);

    if (isClickScrollingRef?.value) return;

    const scrollContainer = document.querySelector(scrollContainerSelector);
    if (!scrollContainer) return;
    const containerRect = scrollContainer.getBoundingClientRect();

    for (let i = navListRef.value.length - 1; i >= 0; i--) {
      const sectionType = `${sectionPrefix}${navListRef.value[i].id}`;
      const section = document.getElementById(sectionType);
      if (section) {
        const rect = section.getBoundingClientRect();
        const relativeTop = rect.top - containerRect.top;

        if (relativeTop <= offset) {
          activeNameRef.value =
            activeType === 1
              ? 'tab' + navListRef.value[i].id
              : navListRef.value[i].id;
          break;
        }
      }
    }
  };

  onUpdated(() => {
    const scrollContainer =  document.querySelector(scrollContainerSelector);
    scrollContainer?.addEventListener('scroll', handleScroll);
  });

  onBeforeUnmount(() => {
    const scrollContainer = document.querySelector(scrollContainerSelector);
    scrollContainer?.removeEventListener('scroll', handleScroll);
  });

  return { handleScroll };
}

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐