利用vue实现点击导航栏定位到某个元素时,能够平滑滚动

其实方法很简单,也是走了很多弯路,见别人用的各种方法,但是自己都实现不了,等到实现的时候才发现原来如此简单,只需要几句代码即可。

做的是对bilibili首页仿写的一个小项目,虽然很简陋就是了。

 下面上一下页面的截图:

       功能很简单,点击右侧导航栏能够跳转到对应位置的内容分类上,同时右侧导航栏的点击之后将变色。

       首先先看一下比较生硬的效果是什么样的:

     这个是平滑的效果:

其实最最关键的代码只有几句,现贴出来如下:

jump(index) {
      this.jumpid = index; //用于点击右侧导航栏的时候,选中部分显示背景色
      let jumpitem = document.getElementsByName("jumpitem"); //得到所有的title,包括游戏,音乐,番剧这些
      jumpitem[index].scrollIntoView({
        behavior:'smooth',
        block:'start'
      });
    },

其中,函数scrollIntoView起了决定性的作用。

behavior要写成smooth

block可以写start,也可以是end,当然,默认是start

完整代码:

<template>
  <div class="content">
    <div class="dh" name="jumpitem" ref="content1" :id="'id'+index">动画</div>
    <div class="donghua">
      <ul class="firstPart">
        <li v-for="(item, index) in list" :key="index">
          <a href="" class="a1">{
   
   { item }}</a>
        </li>
      </ul>
    </div>
    <div class="zb" name="jumpitem" ref="content2" :id="'id'+index">直播</div>
    <div class="zhibo">
      <ul class="secondPart">
        <li v-for="(item, index) in list" :key="index">
          <a href="" class="a1">{
   
   { item }}</a>
        </li>
      </ul>
    </div>
    <div class="fj" name="jumpitem" ref="content3" :id="'id'+index">番剧</div>
    <div class="fanju">
      <ul class="thirdPart">
        <li v-for="(item, index) in list" :key="index">
          <a href="" class="a1">{
   
   { item }}</a>
        </li>
      </ul>
    </div>
    <div class="yy" name="jumpitem" ref="content4" :id="'id'+index">音乐</div>
    <div class="yinyue">
      <ul class="forthPart">
        <li v-for="(item, index) in list" :key="index">
          <a href="" class="a1">{
   
   { item }}</a>
        </li>
      </ul>
    </div>
    <div class="wd" name="jumpitem" ref="content5" :id="'id'+index">舞蹈</div>
    <div class="wudao">
      <ul class="fifthPart">
        <li v-for="(item, index) in list" :key="index">
          <a href="" class="a1">{
   
   { item }}</a>
        </li>
      </ul>
    </div>
    <div class="yx" name="jumpitem" ref="content6" :id="'id'+index">游戏</div>
    <div class="youxi">
      <ul class="sixthPart">
        <li v-for="(item, index) in list" :key="index">
          <a href="" class="a1">{
   
   { item }}</a>
        </li>
      </ul>
    </div>
    <!-- 导航栏 -->
    <div class="navfield">
      <div class="navbox">
        <div
          class="navitems"
          v-for="(item, index) in navitems"
          :key="item"
          :class="{ activated: jumpid == index }"
        >
          <a @click="jump(index)" class="nava">{
   
   {
            item.title
          }}</a>
        </div>
      </div>
    </div>
    <div class="top">
      <a href="">顶部</a>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      list: [
        "第一个内容",
        "第二个内容",
        "第三个内容",
        "第四个内容",
        "第五个内容",
        "第六个内容",
        "第七个内容",
        "第八个内容",
        "第九个内容",
        "第十个内容",
      ],
      //'动画','直播','番剧','音乐','舞蹈','游戏'
      navitems: [
        {
          title: "动画",
          pointer: "animation",
        },
        {
          title: "直播",
          pointer: "live",
        },
        {
          title: "番剧",
          pointer: "banngumi",
        },
        {
          title: "音乐",
          pointer: "music",
        },
        {
          title: "舞蹈",
          pointer: "dance",
        },
        {
          title: "游戏",
          pointer: "game",
        },
      ],
      jumpid: 0,
      naviitemstate: true, //点击导航栏时,暂时停止监听页面滚动
    };
  },
  methods: {
    jump(index) {
      this.jumpid = index; //用于点击右侧导航栏的时候,选中部分显示背景色
      let jumpitem = document.getElementsByName("jumpitem"); //得到所有的title,包括游戏,音乐,番剧这些
      jumpitem[index].scrollIntoView({
        behavior:'smooth',
        block:'start'
      });
      // jumpitem[index].scrollIntoView();
      
    },
    
  },
  mounted() {
    
  },
};
</script>
<style scoped>
* {
  padding: 0;
  margin: 0;
  text-decoration: none;
}
.dh {
  font-size: 1.8em;
}
.zb {
  font-size: 1.8em;
}
.fj {
  font-size: 1.8em;
}
.yy {
  font-size: 1.8em;
}
.wd {
  font-size: 1.8em;
}
.yx {
  font-size: 1.8em;
}
ul {
  list-style: none;
}
.a1 {
  display: inline-block;
  width: 233px;
  height: 150px;
}
.content {
  width: 70%;
  margin-left: 200px;
}
.donghua {
  width: 1200px;
  height: 400px;
}
.zhibo {
  width: 1200px;
  height: 400px;
}
.fanju {
  width: 1200px;
  height: 400px;
}
.yinyue {
  width: 1200px;
  height: 400px;
}
.wudao {
  width: 1200px;
  height: 400px;
}
.youxi {
  width: 1200px;
  height: 400px;
}
.firstPart {
  display: flex;
  flex-wrap: wrap;
}
.firstPart li {
  width: 233px;
  height: 150px;
  border: 1px solid black;
}
.secondPart {
  display: flex;
  flex-wrap: wrap;
}
.secondPart li {
  width: 233px;
  height: 150px;
  border: 1px solid black;
}
.thirdPart {
  display: flex;
  flex-wrap: wrap;
}
.thirdPart li {
  width: 233px;
  height: 150px;
  border: 1px solid black;
}
.forthPart {
  display: flex;
  flex-wrap: wrap;
}
.forthPart li {
  width: 233px;
  height: 150px;
  border: 1px solid black;
}
.fifthPart {
  display: flex;
  flex-wrap: wrap;
}
.fifthPart li {
  width: 233px;
  height: 150px;
  border: 1px solid black;
}
.sixthPart {
  display: flex;
  flex-wrap: wrap;
}
.sixthPart li {
  width: 233px;
  height: 150px;
  border: 1px solid black;
}
.navfield {
  position: relative;
}
.navbox {
  background-color: #fff;
  position: fixed;
  top: 300px;
  right: 10px;
  border: 1px solid black;
  border-radius: 10px;
}
.navitems {
  width: 80px;
  height: 50px;
  text-align: center;
  border-radius: 10px;
}
.top {
  width: 50px;
  height: 50px;
  text-align: center;
  border-radius: 50%;
  margin-top: 10px;
  border: 1px solid black;
  position: absolute;
  right: 24px;
  bottom: 270px;
  display: flex;
  justify-content: center;
  align-items: center;
  position: fixed;
  color: black;
}
.nava {
  display: inline-block;
  margin-top: 10px;
  cursor: pointer;
}
.activated {
  background-color: rgba(64, 160, 209, 1);
}
</style>

整体页面效果:

当前的组件只包括刚才截图中的内容,其他的内容是其他组件的。

 

如果大家有什么问题,欢迎大家在评论区交流,我这个代码我觉得写得很简单了,如果有不明白的可以一起讨论,评论区或者私信都可以

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/qq_41083105/article/details/117712357