舒服的小程序吸顶动画

news/2024/7/20 1:15:10 标签: javascript, 小程序, css

前言

今天想优化下用户体验:给小程序商品列表页顶部的标签栏增加个吸顶动画。逻辑是检测用户下滑行为时不吸顶,上滑时吸顶,标签栏未滑离视窗时不处理。并对滑动的处理方法增加节流处理,以优化性能。

列表标签的吸顶动画

一、处理页面滚动

1.1 页面逻辑

页面page_name.js

// ...
onPageScroll(e){
	this.selectComponent('#goods_list').data._handleScroll(e)
}
// ...

因为业务需要,商品列表goods_list被我封装成组件形式,所以需要调用组件内的方法来处理。可能有人好奇,为什么组件方法名前有一般用来表示私有方法的下划线_,却还被外部调用,后面会进行说明。

1.2 商品列表逻辑

商品列表组件goods_list.js

import utils from '../../utils/utils'
const HEIGHT_TAB = 70 // 标签栏的高度
// ...
options: {
    pureDataPattern: /^_/, // 纯数据字段的正则
},
data:{
	_scrollTop:0, // 页面滚动的距离
	_handleScroll:_ =>{}, // 防抖处理后的
	isSticky:false, // 标签栏是否是吸顶状态
},

lifeTimes(){
  attached() {
    // 组件挂载时,设置处理滚动的函数
    this._setHandleScroll()
  },
},
methods(){
  _setHandleScroll() {
      this.data._handleScroll = utils.throttle(
        e => {
          const nextScrollTop = e.scrollTop
          const prevScrollTop = this.data._scrollTop
          if (nextScrollTop > prevScrollTop) {
            this.setData({
              isSticky: false,
            })
          } else if (nextScrollTop < prevScrollTop && nextScrollTop > HEIGHT_TAB) {
            this.setData({
              isSticky: true,
            })
          }
          this.setData({
            _scrollTop: nextScrollTop,
          })
        },
        200,
        this
      )
  },
},
// ...  

1.3 节流逻辑

utils.js

/**
   * 
   * @param fn 原函数
   * @param gapTime 间隔时间
   * @param context 上下文
   */
  throttle(fn, gapTime, context) {
    let prev = Date.now()
    return function () {
      let args = arguments
      let now = Date.now()
      if (now - prev > gapTime) {
        prev = now
        fn.apply(context, args)
      }
    }
  }

tips:

  1. 小程序中,因为页面、组件上下文的关系,需要在方法内部设置防抖函数,如上文所示:attached时,赋值_handleScroll为处理函数(这里可以进一步展开讲,关于小程序的上下文和防抖节流的原理,后面可能会出一篇);
  2. 为了性能考虑,对于不需要与渲染相关的data,用pureDataPattern匹配这些data,以减小页面的重绘repaint与回流reflow,在我的项目中此类data都是以_开头的,所以出现了前文中外部调用组件_开头方法的问题

二、吸顶动画处理

goods_list.wxml

<!-- tab栏 -->
<view class="goods-tab {{isSticky ? 'sticky' :''}}">
  <view
    wx:for="{{tabList}}"
    wx:key="sortStyle"
    class="item {{sortStyle === item.sortStyle ? 'active':''}}"
    bind:tap="clickTabItem"
    data-sort-css">style="{{item.sortStyle}}"
  >
    <view class="title">{{item.title}}</view>
    <view class="sub-title">{{item.subTitle}}</view>
  </view>
</view>

goods_list.scss:

.goods-tab {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 30rpx 24rpx 20rpx 24rpx;
  background: #f8f8f8;
  transition: all 0.2s;
  z-index: 1003;
  position: sticky; // 动作前后position保持一致,有相同属性的变化才能有过渡动画
  top: -146rpx; // 标签栏离开视窗时的位置
  width: 750rpx;
  &.sticky {
    position: sticky;
    top: 0rpx;
  }
  // ...
}


http://www.niftyadmin.cn/n/913963.html

相关文章

js 函数的某些内容、递归函数、传参、行参、实参乱七八糟的、、、

函数语法&#xff1a;function 函数名() 函数名&#xff1a;自己取的&#xff0c;定义{ 函数代码; 函数代码&#xff1a;要执行的代码} 匿名函数&#xff1a;var aa function&#xff08;&#xff09;{ }直接把函数赋值给变量aa&#xff0c;调用的时候&#xff1a;aa&#xff…

fedora 31 ffmpeg Cannot open display :0.0, error 1. :0.0: Input/output error

出错指令 [yeqianglocalhost tmp]$ ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg ffmpeg version 4.2.3 Copyright (c) 2000-2020 the FFmpeg developersbuilt with gcc 9 (GCC)configuration: --prefix/usr --bindir/usr/bin --datadir/usr/share/…

奇奇怪怪的npm依赖安装出错之死马当活马医大法

没有更好的包管理工具出现前应该会持续更新~~ 删除node_modules文件夹换源&#xff1a; npm config set registry https://registry.npm.taobao.orgyarn config set registry https://registry.npm.taobao.orgnode-sass: Command failed 的报错&#xff1a;将 sass-binary-si…

代码存放样例

protectedoverridevoidRenderContents(HtmlTextWriter output){  //使用默认逻辑来呈现子控件&#xff0c;那么一定要调用基类中的方法。  base.Render(output);}转载于:https://www.cnblogs.com/miniflyfish/archive/2006/08/08/471142.html

ubuntu kylin fedora tigervnc远程桌面安装配置

kylin上安装服务端 sudo apt install tigervnc-standalone-server tigervnc-common -y 启动 fedora上安装客户端 sudo dnf install tigervnc -y 连接远程服务器 vncviewer ip:5901 收入密码后&#xff0c;登陆到远程服务器

课程作业03-你已经创建了多少个对象?

使用类的静态字段和构造函数&#xff0c;我们可以跟踪某个类所创建对象的个数。请写一个类&#xff0c;在任何时候都可以向它查询“你已经创建了多少个对象&#xff1f;” 源程序代码&#xff1a; public class Count { public static void main(String[] args) { C objnew C()…

背景图长宽100%,也能显示不全?

前言 前两天进行业务开发时&#xff0c;用到一个「券样式」的背景图(background-image)&#xff0c;即下图的「返利&#xffe5;1.30」&#xff1a; 容器的宽度会根据文字内容自适应&#xff0c;代码如下&#xff1a; css: .coupon-like {padding: 8rpx 10rpx;background-s…

女朋友

转载于:https://www.cnblogs.com/libra163/archive/2006/08/11/474215.html