广告
返回顶部
首页 > 资讯 > 精选 >小程序如何实现列表滚动上下联动效果
  • 588
分享到

小程序如何实现列表滚动上下联动效果

2023-06-22 03:06:21 588人浏览 独家记忆
摘要

这篇文章主要为大家展示了“小程序如何实现列表滚动上下联动效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何实现列表滚动上下联动效果”这篇文章吧。1、背景最近在做公司的一款小程序,其中有

这篇文章主要为大家展示了“小程序如何实现列表滚动上下联动效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何实现列表滚动上下联动效果”这篇文章吧。

1、背景

最近在做公司的一款小程序,其中有一块的设计的是在列表做上下滚动的是时候,顶部的tab栏跟着一起联动,当点击tab栏的时候,列表数据也跟随联动。

顶部的头部区域不跟随列表滚动;头部区域以下属于滚动区域。

2、实现

2.1 原理介绍

这个地方的实现主要借助了微信小程序原生的scroll-view组件。

使用它的 scroll-into-view 属性,可以实现点击顶部的tab栏,将页面滚动到指定的列表位置;

使用 bindscroll 事件,可以知道当前页面滚动的距离,根据滚动的距离做tab栏的切换操作;

2.1 页面布局代码

先说下界面的整体布局,主要分为两部分,头部固定区域 + 可滚动列表区域。

可滚动的列表区域的标题栏当滚动一定的距离后,它也要固定在顶部。

代码实现:

<!--index.wxml--><view class="list"><!--顶部固定区域--><view style="height: 88rpx;width: 100%;background-color: burlywood;text-align: center;">头部区域</view><!--可滚动区域--><scroll-view scroll-y="true" style="width: 100%; height: {{scrollAreaHeight}}px;" bindscroll="scroll" scroll-into-view="{{scrollToItem}}" scroll-with-animation="true"  scroll-top="{{scrollTop}}">   <!--水平滚动的tab栏-->  <scroll-view scroll-x="true" style="height: 88rpx;width: 100%;">  <view class="head-area {{float ? 'head-float' : ''}}" >    <view class="head-area-item {{curSelectTab === index ? 'head-area-item-select' : ''}}" wx:for="{{appGroupList}}" bindtap="tabClick" data-index="{{index}}">    {{item.name}}  </view>  </view>  </scroll-view><!--数据列表--><view class="list-group" style="height: {{listGroupHeight}}px;">  <view class="list-group-item" id="v_{{index}}" wx:for="{{appGroupList}}" data-index="{{index}}">    <view class="group-name">      {{item.name}}    </view>    <view class="group-children" >      <view wx:for="{{item.children}}" class="group-children-item" style="width: {{itemWidth}}px;">      <image src="{{item.url}}"></image>      <view>{{item.name}}</view>    </view>    </view>  </view></view> </scroll-view></view>

在布局代码中有几个点需要注意:

scrollAreaHeight 滚动区域的高度计算。 --- 通过获取当前设备的窗口高度减去顶部固定区域的高度

水平tab栏是否置顶。 --- 根据页面的滚动距离来判断,如果滚动距离 大于或者等于 水平tab栏的高度,则置顶;

设置数据列表的id="v_{{index}}" id,后续点击tab栏滚动到指定的位置就是根据这个id去实现的。

2.2 样式代码

