vue锚点双向绑定

摘要:
以下模块将不再向上滚动constmax=this。sArea[8]+10//滚动停止后,执行函数runLastFn(_=>i++){constheight=this.$refs[`block${i}`]。offsetTop-240//240是所有模块arr.push(高度>
  • 需求描述:

头部固定吸顶,右侧菜单,左侧长页面,要求左侧滚动右侧菜单对应高亮,点击右侧菜单,左侧页面滚动到对应位置。(这个对应位置就是模块头部刚好在固定头部下面)

  • 需求分析:

头部和右侧可使用fixed定位,左侧长页面不限制高度。有两件事需要处理:监听滚动事件,实现滚动效果。

  • 解决问题
// 监听事件添加和销毁
mounted() {
    document.addEventListener('scroll', this.handleScroll)
},
    
beforeDestroy() {
    document.removeEventListener('scroll', this.handleScroll)
}

// 滚动事件
handleScroll() {
    // 滚动高度
  const sTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
  // 最大值,当页面滚动到最大值后,下面的模块不会再向上滚动了
  const max = this.sArea[8] + 10
  
  // 滚动停止后执行函数
  runLastFn(_ => {
    this.initSArea()
    if (sTop < max) {
      // 判读页面滚动对应的菜单index
      const idx = this.findAreaIndex(sTop)
      if (!this.mFlag) return
      this.currentFloor = 'block' + idx
    }
  })
},
    
// 初始化不同模块(12个)滚动间距,注意每个模块都设置一个ref,每个模块滚动的距离组成一个数组,与菜单对应
initSArea() {
  const arr = []
  for (let i = 1; i < 12; i++) {
    const height = this.$refs[`block${i}`].offsetTop - 240 // 240 是所有模块滚动目标位置
    arr.push(height > 0 ? height : 0)
  }
  this.sArea = arr
  this.boxScreenHeight = this.$refs.boxRef.scrollHeight
},
    
// 滚动距离在数组中位置,以此判读哪个菜单应该在选择状态
findAreaIndex(val) {
  const sArea = this.sArea
  const len = sArea.length
  if (val < sArea[1]) return 1
  if (val > sArea[len - 1]) return len - 1

  let idx = 0
  let i = 0
  for (i; i < len; i++) {
    if (sArea[i] > val) {
      idx = i
      break
    }
  }
  return idx
}

// 点击菜单滚动到对应模块
gotoBlock(el, speed) {
  const idx = Number(el.slice(5))
  const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop // 滚动条距离顶部高度
  let currentTop = scrollTop // 默认滚动位置为当前滚动条位置,若改为0,则每次都会从顶部滚动到指定位置
  let top = 0 // 需要滚动到的位置

  if (idx < 9) {
    this.mFlag = true
    const i = idx - 1 > 0 ? idx - 1 : 0 // 有个回到顶部菜单,所以第一个和第二个滚动位置一样
    top = this.sArea[i] + 1 // 模块需要滚动的位置
  } else {
    this.mFlag = false // 页面无需滚动了,但是菜单被点击后仍要选中状态
    top = this.boxScreenHeight
    this.currentFloor = el
    setTimeout(_ => {
      this.mFlag = true
    }, 1200)
  }
    
  let requestId
  function step() {
    // 如果需要滚动的位置和当前位置之差小于步长speed,直接滚动到目标位置,否则按照步长滚动
    if (Math.abs(currentTop - top) < speed) {
      window.scrollTo(0, top)
    } else {
      if (scrollTop < top) {
        // 如果滚动条的高度小于元素距离顶部的高度
        if (currentTop <= top) {
          window.scrollTo(0, currentTop)
          requestId = window.requestAnimationFrame(step)
        } else {
          window.cancelAnimationFrame(requestId)
        }
        // 向下滚动
        currentTop += speed
      } else {
        if (top <= currentTop) {
          window.scrollTo(0, currentTop - speed)
          requestId = window.requestAnimationFrame(step)
        } else {
          window.cancelAnimationFrame(requestId)
        }
        // 向上滚动
        currentTop -= speed
      }
    }
  }
  window.requestAnimationFrame(step)
},

免责声明:文章转载自《vue锚点双向绑定》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇启动Tomcat时报错:Unable to load configuration.IOS开发之尺寸下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Delphi7快捷键

转自:http://blog.csdn.net/weide001/article/details/4100481 Ctrl+PageUp 将光标移至本屏的第一行,屏幕不滚动。   Ctrl+PageDown 将光标移至本屏的最后一行,屏幕不滚动。   Ctrl+↓ 向下滚动屏幕,光标跟随滚动不出本屏。   Ctrl+↑ 向上滚动屏幕,光标跟随滚动不出本...

win批处理(笔记)

@echo off (关闭执行过程,只显示结果) color 0a 黑绿 title 主题名 echo 打印输出 pause暂停 echo.空一行;换行; echo 垃圾清理 d: >nul 2 >nul cd >nul 2>nul rd . sq >nul 2>nul ping -n 10 10.1.1.1 >n...

nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下)

nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下),安装Nginx和HttpAccessKeyModule模块(参考LNMP环境搭建:第一步:在/usr/local/src/下下载模块压缩包:    wget http://wiki.nginx.org/images/5/51/Ngin...

urllib的使用

urllib的使用 urllib是python内置的HTTP请求库,包含如下四个模块: request:它是最基本HTTP请求模块,可以用来模拟发送请求,就像在浏览器里输入网址然后按回车一样,只需要传入URL以及额外的参数,就可以模拟实现这个过程了。 error:异常处理模块,如果出现请求错误,可以捕获到这些异常,然后进行重试或其他操作以保证程序不会意外终...

关于js在iframe中显示与隐藏的控制方式(display、visilibity以及hide()/show())

引子: 在项目开发过程中,使用iframe嵌套不同的页面,通过菜单来控制页面的切换展示。最开始使用的是show()和hide()方法来控制页面的展示与隐藏,但是遇到嵌套的页面高度不固定, 当嵌套页面过高会出现滚动条,如果拉下滚动条到某个位置,然后切换页面,再切换到上个页面时滚动条就自动到顶部而不是在之前下拉到的位置,所以这就存在问题。 这里,自己简单写了一...

macOS平台下虚拟摄像头的研发总结

一、背景介绍     虚拟摄像头,顾名思义,就是利用软件技术虚拟出一个摄像头硬件设备供用户使用。当我们需要对视频图像进行处理再输出时,虚拟摄像头就具备非常大的价值了。关于如何在Windwos上实现一个虚拟设备的资料已经非常丰富了,Windows Driver Kit里面也有非常多的帮助文档。这篇博文主要总结了在Mac下开发虚拟摄像头的一些经验。Mac下的虚...