0

0

Swiper.js 实现拖拽过程中持续执行动画函数的完整方案

心靈之曲

心靈之曲

发布时间:2026-01-04 18:24:08

|

712人浏览过

|

来源于php中文网

原创

Swiper.js 实现拖拽过程中持续执行动画函数的完整方案

在 swiper 启用 `freemode` 时,原生事件(如 `settranslate`)无法覆盖整个拖拽-滑动-惯性停止全过程;本文提供基于定时器的高精度实时响应方案,确保 `setimagepositions()` 在用户按住拖动、手指松开后的惯性滚动及最终静止前持续执行。

Swiper 的 freeMode: true 模式下,滑块行为由物理引擎模拟(如速度衰减、惯性滚动),但 Swiper 不提供 onDragStart → onDragEnd 或 onFreeMoveUpdate 这类连续触发的生命周期事件。因此,仅监听 setTranslate(仅在 translate 值变更时触发)会导致动画卡顿或中断——尤其在惯性滑动阶段,setTranslate 可能长时间不触发,而视觉效果却需持续更新。

✅ 正确解法:主动轮询 + 精准终止机制
我们通过 setInterval 高频调用 setImagePositions(),并在检测到滑动真正静止后自动清理定时器。关键在于:

  1. 每次 setTranslate 触发时重置并启动新定时器(避免多个定时器叠加);
  2. 设置合理超时阈值(如 maxLoop = 300 次 × 10ms ≈ 3s),覆盖最长惯性滚动时间;
  3. 高频刷新保障流畅性(10ms ≈ 100fps,远超人眼感知阈值);
  4. 手动清理避免内存泄漏(clearInterval + freeMoveInterval = null)。

以下是优化后的核心代码(已适配 Swiper 9+ 与 jQuery):

let parallaxAmount = 49;
let verticalAmount = 60;
let rotationAmount = 6;

// 全局定时器引用,用于动态管理
let freeMoveInterval = null;

const swiper = new Swiper('.swiper', {
  slidesPerView: 4,
  centeredSlides: true,
  spaceBetween: 20,
  freeMode: { enabled: true },
});

function setImagePositions() {
  $('.swiper-slide').each(function () {
    const $slide = $(this);
    const $inner = $slide.find('.swiper-slider-inner');

    // 计算元素相对于 Swiper 容器中心的归一化进度(-1 ~ 1)
    const slideCenter = $slide.offset().left + $slide.width() / 2;
    const containerCenter = $('.swiper').offset().left + $('.swiper').width() / 2;
    const progressCenter = (slideCenter - containerCenter) / ($('.swiper').width() + $slide.width());

    // 应用视差变换:垂直位移 + 旋转(支持负值,无需取反)
    $inner.css(
      'transform',
      `translateY(${verticalAmount * progressCenter}%) rotate(${rotationAmount * progressCenter}deg)`
    );
  });
}

// ✅ 关键:在 setTranslate 事件中启动/重置轮询
swiper.on('setTranslate', () => {
  // 清理上一个定时器(防重复启动)
  if (freeMoveInterval) {
    clearInterval(freeMoveInterval);
  }

  let loopCount = 0;
  const maxLoops = 300; // 覆盖典型惯性滚动时长(3秒内)

  freeMoveInterval = setInterval(() => {
    if (loopCount++ >= maxLoops) {
      clearInterval(freeMoveInterval);
      freeMoveInterval = null;
      return;
    }
    setImagePositions();
  }, 10); // 10ms 刷新间隔 → 平滑动画基础
});

// 页面加载后立即初始化一次位置
setImagePositions();

⚠️ 注意事项与最佳实践

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

下载
  • 性能权衡:10ms 间隔对现代设备足够流畅,若目标设备性能受限,可放宽至 16ms(≈60fps),但需同步增加 maxLoops 以保证覆盖时长。
  • 避免重复绑定:务必在 setTranslate 回调内先 clearInterval,否则快速连续拖拽会创建多个定时器,导致 CPU 占用飙升。
  • 兼容性提示:此方案适用于所有 Swiper 版本(v6+),且不依赖 observer: true 或 watchSlidesProgress(后者在 freeMode 下不可靠)。
  • 进阶优化:如需更高精度,可结合 swiper.touches 或 swiper.velocity(需 Swiper 10+)做动态终止判断,但定时器方案已满足 99% 场景需求。

通过该方案,setImagePositions() 将在用户手指按下→拖动→松开→惯性滚动→完全静止的全生命周期中持续执行,实现真正无缝的视差与动态变换效果。

相关专题

更多
jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

150

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

308

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

392

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

491

2023.12.04

jquery实现分页方法
jquery实现分页方法

在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

178

2023.12.06

jquery中隐藏元素是什么
jquery中隐藏元素是什么

jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

118

2024.02.23

jquery中什么是高亮显示
jquery中什么是高亮显示

jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

172

2024.02.23

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.8万人学习

CSS教程
CSS教程

共754课时 | 18.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号