.list{  width: 100%;  height: 100%;  display: flex;  flex-direction: column;}.head-area{  display: flex;  flex-direction: row;  flex-wrap: nowrap;  height: 88rpx;  width: 100%;  padding: 0 10;}.head-area-item{  display: flex;  height: 88rpx;  text-align: center;  width: 150rpx;  align-items: center;  justify-content: center;}.head-area-item-select{  color: #09bb07;}image{  width: 88rpx;  height: 88rpx;}.list-group{  display: flex;  width: 100%;  height: 1000%;  flex-direction: column;}.list-group-item{  display: flex;  width: 100%;  background-color: #aaa;  flex-direction: column;}.group-name{  height: 88rpx;  display: flex;  text-align: center;  align-items: center;  margin-left: 20rpx;}.group-children{  display: flex;  flex-direction: row;  flex-wrap: wrap;  width: 100%;}.group-children-item{  height: 160rpx;  display: flex;  flex-direction: column;  justify-content: center;  align-items: center;}.head-float{  position: fixed;  top: 88rpx;  background-color: #ffffff;}

2.3 逻辑代码

// index.jsPage({  heightArr: [],  //记录scroll-view滚动过程中距离顶部的高度  distance: 0,  data: {    appGroupList:[      {name:"分组01",children:[{"name":"测试0","url":"/images/bluetooth.png"},      {"name":"测试1","url":"/images/bluetooth.png"},      {"name":"测试2","url":"/images/bluetooth.png"},      {"name":"测试3","url":"/images/bluetooth.png"},      {"name":"测试4","url":"/images/bluetooth.png"},      {"name":"测试5","url":"/images/bluetooth.png"},      {"name":"测试6","url":"/images/bluetooth.png"},      {"name":"测试7","url":"/images/bluetooth.png"}]},      {name:"分组02",children:[{"name":"测试0","url":"/images/bluetooth.png"},      {"name":"测试1","url":"/images/bluetooth.png"},      {"name":"测试2","url":"/images/bluetooth.png"},      {"name":"测试3","url":"/images/bluetooth.png"},      {"name":"测试4","url":"/images/bluetooth.png"},      {"name":"测试5","url":"/images/bluetooth.png"},      {"name":"测试6","url":"/images/bluetooth.png"},      {"name":"测试7","url":"/images/bluetooth.png"}]},      {name:"分组03",children:[{"name":"测试0","url":"/images/bluetooth.png"},      {"name":"测试1","url":"/images/bluetooth.png"},      {"name":"测试2","url":"/images/bluetooth.png"},      {"name":"测试3","url":"/images/bluetooth.png"},      {"name":"测试4","url":"/images/bluetooth.png"},      {"name":"测试5","url":"/images/bluetooth.png"},      {"name":"测试6","url":"/images/bluetooth.png"},      {"name":"测试7","url":"/images/bluetooth.png"}]},      {name:"分组04",children:[{"name":"测试0","url":"/images/bluetooth.png"},      {"name":"测试1","url":"/images/bluetooth.png"},      {"name":"测试2","url":"/images/bluetooth.png"},      {"name":"测试3","url":"/images/bluetooth.png"},      {"name":"测试4","url":"/images/bluetooth.png"},      {"name":"测试5","url":"/images/bluetooth.png"},      {"name":"测试6","url":"/images/bluetooth.png"},      {"name":"测试7","url":"/images/bluetooth.png"}]},      {name:"分组05",children:[{"name":"测试0","url":"/images/bluetooth.png"},      {"name":"测试1","url":"/images/bluetooth.png"},      {"name":"测试2","url":"/images/bluetooth.png"},      {"name":"测试3","url":"/images/bluetooth.png"},      {"name":"测试4","url":"/images/bluetooth.png"},      {"name":"测试5","url":"/images/bluetooth.png"},      {"name":"测试6","url":"/images/bluetooth.png"},      {"name":"测试7","url":"/images/bluetooth.png"}]},    ],    itemWidth: wx.getSystemInfoSync().windowWidth / 4,    scrollAreaHeight:wx.getSystemInfoSync().windowHeight - 44,    float:false,    curSelectTab:0,    scrollToItem:null,    scrollTop: 0, //到顶部的距离    listGroupHeight:0,  },  onReady: function () {    this.cacluItemHeight();  },  scroll:function(e){    console.log("scroll:",e);    if(e.detail.scrollTop>=44){      this.setData({        float : true      })    } else if(e.detail.scrollTop<44) {      this.setData({        float : false      })    }    let scrollTop = e.detail.scrollTop;    let current = this.data.curSelectTab;    if (scrollTop >= this.distance) {      //页面向上滑动      //列表当前可视区域最底部到顶部的距离 超过 当前列表选中项距顶部的高度(且没有下标越界),则更新tab栏      if (current + 1 < this.heightArr.length && scrollTop >= this.heightArr[current]) {        this.setData({          curSelectTab: current + 1        })      }    } else {       //页面向下滑动      //如果列表当前可视区域最顶部到顶部的距离 小于 当前列表选中的项距顶部的高度,则切换tab栏的选中项      if (current - 1 >= 0 && scrollTop < this.heightArr[current - 1]) {        this.setData({          curSelectTab: current - 1        })      }    }    //更新到顶部的距离    this.distance = scrollTop;  },  tabClick(e){    this.setData({      curSelectTab: e.currentTarget.dataset.index,      scrollToItem: "v_"+e.currentTarget.dataset.index    })  },  //计算每一个item高度  cacluItemHeight() {    let that = this;    this.heightArr = [];    let h = 0;    const query = wx.createSelectorQuery();    query.selectAll('.list-group-item').boundinGClientRect()    query.exec(function(res) {      res[0].forEach((item) => {        h += item.height;        that.heightArr.push(h);      })      console.log(that.heightArr);      that.setData({        listGroupHeight: that.heightArr[that.heightArr.length - 1 ]      })    })  },})

在逻辑代码中最主要的有两个地方:

cacluItemHeight  计算列表中item的高度数组,并将最终计算的结果保存在 heightArr数组中。

heightArr数组中的每一项的值是在前一项的基础之上进行累加。

scroll 中判断当前的滚动方向,根据滚动判断当前的方向,然后根据滚动的距离设置当前选择的tab。

以上是“小程序如何实现列表滚动上下联动效果”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 小程序如何实现列表滚动上下联动效果

本文链接: https://www.lsjlt.com/news/302001.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 小程序如何实现列表滚动上下联动效果
    这篇文章主要为大家展示了“小程序如何实现列表滚动上下联动效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“小程序如何实现列表滚动上下联动效果”这篇文章吧。1、背景最近在做公司的一款小程序,其中有...
    99+
    2023-06-22
  • 微信小程序实现列表项上移下移效果
    本文实例为大家分享了微信小程序实现列表项上移下移的具体代码,供大家参考,具体内容如下 需要实现的效果:点击向下按钮时所选项内容和下一项内容交换,向上按钮则相反,删除按钮则点击时删除所...
    99+
    2022-11-13
  • Mybatis + js 实现下拉列表二级联动效果
     一、业务需求 实现省份与城市的二级联动 二、实现效果 三、代码实现 1. province_city.jsp 前端界面实现 <%@ page contentT...
    99+
    2022-11-12
  • 微信小程序实现多行文字滚动效果
    本文实例为大家分享了微信小程序实现多行文字滚动的具体代码,供大家参考,具体内容如下 wxml <view class="full" style="height:100%;o...
    99+
    2022-11-11
  • 微信小程序实现页面滚动监听效果
    抱歉,我无法提供具体代码示例。如果你想了解如何在微信小程序中实现页面滚动监听效果,可以通过以下步骤自己尝试:创建一个新的微信小程序项目。在 wxml 文件中编写页面结构,包括需要滚动监听的元素。在 wxss 文件中设置页面样式,包括滚动监听...
    99+
    2023-11-21
    页面滚动 微信小程序 监听效果
  • 使用微信小程序实现无限滚动效果
    标题:微信小程序实现无限滚动效果的实例摘要:本文介绍了如何使用微信小程序实现无限滚动效果,并提供了具体代码示例。通过本文,读者可以了解到如何利用微信小程序的组件和API来实现无限滚动效果,使页面在滚动到底部时能够自动加载更多内容。正文:准备...
    99+
    2023-11-21
    微信小程序 实现 无限滚动
  • 使用微信小程序实现文字滚动效果
    使用微信小程序实现文字滚动效果小程序作为一种新兴的应用开发方式,具备快速开发、跨平台、用户友好等特点,已经成为越来越多开发者的首选。在微信小程序中,实现文字滚动效果是一种常见的需求,本文将通过具体的代码示例,介绍如何使用微信小程序实现文字滚...
    99+
    2023-11-21
    微信小程序 实现 文字滚动
  • 小程序怎么实现图片左右滚动效果
    本篇内容介绍了“小程序怎么实现图片左右滚动效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  小程序图片左右滚动效果图:  wxml代码:...
    99+
    2023-06-26
  • 微信小程序如何实现顶部可滚动导航效果
    这篇文章给大家分享的是有关微信小程序如何实现顶部可滚动导航效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。需求是小程序做头部做导航分类的效果顶部用 scroll-view 组件...
    99+
    2022-10-19
  • vue如何实现文字上下滚动跑马灯效果
    Vue可以通过CSS动画和Vue的过渡效果来实现文字上下滚动的跑马灯效果。以下是一个示例代码:```vue{{ text }}...
    99+
    2023-08-08
    vue
  • 如何实现移动端Ionic App资讯上下循环滚动效果
    这篇文章给大家分享的是有关如何实现移动端Ionic App资讯上下循环滚动效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这里借助了jQuery库的选择器和动画函数,并且把jq...
    99+
    2022-10-19
  • 微信小程序实现菜单左右联动效果
    本文实例为大家分享了微信小程序实现菜单左右联动效果的具体代码,供大家参考,具体内容如下 原理 首先是获取数据,并且获取数据的长度(需要根据长度来计算元素的高度),通过遍历数据的内容通...
    99+
    2022-11-13
  • 微信小程序实现商品数据联动效果
    微信小程序实现商品数据联动 直接复制代码更改可以看出效果,然后根据自己想要进行调整 注: 以下商品图片用于测试,如有侵权请通知,会删除相关图片。 js部分: // pages/de...
    99+
    2022-11-13
    小程序商品数据联动 小程序联动
  • 微信小程序scroll-view实现左右联动效果
    微信小程序利用scroll-view实现左右联动,供大家参考,具体内容如下 点击左边的按钮时,右边可以跳动到指定的位置 首先要注意使用scroll-view竖屏滚动,需要给...
    99+
    2022-11-12
  • JQuery如何实现文字列表向上滚动
    这篇文章给大家分享的是有关JQuery如何实现文字列表向上滚动的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。jQuery实现代码如下:<script type="...
    99+
    2022-10-19
  • 微信小程序中如何实现左右滚动公告栏效果
    这篇文章主要介绍微信小程序中如何实现左右滚动公告栏效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码如下<view class='notice-wrap&...
    99+
    2022-10-19
  • 微信小程序实现分类菜单激活状态随列表滚动而自动切换效果详解
    目录view结构js部分属性解释说明注意 这里主要用到微信小程序提供的SelectorQuery获取页面节点信息实现,组件用的是微信小程序的scroll-view 逻辑就是获取右侧盒...
    99+
    2023-01-28
    小程序菜单激活状态 微信小程序菜单激活状态
  • Vue如何实现列表上下过渡效果
    这篇文章主要介绍Vue如何实现列表上下过渡效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!最终效果某列的数据由 X 位置上升到 Y 位置的过渡效果技术点 visibility: h...
    99+
    2022-10-19
  • 微信小程序如何实现今日头条导航栏滚动效果
    这篇文章给大家分享的是有关微信小程序如何实现今日头条导航栏滚动效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要,做一个和今日头条一样的导航栏,可以横行滚动,幸好再weu...
    99+
    2022-10-19
  • 微信小程序如何实现动画效果
    这篇文章主要为大家展示了“微信小程序如何实现动画效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序如何实现动画效果”这篇文章吧。一、什么是微信小程序?...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作