vue 锚点双向滚动监听

<template>
 <div class="container">
  <div class="wrapper">
   <div class="section" style="height:385px;width:100%" v-for="(item, index) in list" :key="index" >
    <div style="width:100%;height:100%;font-size:30px;text-align:center;font-weight:bold;color:#fff;" :style="{'background':item.backgroundcolor}">{{item.name}}</div>
   </div>
  </div>
  <!-- <div id="nac" style="height:200px;"></div> -->
  <nav style="position:fixed;right:30px;top:300px;">
  <a class="nav1" v-for="(item, index) in navList" :key="index" @click="jump(index)" :class="index==tabindex?'current':''">{{item}}</a>
  </nav>
 </div>
</template>
<script>
    export default {
        data(){
        return {
            scroll: '',
            list: [{
                name: "第一条1",
                backgroundcolor: "#90B2A3"
            }, {
                name: "第二条",
                backgroundcolor: "#A593B2"
            }, {
                name: "第三条",
                backgroundcolor: "#A7B293"
            }, {
                name: "第四条",
                backgroundcolor: "#0F2798"
            }, {
                name: "第五条",
                backgroundcolor: "#0A464D"
            }],
            navList: [1, 2, 3, 4, 5],
            tabindex : 0
        }
        },
        methods: {
            dataScroll: function () {
                this.scroll = document.documentElement.scrollTop || document.body.scrollTop;
            },
            jump(index) {
                let jump = document.getElementsByClassName('section');
                // 获取需要滚动的距离
                let total = jump[index].offsetTop -  80;
                // Chrome
                document.body.scrollTop = total;
                // Firefox
                document.documentElement.scrollTop = total;
                // Safari
                window.pageYOffset = total;
                this.tabindex = index;
            },
            loadSroll: function () {
                var self = this;
                var sections = document.getElementsByClassName('section');
                for (var i = sections.length - 1; i >= 0; i--) {
                    if (self.scroll >= sections[i].offsetTop - 100) {
                        this.tabindex = i;
                        break;
                    }
                }
            }
        },
        watch: {
        scroll: function () {
            this.loadSroll()
        }
        },
        mounted() {
        window.addEventListener('scroll', this.dataScroll);
        }
    }
</script>

<style>
 * {
 padding: 0;
 margin: 0;
 }
 .nav1 {
  display: block;
  width: 40px;
  height: 40px;
  text-align: center;
  line-height: 40px;
  background: #eee;
  margin: 10px 0;
 }
 .current {
  color: #fff;
  background: red;
 }
</style>

以上代码最后一项滚动监听不灵敏,不知各位大神是否有更好的办法

Vue点定位双向滚动是一种实现在页面中链接时,页面能够滚动到对应位置的功能。这个功能可以通过监听滚动事件和使用ref属性来实现。首先,在左边的内容模块中给每个模块添加一个ref属性和相同的class类名,以便获取对应的DOM元素。然后,在内容区域添加滑动事件@scroll="handleScroll",当内容区域滑动时触发handleScroll方法。接下来,在右边的链接中添加击事件@click="goAnchor(&#39;anchor-&#39; + index, index)",当链接时,调用goAnchor方法获取对应的DOM元素。在goAnchor方法中,可以使用scrollIntoView方法将对应的DOM元素滚动到可视区域内实现双向滚动效果。这样,当链接时,页面会滚动到对应的位置。 #### 引用[.reference_title] - *1* [vue:实现双向滚动/文章章节联动滚动效果](https://blog.csdn.net/qq_36604536/article/details/126936016)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vue 双向实现 简易版(scrollIntoView)](https://blog.csdn.net/weixin_47978760/article/details/127808313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值