源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 233|回复: 28

[JavaScript] Vue.js实战之通过监听滚动事件实现动态锚点

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2017-4-4 16:11:47 | 显示全部楼层 |阅读模式
监听事件是我们在使用vue.js的时候经常使用的一个功能,下面这篇文章主要介绍了Vue.js实战之通过监听滚动事件实现动态锚点 的相关资料,文中通过示例代码介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

前言

前几天工作中在做项目的时候,需要实现一个动态锚点的效果,具体效果如下:

如果是传统项目,这个效果就非常简单。但是放到 Vue 中,就有两大难题:

      1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑滚动?

      2. 如何监听页面滚动事件?

在浏览了大量文章、进行多次尝试之后,终于解决了这些问题

期间主要涉及到了 setTimeout 的递归用法,和 Vue 生命周期中的 mounted

一、锚点实现

在实现平滑滚动之前,得先确保基本的锚点功能

如果没有其他要求,直接用 <a href="#id" rel="external nofollow" > 是最简单粗暴的办法

但是为了满足后续的要求,必须另外想办法 

首先在父组件(表单)中添加 class="d_jump" 作为钩子

然后在子组件中添加一个 jump 方法

jump (index) {
 let jump = document.querySelectorAll('.d_jump')
 // 获取需要滚动的距离
 let total = jump[index].offsetTop
 // Chrome
 document.body.scrollTop = total
 // Firefox
 document.documentElement.scrollTop = total
 // Safari
 window.pageYOffset = total
},

通过 offsetTop 获取对象到窗体顶部的距离,然后赋值给 scrollTop,就能实现锚点的功能

需要注意的是:各浏览器下获取 scrollTop 有所差异

      Chrome: document.body.scrollTop

      Firefox: document.documentElement.scrollTop

      Safari: window.pageYOffset

二、平滑滚动

仅仅是锚点是不够的,这样的跳转十分突兀

为了更好的用户体验 ,需要将滚动的过程展现出来

如果有 jQuery 实现平滑滚动就非常简单:

$('html body').animate({scrollTop: total}, 500);

可惜没如果~~

在看了好些文章之后,有了一个大概的开发思路:

将总距离分成很多小段,然后每隔一段时间跳一段

只要每段的时间足够短,频次足够多,在视觉上就是正常的平滑滚动了

// 平滑滚动,时长500ms,每10ms一跳,共50跳
// 获取当前滚动条与窗体顶部的距离
let distance = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
// 计算每一小段的距离
let step = total / 50
(function smoothDown () {
 if (distance < total) {
 distance += step
  // 移动一小段
 document.body.scrollTop = distance
 document.documentElement.scrollTop = distance
 window.pageYOffset = distance
  // 设定每一次跳动的时间间隔为10ms
 setTimeout(smoothDown, 10)
 } else {
  // 限制滚动停止时的距离
 document.body.scrollTop = total
 document.documentElement.scrollTop = total
 window.pageYOffset = total
 }
})()

实际情况下,得考虑向上滚动和向下滚动两种情况,完整的代码为:

jump (index) {
 // 用 class="d_jump" 添加锚点
 let jump = document.querySelectorAll('.d_jump')
 let total = jump[index].offsetTop
 let distance = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
 // 平滑滚动,时长500ms,每10ms一跳,共50跳
 let step = total / 50
 if (total > distance) {
 smoothDown()
 } else {
 let newTotal = distance - total
 step = newTotal / 50
 smoothUp()
 }
 function smoothDown () {
 if (distance < total) {
 distance += step
       document.body.scrollTop = distance
 document.documentElement.scrollTop = distance
 window.pageYOffset = distance
 setTimeout(smoothDown, 10)
 } else {
 document.body.scrollTop = total
 document.documentElement.scrollTop = total
 window.pageYOffset = total
 }
 }
 function smoothUp () {
 if (distance > total) {
 distance -= step
       document.body.scrollTop = distance
 document.documentElement.scrollTop = distance
 window.pageYOffset = distance
 setTimeout(smoothUp, 10)
 } else {
 document.body.scrollTop = total
 document.documentElement.scrollTop = total
 window.pageYOffset = total
 }
 } 
 }

三、修改锚点状态

在上面展示的效果中,当页面滚动的时候,锚点的激活状态会有相应的改变

其实这个效果并不难,只需要监听页面滚动事件,然后根据滚动条的距离修改锚点状态就可以了

但是在 Vue 中,应该在什么地方监听滚动事件呢?

