vue实现滚动锚点

1. 今天做项目时,要做一个类似于文档格式的滚动锚点,点击左边菜单让右边菜单滚动到用户可视区域。而这两边的数据都是for循环出来的数据。虽然是vue项目但是是js获取标签。

效果图:

<template>
  <div style="width: 100%; display: flex; margin-top: 5%">
    <div style="width: 30%">
      <p
        v-for="(item, index) in list"
        :key="index"
        @click="clicks(index)"
        :class="{ green: indexs == index }"
      >
        {{ item.title }}</p
      >
    </div>
    <div style="width: 60%; margin-left: 5%; height: 50vh; overflow: scroll" @scroll="handScroll">
      <div v-for="ite in list" :key="ite.id" class="a">
        <p style="">{{ ite.title }}</p>
        <p>{{ ite.answer }}</p>
      </div>
    </div>
  </div>
</template>
<script setup>
  import { ref } from 'vue';
  let list = [
    {
      id: 1,
      title: '1.什么是html',
      answer:
        '1.超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据',
    },
    {
      id: 2,
      title: '2.什么是css',
      answer:
        '2.超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据',
    },
    {
      id: 3,
      title: '3.什么是html',
      answer:
        '3.超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据',
    },
    {
      id: 4,
      title: '4.什么是html',
      answer:
        '4.超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据',
    },
    {
      id: 5,
      title: '5.什么是html',
      answer:
        '5.超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据',
    },
    {
      id: 6,
      title: '6.什么是html',
      answer:
        '6.超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据',
    },
    {
      id: 7,
      title: '7.什么是html',
      answer:
        '7.超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据',
    },
    {
      id: 8,
      title: '8.什么是html',
      answer:
        '8.超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据',
    },
    {
      id: 9,
      title: '9.什么是html',
      answer:
        '9.超文本标记语言定义了多种数据类型的元素内容,如脚本数据和样式表的数据,和众多类型的属性值,包括ID、名称、URI、数字、长度单位、语言、媒体描述符、颜色、字符编码、日期和时间等。所有这些数据类型都是专业的字符数据',
    },
  ];

  const indexs = ref(0);
  const clicks = (index) => {
    indexs.value = index
    document.getElementsByClassName('a')[index].scrollIntoView({
      behavior: 'smooth', // 平滑过渡
      block: 'start', // 上边框与视窗顶部平齐。默认值
    });
  };
  //  同步改样式
  const handScroll = (e) => {
    let scrollItems = document.querySelectorAll('.a');
    for (let i = scrollItems.length - 1; i >= 0; i--) {
      // 判断滚动条滚动距离是否大于当前滚动项可滚动距离
      let judge = e.target.scrollTop >= scrollItems[i].offsetTop - scrollItems[0].offsetTop;
      if (judge) {
        indexs.value = i;
        break;
      }
    }
  };



</script>
<style >
  .green {
    font-weight: 700;
    color: green;
  }
</style>

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue实现滚动监听到点,可以通过以下步骤: 1. 在需要监听滚动的容器上,绑定 `@scroll` 事件。 2. 通过 `getBoundingClientRect()` 方法获取每个点元素的位置信息,得到它们距离容器顶部的距离。 3. 在滚动事件处理函数中,获取当前容器滚动的距离,并与每个点元素的位置信息进行比较,判断当前容器滚动到了哪个点的位置。 4. 将滚动到的点信息保存在 Vue 实例的数据中,并在模板中根据该数据展示对应的内容。 以下是一个简单的示例代码: ```vue <template> <div class="scroll-container" @scroll="handleScroll"> <div class="section" v-for="(section, index) in sections" :key="index"> <h2>{{ section.title }}</h2> <p>{{ section.content }}</p> </div> </div> </template> <script> export default { data() { return { activeSection: 0, // 默认选中第一个点 sections: [ { title: "Section 1", content: "Content 1" }, { title: "Section 2", content: "Content 2" }, { title: "Section 3", content: "Content 3" }, { title: "Section 4", content: "Content 4" }, ], }; }, mounted() { this.calculatePositions(); }, methods: { calculatePositions() { // 获取每个点元素的位置信息 this.positions = this.sections.map((section) => { const element = document.getElementById(section.title); return { title: section.title, top: element.getBoundingClientRect().top + this.$refs.container.scrollTop, }; }); }, handleScroll() { const scrollTop = this.$refs.container.scrollTop; // 判断当前滚动到了哪个点 for (let i = 0; i < this.positions.length; i++) { const position = this.positions[i]; if (scrollTop >= position.top && scrollTop < position.top + 400) { this.activeSection = i; break; } } }, }, }; </script> ``` 在该示例中,使用 `getBoundingClientRect()` 方法获取每个点元素的位置信息,并保存在 `positions` 数组中。在滚动事件处理函数中,获取当前容器滚动的距离,并与每个点元素的位置信息进行比较,判断当前容器滚动到了哪个点的位置。最后将滚动到的点信息保存在 `activeSection` 中,用于在模板中展示对应的内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值