资讯专栏INFORMATION COLUMN

vue better-scroll 遇到的坑

yiliang / 3340人阅读

摘要:先看效果介绍一个简单的静态页面主要是使用做横向滚动,点击标签滚动到相应位置,以及滚到相应位置后对应标签显示红色。

先看效果

介绍

一个简单的静态页面主要是使用 better-scroll 做横向滚动,
点击标签滚动到相应位置,以及滚到相应位置后对应标签显示红色。
开发过程中遇到了几个问题
一:初始化的时候要计算内容的高度,一直有误差,因为一开始直接用img引入的,没加载完就计算高度就会有问题
解决办法:用background写图片,然后高度写死
二:滚动到某个内容,对应标签高亮
这里比较的是当前滚动位置高度和内容距离dom顶部的高度加上实际nav的高度
三:better-scroll fixed后滚动失效
这里是因为没有给固定的宽度,用了100%造成的。这里给了tab-warp 宽度就解决了

记录一下和大家共同学习

主要代码

因为是静态野蛮标题放到数组中了

        itemList: [{
          "title": "战略升级"
        },
        {
          "title": "官方授权"
        },
        {
          "title": "100%正品"
        },
        {
          "title": "全链路监管"
        },
        {
          "title": "阳光保险"
        },
        {
          "title": "售后无忧"
        },
        {
          "title": "专业仓储"
        },
        {
          "title": "用户好评"
        },
        {
          "title": "媒体监督"
        },
        {
          "title": "资质公示"
        }

        ],
        
     mounted() {
      this.$nextTick(() => {
        window.addEventListener("scroll", this.handleScroll) // 监听滚动事件
        this.InitTabScroll() // 初始化滚动
      })
    },
    
    methods: {
      handleChange(index) {
        this.swipeIndex.nowIndex = index + 1
      },
      // 监听滚动事件
      handleScroll() {
        const scrollTop = window.pageYOffset || document.documentElement.scrollTop ||
          document.body.scrollTop
        // 吸顶效果
        const isFixed = scrollTop >= this.tabToTop
        if (isFixed !== this.isFixed) {
          this.isFixed = isFixed
        }
        // 当页面滚动时候标签也要滚动
        for (var i = 0; i < this.contentH.length; i++) {
          // 循环判断内容高度的数组,滚动的高度小于前一个大于后一个设置,这里是包含下拉面板的高度(我也不知道为什么,自己试出来的,尴尬)
          if (scrollTop +  this.tabRealHeight> this.contentH[i] && scrollTop +  this.tabRealHeight< this.contentH[i + 1]) {
            if (this.checkIndex !== i) {
              this.checkIndex = i
              // 然后设置标签高亮,滚动到居中位置
              this.scroll.scrollToElement(this.$refs.tabitem[i], 300, -100)
            }
          }
        }
      },
     
      // 初始化方法
      InitTabScroll() {
      /* 
       * 这里有几个高度需要注意一下,因为后面要计算滚动距离,这里要很精确要不就会出问题
       * tabToTop tab距离顶部的高度,也就是第一个图片的高度
       * tabRealHeight 是tab点下拉箭头显示面板后的高度
       * tabHeight 就是tab的高度了
       */
        // 头部高度 
        this.tabToTop = this.$refs["tab-containter"].offsetTop
        // tab 带面板高度
        this.tabRealHeight = this.$refs["tab-containter"].offsetHeight
        // tab 高度
        this.tabHeight = this.$refs["tabitem"][0].offsetHeight
        // 内容高度要记录下来放在数组里,当页面滚动的时候判断在哪个区间,对于标签高亮
        for (let i = 0; i < 11; i++) {
          this.contentH.push(this.$refs["contentItem" + i].offsetTop)
        }
        // nav横向滚动宽度,然后设置
        let width = 0
        for (let i = 0; i < this.itemList.length; i++) {
          width += this.$refs.tabitem[i].getBoundingClientRect().width // getBoundingClientRect() 返回元素的大小及其相对于视口的位置
        }
        this.$refs.tabWrapper.style.width = width + "px"
        
        this.$nextTick(() => {
          if (!this.scroll) {
            this.scroll = new BScroll(this.$refs.tab, {
              startX: 0,
              click: true,
              scrollX: true,
              scrollY: false,
              eventPassthrough: "vertical"
            })
          } else {
            this.scroll.refresh()
          }
        })
      },
      // 点击nav标签
      checkStatus(index, pop) {
        this.checkIndex = index
        // 点击展开面板的选项
        if (pop) {
          this.flag = !this.flag
        }
        // 点击标签后,标签要滚到nav中间位置
        this.scroll.scrollToElement(this.$refs.tabitem[index], 300, -100)
        // 获取该点击标签对应的内容区域,距离dom顶部高度
        const offsetTop = this.$refs["contentItem" + index].offsetTop
        // 页面滚动到高度减去nav的位置
        window.scrollTo(0, offsetTop - this.tabHeight)
      }
    }
    
  
总结

主要功能实现了,但是还有很多需要优化的地方
查看demo 正品保障 完整代码 github
微信扫码看我们的小程序

关于我

您可以扫描添加下方的微信并备注 Soul 加交流群,给我提意见,交流学习。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103102.html

相关文章

  • 基于better-scrollvue滚动组件

    摘要:让用户可以滚动页面。事件中拿到想要的后浏览器已经隐藏地址栏和工具栏,放开插件滚动。发现派发的方法在父组件中监听后获取位置参数的效果不太好必须要手指贴着滑动才可以这个设置为可以实时派发滚动事件和位置参数其他坑点待发现欢迎大佬一起交流 写在前面 由于最近一个移动端项目中许多地方有滚动需求, 横向,纵向的都有,所以就基于better-scroll封装了一个通用的滚动组件,期间也踩了一些坑,有...

    xiaotianyi 评论0 收藏0
  • vue配合iview/element等ui实现界面效果起步

    摘要:与都是与配合使用的框架,用法与配置基本一致,在此,我以为例,教你如何起步。如果我的文字对你有用,记得点心关注我,给一点点动力支撑。 iview与element都是与vue配合使用的ui框架,用法与配置基本一致,在此,我以iview为例,教你如何起步。*首先,你需要有一定的vue基础,如果你还是个小白,可以去我之前介绍如何搭建一个vue项目先看看,点击下面的链接就OK了http://ww...

    Object 评论0 收藏0
  • vue配合iview/element等ui实现界面效果起步

    摘要:与都是与配合使用的框架,用法与配置基本一致,在此,我以为例,教你如何起步。如果我的文字对你有用,记得点心关注我,给一点点动力支撑。 iview与element都是与vue配合使用的ui框架,用法与配置基本一致,在此,我以iview为例,教你如何起步。*首先,你需要有一定的vue基础,如果你还是个小白,可以去我之前介绍如何搭建一个vue项目先看看,点击下面的链接就OK了http://ww...

    tommego 评论0 收藏0
  • vue全家桶仿某鱼部分布局以及功能实现

    摘要:在这里简单叙述一下我仿某鱼部分布局以及功能实现的过程,仅做学习用途。另一方面,当与现代化的工具链以及各种支持类库结合使用时,也完全能够为复杂的单页面应用提供驱动。可以进行确认收货后删除订单。 前言 每次写文章时,总会觉得比写代码难多了,可能这就是我表述方面的不足吧,然而写文章也是可以复盘一下自己的开发过程,对自己还是受益良多的。在这里简单叙述一下我仿某鱼部分布局以及功能实现的过程,仅做...

    dreamGong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<