mounted: function () {
 this.$nextTick(function () {
 window.addEventListener('scroll', this.onScroll)
 })
 },
 methods: {
 onScroll () {
 let scrolled = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
    // 586、1063分别为第二个和第三个锚点对应的距离
 if (scrolled >= 1063) {
 this.steps.active = 2
 } else if (scrolled < 1063 && scrolled >= 586) {
 this.steps.active = 1
 } else {
 this.steps.active = 0
 }
 }
 }

上面的代码中,我先写了一个修改锚点状态的方法 onScroll,然后在 mounted 中监听 scroll 事件,并执行 onScroll 方法

mounted 是 Vue 生命周期中的一个状态,在这个状态下,$el (vue 实例的根元素)已经创建完毕,但还没有加载数据

从结果上看,也可以在 created 状态下监听 scroll 事件

如果对 mounted 和 created 还不够了解,可以参考官方文档·生命周期图示

总结

上面只能算是一个应急之法,而且这种操作 DOM 的方法,并不符合 Vue 的设计理念,待我研究出更合理更高效的办法之后,再发出来分享~

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

回复

使用道具 举报

0

主题

1万

回帖

87

积分

注册会员

Rank: 2

积分
87
发表于 2023-9-9 13:25:18 | 显示全部楼层
天天源码论坛
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-12-10 00:28:50 | 显示全部楼层
看看怎么样再说
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

172

积分

注册会员

Rank: 2

积分
172
发表于 2024-2-28 22:28:07 | 显示全部楼层
建军节建军节建军节建军节
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

50

积分

注册会员

Rank: 2

积分
50
发表于 2024-4-10 09:52:47 | 显示全部楼层
儿飞飞微风DVD谁vdsvd
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2024-9-3 14:19:43 | 显示全部楼层
天天源码论坛
回复 支持 反对

使用道具 举报

匿名  发表于 2024-9-3 14:21:19

Купить Оптом Кабели

Цена от 21 руб https://www.kabelprom.com/kabel-vvgng-a-ls-5h1-5-silovoy

Кабель алюминиевый силовой https://www.kabelprom.com/kabel-kgvvng-a-ls-10h0-75-gibkiy-upravleniya

от 107 руб https://www.kabelprom.com/produkciya/?page=35
/м https://www.kabelprom.com/kabel-vekbshvng-a-frls-1h6-0-silovoy

Производитель: Теплолюкс; Вид обогрева: Промышленный; Бренд: Атлантик; Страна производитель: Россия; Количество жил: 2; Артикул: 210519000001; Сечение, мм?: 1 https://www.kabelprom.com/kabel-mkeshvng-a-ls-6h2h0-5-montazhnyy
5; Заземление: Медная луженая оплетка; Изоляция: ПВХ-пластикат https://www.kabelprom.com/kabel-vekbshvng-a-ls-3h95-0-silovoy
  Установочные провода – это элеме https://www.kabelprom.com/kabel-mkshvng-a-frls-8h2h2-5-montazhnyy

в наличии Опт / Розница 18 https://www.kabelprom.com/kabel-vvg-1h6-0-silovoy
07 https://www.kabelprom.com/kabel-mkekshv-5h2h0-5-montazhnyy
24 https://www.kabelprom.com/kabel-ppgeng-a-frhf-4h1-5-silovoy

Авторизация https://www.kabelprom.com/kabel-kvvg-5h1-5-kontrolnyy

回复 支持 反对

使用道具

匿名  发表于 2024-9-3 14:22:29

Купить Силовых Кабелей


Письма производителей о официальном представительстве в России ТК Нева https://www.kabelprom.com/kabel-vvg-5h1-5-silovoy

Компания  сотрудничает напрямую с заводами-изготовителями популярных и новых видов судового кабеля https://www.kabelprom.com/kabel-ppgng-a-hf-1h95-0-silovoy
  Данная продукция не поддерживает горение, выдерживает контакты со смазочными маслами, дизельным топливом https://www.kabelprom.com/kabel-mkeksh-10h1-5-montazhnyy
  Она устойчива к негативным факторам внешней среды, в том числе плесени, т https://www.kabelprom.com/produkciya/kabel-kontrolnyy/marka-kvvg/kvvgnga-hl/
  е соответствует всем нормативам и международным стандартам https://www.kabelprom.com/kabel-kgvvng-a-ls-4h10-0-gibkiy-upravleniya

Цена от 22 руб https://www.kabelprom.com/kabel-vebshvng-a-ls-2h6-0-silovoy

