返回

惯性滚动 + 橡皮筋回弹效果:使用 transform 实现微信小程序的下拉回弹效果!

前端

惯性滚动 + 橡皮筋回弹效果,让您的微信小程序更加流畅

前言

在微信小程序开发中,滚动效果是不可或缺的交互元素。无论是列表、页面还是其他可滚动内容,流畅的滚动体验都可以极大地提升用户的使用感和满意度。其中,惯性滚动和橡皮筋回弹效果是两种非常受欢迎的滚动效果,它们可以为用户提供更加自然、流畅的操作体验。

什么是惯性滚动和橡皮筋回弹效果?

惯性滚动

惯性滚动是一种滚动效果,当用户手指离开屏幕后,滚动内容会继续以一定的初速度滚动一段距离,就像现实世界中物体运动的惯性一样。

橡皮筋回弹效果

橡皮筋回弹效果是一种滚动效果,当用户手指将滚动内容拉伸或压缩到一定程度时,内容会像橡皮筋一样弹回原位。

如何使用transform实现惯性滚动和橡皮筋回弹效果?

惯性滚动

// Scroll/index.wxml
<view class="scroll-container">
  <view class="scroll-content">
    ...您的内容...
  </view>
</view>

// Scroll/index.js
Page({
  data: {
    scrollHeight: 0
  },
  onLoad() {
    wx.getSystemInfo({
      success: (res) => {
        this.setData({
          scrollHeight: res.windowHeight
        })
      }
    })
  },
  onTouchStart(e) {
    this.startY = e.touches[0].pageY
  },
  onTouchMove(e) {
    let deltaY = e.touches[0].pageY - this.startY
    let scrollTop = this.scrollTop + deltaY
    if (scrollTop < 0) {
      scrollTop = 0
    } else if (scrollTop > this.data.scrollHeight) {
      scrollTop = this.data.scrollHeight
    }
    this.scrollTop = scrollTop
    this.setData({
      scrollTop: scrollTop
    })
  },
  onTouchEnd() {
    let velocity = this.startY - e.changedTouches[0].pageY
    let scrollTop = this.scrollTop + (velocity * velocity) / 2
    if (scrollTop < 0) {
      scrollTop = 0
    } else if (scrollTop > this.data.scrollHeight) {
      scrollTop = this.data.scrollHeight
    }
    this.scrollTop = scrollTop
    this.setData({
      scrollTop: scrollTop
    })
  }
})

橡皮筋回弹效果

// Scroll/index.wxml
<view class="scroll-container">
  <view class="scroll-content">
    ...您的内容...
  </view>
</view>

// Scroll/index.js
Page({
  data: {
    scrollHeight: 0,
    scrollTop: 0,
    rubberBandDistance: 100
  },
  onLoad() {
    wx.getSystemInfo({
      success: (res) => {
        this.setData({
          scrollHeight: res.windowHeight
        })
      }
    })
  },
  onTouchStart(e) {
    this.startY = e.touches[0].pageY
  },
  onTouchMove(e) {
    let deltaY = e.touches[0].pageY - this.startY
    let scrollTop = this.scrollTop + deltaY
    if (scrollTop < 0) {
      scrollTop = 0
    } else if (scrollTop > this.data.scrollHeight) {
      scrollTop = this.data.scrollHeight
    }
    if (scrollTop < this.data.rubberBandDistance) {
      scrollTop = scrollTop * (1 - (scrollTop / this.data.rubberBandDistance))
    } else if (scrollTop > this.data.scrollHeight - this.data.rubberBandDistance) {
      scrollTop = this.data.scrollHeight - ((scrollTop - (this.data.scrollHeight - this.data.rubberBandDistance)) * (1 - ((scrollTop - (this.data.scrollHeight - this.data.rubberBandDistance)) / this.data.rubberBandDistance)))
    }
    this.scrollTop = scrollTop
    this.setData({
      scrollTop: scrollTop
    })
  },
  onTouchEnd() {
    let velocity = this.startY - e.changedTouches[0].pageY
    let scrollTop = this.scrollTop + (velocity * velocity) / 2
    if (scrollTop < 0) {
      scrollTop = 0
    } else if (scrollTop > this.data.scrollHeight) {
      scrollTop = this.data.scrollHeight
    }
    if (scrollTop < this.data.rubberBandDistance) {
      scrollTop = scrollTop * (1 - (scrollTop / this.data.rubberBandDistance))
    } else if (scrollTop > this.data.scrollHeight - this.data.rubberBandDistance) {
      scrollTop = this.data.scrollHeight - ((scrollTop - (this.data.scrollHeight - this.data.rubberBandDistance)) * (1 - ((scrollTop - (this.data.scrollHeight - this.data.rubberBandDistance)) / this.data.rubberBandDistance)))
    }
    this.scrollTop = scrollTop
    this.setData({
      scrollTop: scrollTop
    })
  }
})

结语

惯性滚动和橡皮筋回弹效果是两种非常实用的滚动效果,可以极大地提升用户在使用微信小程序时的体验感。通过本文介绍的方法,您就可以轻松地在自己的小程序中实现这些效果,让您的应用程序更加流畅、更加用户友好。