当前位置:首页 > JavaScript

js实现下拉刷新

2026-04-03 21:52:29JavaScript

实现下拉刷新的基本思路

监听触摸事件,判断用户下拉距离是否达到阈值,触发刷新操作后恢复原位。核心是通过touchstarttouchmovetouchend事件实现交互逻辑。

监听触摸事件

在容器元素上绑定三个触摸事件:

const container = document.getElementById('refreshContainer');
let startY = 0;
let currentY = 0;

container.addEventListener('touchstart', (e) => {
  startY = e.touches[0].clientY;
});

container.addEventListener('touchmove', (e) => {
  currentY = e.touches[0].clientY;
  const distance = currentY - startY;

  // 只有向下滑动且内容在顶部时才触发
  if (distance > 0 && window.scrollY === 0) {
    e.preventDefault();
    updateUI(distance);
  }
});

container.addEventListener('touchend', () => {
  if (currentY - startY > 100) { // 阈值设为100px
    triggerRefresh();
  }
  resetUI();
});

更新UI状态

根据下拉距离动态改变UI元素样式:

js实现下拉刷新

function updateUI(distance) {
  const maxDistance = 150;
  const progress = Math.min(distance / maxDistance, 1);

  // 旋转箭头图标
  arrowIcon.style.transform = `rotate(${progress * 180}deg)`;

  // 控制提示文本
  if (distance > 100) {
    hintText.textContent = '释放刷新';
  } else {
    hintText.textContent = '下拉刷新';
  }

  // 限制最大下拉距离
  container.style.transform = `translateY(${Math.min(distance, maxDistance)}px)`;
}

触发刷新与重置

执行刷新操作并恢复初始状态:

function triggerRefresh() {
  loadingIcon.style.display = 'block';
  arrowIcon.style.display = 'none';
  hintText.textContent = '加载中...';

  // 模拟异步请求
  setTimeout(() => {
    refreshData().then(() => {
      resetUI();
    });
  }, 1000);
}

function resetUI() {
  container.style.transform = 'translateY(0)';
  loadingIcon.style.display = 'none';
  arrowIcon.style.display = 'block';
  hintText.textContent = '下拉刷新';
  startY = 0;
  currentY = 0;
}

性能优化建议

使用CSS硬件加速减少卡顿:

js实现下拉刷新

#refreshContainer {
  will-change: transform;
  transition: transform 0.3s cubic-bezier(0.1, 0.7, 0.1, 1);
}

添加防抖处理避免频繁触发:

let isRefreshing = false;

function triggerRefresh() {
  if (isRefreshing) return;
  isRefreshing = true;

  // ...原有逻辑

  setTimeout(() => {
    refreshData().then(() => {
      isRefreshing = false;
      resetUI();
    });
  }, 1000);
}

完整组件示例

创建一个可复用的下拉刷新组件:

class PullToRefresh {
  constructor(container, onRefresh) {
    this.container = container;
    this.onRefresh = onRefresh;
    this.init();
  }

  init() {
    this.setupDOM();
    this.bindEvents();
  }

  setupDOM() {
    this.container.innerHTML = `
      <div class="refresh-control">
        <svg class="arrow-icon" viewBox="0 0 24 24">...</svg>
        <svg class="loading-icon" viewBox="0 0 24 24">...</svg>
        <span class="hint-text">下拉刷新</span>
      </div>
      <div class="content">${this.container.innerHTML}</div>
    `;
  }

  bindEvents() {
    // 事件绑定逻辑...
  }

  // 其他方法实现...
}

使用时只需初始化:

new PullToRefresh(document.getElementById('list'), fetchNewData);

标签: js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…