vue快速实现锚点功能简单版与高级版

Posted 水香木鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue快速实现锚点功能简单版与高级版相关的知识,希望对你有一定的参考价值。

剑阁峥嵘而崔嵬,一夫当关,万夫莫开 🏆 @蜀道难

🔎 了解博主

  1. 📢 个人简介: 哈喽!小伙伴们,我是水香木鱼,水瓶座一枚 😜 来自于黑龙江 庆安
  2. 🏡 本站首页: 水香木鱼
  3. 🎨 系列专栏:后台管理系统
  4. 📖 人生格言: 生活是一面镜子。 你对它笑, 它就对你笑; 你对它哭, 它也对你哭。
  5. 🌏 小目标: 成为前端界、UI视觉界 布道师

📑 文章内容

本次demo 演示,木鱼已将所有代码注释到代码区域。👇样式部分,暂不展示。仅展示主要代码部分。

一、简易版

1、页面定义锚点位置

  • @click="goAnchor('#vital1')" 为锚点事件,点击左侧导航,右侧滚动到对应的导航锚点位置。
  • 设置锚点时,需添加id(id="vital1"
<!--侧边栏-->
<ul class="leftSidebar">
  <li class="shapeHand" @click="goAnchor('#vital1')">
     <p class="Sidebar_p">赛季</p>
  </li>
</ul>
<!--设置锚点-->
<div class="anchorSubject" id="vital1">
  <p class="anchor_text">赛季</p>
  <i class="anchor_i"></i>
</div>
<!--锚点下显示的内容-->
<div>展示内容的区域......</div>

2、定义执行的方法

  methods:
    //锚点跳转
    goAnchor(selector) /*参数selector是id选择器(#anchor14)*/
      document.querySelector(selector).scrollIntoView(
        behavior: "smooth"
      );
    ,
  

二、高级版

此处为锚点高级版,相关代码注释已标注在代码区域。

1、锚点样式-组件封装

可自定义喜欢的样式

<!--TitleAnchor.vue-->
<template>
    <div class="comTitle">
        <div class="rebox">
            <div class="t1"></div>
            <div class="t2"></div>
            <div class="outTitle"> title </div>
        </div>
    </div>
</template>

<script>
export default 
    props: 
        title: 
            type: String,
        ,
    ,
;
</script>
<style lang="scss" scoped>
  .rebox
    display:flex;
    flex-direction: column;
    justify-content: center;
    position: relative
  
  .t1
    width: 240px;
    height: 1px;
    background: #b8b2b2
  
  .t2
    width: 220px;
    height: 1px;
    background: #6b6b6b;
    margin-top: 6px;
    margin-left: 10px
  
  .outTitle
    width: 114px;
    font-size: 16px;
    font-weight: bold;
    background: white;
    padding: 6px;
    position: absolute;
    top: -14px;
    left: calc((100% - 114px)/2);
    text-align: center;
  
  .comTitle
    display: flex;
    justify-content: center;
    width: 100%;
    margin: 20px 0;
  
</style>

2、页面定义导航

<template>
	<div>
	    <!--锚点导航-->
		<ul class="md">
			<li v-for="(item,index) in posOpt"
				@click="tabClick(item,index)" :key="index">
				<i :class="item.icon"></i> item.name 
			</li>
		</ul>
		<!--展示锚点-->
		<TitleAnchor id="floor0" :title="'铁路专业数据集'"/>
		<div>展示的内容</div>
		<TitleAnchor id="floor1" :title="'行业通用数据集'"/>
		<div>展示的内容</div>
		<TitleAnchor id="floor2" :title="'风云排行榜'"/>
		<div>展示的内容</div>
		<TitleAnchor id="floor3" :title="'模型大赛'"/>
		<div>展示的内容</div>
	</div>
</template>
<script>
import TitleAnchor from "../components/TitleAnchor.vue";
export default 
   components: 
      TitleAnchor,
   ,
   data() 
      return 
           posOpt:[
                    name:"铁路专业数据集",code:0,icon:"iconfont icon-tielushujuchaxun sz",
                    name:"行业通用数据集",code:1,icon:"iconfont icon-tongyongshujuguanli sz",
                    name:"风云排行榜",code:2,icon:"iconfont icon-shujumoxingpeizhi sz",
                    name:"模型大赛",code:3,icon:"iconfont icon-moxingjiazai sz",
            ],
       
   ,
   methods: 
          //Tba点击
          tabClick(item,index)
               //判断code 状态 ,如果等于0,点击后就滑动到id为(#floor0)的锚点内容区域,也就是根据code状态码 展示对应的锚点
                if(item.code ==0)
                    this.goAnchor('#floor0');
                else if (item.code ==1) 
                    this.goAnchor('#floor1');
                
                else if (item.code ==2) 
                    this.goAnchor('#floor2');
                else
                    this.goAnchor('#floor3');
                
            ,
            //锚点跳转
            goAnchor(selector) 
                var anchor = this.$el.querySelector(selector);//获取元素
                let total;
                let disFixed =document.getElementsByClassName("vux-fixed")[0];
                if(disFixed)
                    total = anchor.offsetTop-40;
                else
                    total = anchor.offsetTop-80;
                
                let distance = document.documentElement.scrollTop || document.body.scrollTop;
                // 计算每一小段的距离
                let step = total/6;
                (function smoothDown () 
                    if (distance < total) 
                        distance += step;
                        // 移动一小段
                        document.body.scrollTop = distance;
                        document.documentElement.scrollTop = distance;
                        // 设定每一次跳动的时间间隔为10ms
                        setTimeout(smoothDown, 10)
                     else 
                        // 限制滚动停止时的距离
                        document.body.scrollTop = total;
                        document.documentElement.scrollTop = total
                    
                )()

            ,
   



</script>

博主致谢

非常感谢小伙伴们阅读到结尾,本期的文章就分享到这里,总结了vue快速实现锚点功能【简单版与高级版】,希望可以帮到大家,谢谢。

👉 如果你觉得本篇文章有帮助到您,鼓励一下木鱼吧! 点击关注+点赞+收藏+评论+转发 】支持一下哟

😛 您的支持就是我更新的最大动力。👇


往期精彩

前端vue实现高级检索小案例

前端vue项目最强优化-美化浏览器右侧滚动条样式与el-scrollbar

UI设计指南之可视化大屏【快速理解版】

前端css解决背景图、图片自适应的问题【通用】

前端echarts大小屏自适应与自定义Tab切换hover效果

以上是关于vue快速实现锚点功能简单版与高级版的主要内容,如果未能解决你的问题,请参考以下文章

UI设计指南之可视化大屏快速理解版

Pycharm安装中文语言插件Chinese木鱼快速安装版

前端vue实现注册功能与正则校验规则

前端vue路由模块拆分归类理解版

前端vue路由模块拆分归类理解版

前端快速排序算法JavaScript 与vue通用