前言

回到顶部,相信大家都不陌生吧,这个功能可谓是随处可见,也是作为一名前端开发工程师手到擒来的一个功能点。但前几天刚刚好有一个类似于回到顶部(锚点)的功能点把我卡住了,就是点击锚点按钮页面滚到对应位置。如果说直接显示到对应位置那可真是太简单了,但过程需要点过渡的动画就难到我了,硬生生做了两个小时(说到底还是自己技术不过关)。

需求

点击锚点按钮页面带过渡动画显示到对应位置

HTML

因后期需实现页面滚动到对应位置时锚点高亮,故使用 View Design 框架的步骤条实现锚点按钮样式,为后期功能实现打好基础。

<Steps class="Steps" direction="vertical"><Step status="wait" class="stepItem" :key="index" @click.native="changAnchor(item)" v-for="(item, index) in teacherData.groupList" :content="item.groupName"></Step>
</Steps>

失败思路

首次实现时的思路是,如果目前的滚动条高度大于锚点盒子顶部距离页面顶部的高度,便以每10毫秒的速度往上滚(减20),同理若小于则往下滚(加20)。等两则高度相等时则结束此方法(清除计时器),注意 : 一定要清除计时器。(此思路存在问题,好奇的同学可以先思考一下错在哪再往下看)。

失败方法