ЗАО  Смирнов Алексей Михайлович Искал поставщика кабельной продукции для строительного объекта https://www.kabelprom.com/kabel-vbshvng-a-frls-2h2-5-silovoy
  Удивительно, но еще существуют компании, которые действительно думают о качестве выполняемой ими работы и потребностях клиента, а не о собственном кошельке https://www.kabelprom.com/kabel-kvebshvng-a-ls-19h1-0-kontrolnyy
  Нареканий никаких не возникло – все быстро и четко, доступные цены, отличный выбор товара https://www.kabelprom.com/produkciya/kabel-montazhnyy/marka-mkeshv/?page=2
  У всей продукции имеются необходимые сертификаты, проверял лично https://www.kabelprom.com/kabel-mkekshvng-a-ls-2h2h0-75-montazhnyy
  Также хочется отметить информативное размещение сайта и внимательное отношение консультантов https://www.kabelprom.com/kabel-kgvbshvng-a-frls-4h50-0-gibkiy

Количество: --> - +
Убеждены в том, что наше сотрудничество с Вашей компанией будет успешным, плодотворным и взаимовыгодным https://www.kabelprom.com/kabel-mksh-10h1-0-montazhnyy
  Полную информацию о продукции и ценах вы можете узнать, обратившись к нашим менеджерам https://www.kabelprom.com/kabel-kgvbshv-2h10-0-gibkiy

回复 支持 反对

使用道具

匿名  发表于 2024-9-3 14:23:02

Куплю Кабель Силовой


Вес кабеля Диаметр кабеля Размещение барабанов Расшифровка кабеля Аналоги/замены кабеля Длина кабеля на барабане https://www.kabelprom.com/kabel-kgppng-a-hf-2h4-0-gibkiy

Наш каталог —
Товары компании Доставка и оплата О компании Контакты https://www.kabelprom.com/kabel-ppgng-a-frhf-5h10-0-silovoy

17 лет платного размещения https://www.kabelprom.com/kabel-kgppng-a-hf-4h120-0-gibkiy

Цена от 21 руб https://www.kabelprom.com/kabel-kgvvng-a-ls-2h70-0-gibkiy-upravleniya

Кабель контрольный алюминиевый https://www.kabelprom.com/kabel-kg-5h150-0-silovoy-gibkiy

回复 支持 反对

使用道具

匿名  发表于 2024-9-3 14:24:15

Купить Кабель Для Силовой

УОН 195.2.71.x ·±нУЪ 2024-9-3 14:21
§ё§Ц§Я§С §а§д 21 §в§е§Т https://www.kabelprom.com/kabel-vvgng-a-ls-5h1-5-silovoy

§§С§Т§Ц§Э§о §С ...

Кабельная продукция, используемая в судостроении, должна соответствовать всем требованиям Технического регламента относительно безопасной эксплуатации морского и речного транспорта https://www.kabelprom.com/kabel-ppgeng-a-frhf-5h4-0-silovoy
  Российское производство максимально полно обеспечивает потребность судостроительной отрасли в специализированном судовом кабеле https://www.kabelprom.com/kabel-vbshv-4h6-0-silovoy
  В частности, в последнее время стал осуществляться выпуск герметизированной кабельной продукции в резиновой и полимерной изоляции https://www.kabelprom.com/kabel-ppgeng-a-hf-1h1-5-silovoy

Наши проекты https://www.kabelprom.com/kabel-kgvvng-a-ls-4h6-0-gibkiy-upravleniya

Цена от 5 руб https://www.kabelprom.com/kabel-vvgeng-a-ls-1h2-5-silovoy

в наличии Опт 17 https://www.kabelprom.com/kabel-pkpng-a-hf-3h70-0-silovoy
07 https://www.kabelprom.com/kabel-kvekbshvng-a-frls-5h0-75-kontrolnyy
24 https://www.kabelprom.com/kabel-vvgng-a-2h16-0-silovoy

Звоните прямо сейчас и успейте получить персональную скидку и специальное предложение по доставке https://www.kabelprom.com/kabel-kvbbshv-4h2-5-kontrolnyy
  Компания  всегда готова предоставить вам лучшие условия и качественные продукты https://www.kabelprom.com/kabel-ppgeng-a-hf-1h95-0-silovoy

+7 показать номер https://www.kabelprom.com/kabel-vvgng-a-ls-5h1-5-silovoy

回复 支持 反对

使用道具

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2024-11-25 15:35 , Processed in 0.079847 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表