/*** changAnchor 点击切换锚点* (this.$refs['scroll'] as any).wrap.scrollTop为本项目自己编写的一个页面滚动条,故此代码不能直接copy复用。* 此处代码有些庸余,本应该在计时器前声明一下(this.$refs['scroll'] as any).wrap.scrollTop,但声明之后报了一下莫名其妙的错误,就没有继续往下深究。*/changAnchor(item: any){if(this.clickShow === true){this.clickShow = false // 用于判断上一次滚动是否执行完毕,如若不执行完毕不执行下一次滚动,否则多次点击动画会出现错乱const targetbox: any = document.getElementById(item.firstStepId); // 获取对应锚点盒子const target = targetbox.offsetTop - 110;this.timeTop = setInterval(() => {if((this.$refs['scroll'] as any).wrap.scrollTop > target){(this.$refs['scroll'] as any).wrap.scrollTop -= 20}if((this.$refs['scroll'] as any).wrap.scrollTop < target) {(this.$refs['scroll'] as any).wrap.scrollTop += 20}if((this.$refs['scroll'] as any).wrap.scrollTop === target){clearInterval(this.timeTop);this.clickShow = true}}, 1);}}

失败思路解析

细心的同学可能就会发现这个方法的漏洞,相加相减实现它的动画效果没毛病,但以每次20为间距来相加相减,若此时相加后或者相减后的最后一次距离小于20,那再执行一次相加相减岂不是刚好跳过了它们相等时的值?此时函数会继续往下执行,页面便会一直向上滚或者往下滚,并且因为没有清除计时器边永久执行此方法。

可行思路

继续延用上诉的思路,但在此基础上进行优化。当相加或相减的距离小于20时,将滚动条高度直接赋值成锚点盒子的高度。

可行方法

/*** changAnchor 点击切换锚点*/changAnchor(item: any){if(this.clickShow === true){this.clickShow = false // 用于判断上一次滚动是否执行完毕,如若不执行完毕不执行下一次滚动,否则多次点击动画会出现错乱const targetbox: any = document.getElementById(item.firstStepId); // 获取对应锚点盒子const target = targetbox.offsetTop - 110;this.timeTop = setInterval(() => {if((this.$refs['scroll'] as any).wrap.scrollTop > target + 20){(this.$refs['scroll'] as any).wrap.scrollTop -= 20} else if((this.$refs['scroll'] as any).wrap.scrollTop <= target +20 && (this.$refs['scroll'] as any).wrap.scrollTop >= target){(this.$refs['scroll'] as any).wrap.scrollTop = target}if((this.$refs['scroll'] as any).wrap.scrollTop < target - 20) {(this.$refs['scroll'] as any).wrap.scrollTop += 20} else if((this.$refs['scroll'] as any).wrap.scrollTop >= target - 20 && (this.$refs['scroll'] as any).wrap.scrollTop <= target){(this.$refs['scroll'] as any).wrap.scrollTop = target}if((this.$refs['scroll'] as any).wrap.scrollTop === target){clearInterval(this.timeTop);this.clickShow = true}}, 1);}}

效果图:

总结

本题的思路其实跟循环差不多,只是单纯的把循环事件变成计时器来使用,所以其他同学若是感兴趣也可以试着使用循环的方式来实现。

点击按钮页面滚动到对应位置(锚点)相关推荐

  1. jQuery-点击按钮页面滚动到顶部,底部,指定位置

    $('.scroll_top').click(function(){$('html,body').animate({scrollTop: '0px'}, 800);}); //页面滚动至顶部$('.s ...

  2. js控制页面滚动到指定位置,js中scrollIntoView()的用法

    js中scrillIntoView()的用法--页面滚动到指定位置 最近遇到一个问题,在一个页面上,点击某个按钮时,滚动到页面的某一位置. 如图: 如果是我写的话,我可能会先获取滚动到的元素,然后获取 ...

  3. 使用jQuery实现点击按钮 页面下滑一定距离

    使用jQuery实现 点击按钮 页面下滑一定距离 在页面中添加 <script>$(".anniu").click(function(){var h=$(window) ...

  4. JQ:当页面滚动到一定位置之后,让元素固定在顶部,小于位置后恢复原来的位置

    项目背景: 一天小虎找到龙哥说,龙哥你有没有现成的JS板子,就是那种当页面滚动到某个位置时,页面中的某个元素则固定在顶部不在滚动,而小于这个位置之后这个元素又恢复到原来的状态. 实现:这里做了一个简单 ...

  5. layui让当前页面刷新_layui点击按钮页面会自动刷新的解决方案

    问题: Title 输入框 test layui.use(['laytpl','jquery','layer','form'],function () { var laytpl = layui.lay ...

  6. SwiftUI ScrollView 高级技巧之 01 单击按钮手动滚动到某个位置

    实战需求 SwiftUI ScrollView 高级技巧之 01 单击按钮手动滚动到某个位置 开发过程中,有时开发人员希望以编程方式滚动到特定位置,或者希望从下到上滚动,例如聊天视图.交易视图等,我们 ...

  7. 页面滚动到指定位置导航栏固定顶部

    做一个网页时经常会用到导航栏,导航栏对于一个网站来说,地位是举足轻重的,在用到导航栏时,我们经常会用到一个效果,就是当页面滑动到一定的位置时,导航栏需要固定在页面的顶部,这是怎么实现的呢? 下面的代码 ...

  8. IOS 页面跳转问题:点击按钮页面不跳转

    问题:每次运行模拟器进入(登录页面->我的页面->注销)没有问题,但是注销后回到登录页面,再点击登录就没有反应了. AppDelegate: LoginViewController *lo ...

  9. jquery页面滚动显示浮动菜单栏锚点定位效果

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <metahttp-equiv="Content-Type"c ...

最新文章

  1. Day9-Postfix
  2. linux 查看目录挂载的ip,Linux挂载IPSAN和FCSAN操作,Linux挂载NFS文件系统
  3. delphi 程序运行时移动控件
  4. nyoj 寻找最大数
  5. 【flink】Flink 中的木桶效应:单个 subtask 卡死导致整个任务卡死
  6. Impala使用RPM安装过程
  7. Android进阶-NDK学习完整版
  8. Java 中的 String、StringBuffer、StringBuilder
  9. 如何写一份优秀的投资计划书
  10. SAP License:仓库ERP系统
  11. JS,VUE检测Video视频是否全屏播放
  12. 3D MAX眼睛贴图制作过程
  13. 计算机科学导论(原书第三版)框架总结
  14. [概念]图像分割的历史 + UNet-Family
  15. 支持web信息分类的高性能蜘蛛程序 爬虫程序 spider
  16. 在html中取消超链接的下划线
  17. 红孩子拟今年完成 1亿美元融资
  18. 使用超临界二氧化碳进行精密表面清洁
  19. 全国信息化和软件服务业工作座谈会召开
  20. python-opencv第六期:addWeighted函数详解

热门文章

  1. WPS2019设置自动保存方法
  2. 利用外部程序对存储BIOS设置参数的CMOS RAM进行读取操作的可行性分析
  3. SRT上传文件下载文件
  4. Android高效旋转图片的方式
  5. Linux下YVU420转MP4工具下载,yuv420p转jpg linux(纯C语言实现)
  6. 判决反馈均衡器matlab,matlab判决反馈信道均衡代码
  7. pny 魔豆系列4G U盘 测速
  8. Java开源 J2EE框架(二)
  9. 【陈工笔记】# 多模态 # 多模态在图像配准方面的简单认知
  10. 23种设计模式 - C++实现