0

0

Swiper.js 实时响应自由滑动(FreeMode)过程中的动态效果实现

心靈之曲

心靈之曲

发布时间:2026-01-04 17:43:02

|

901人浏览过

|

来源于php中文网

原创

Swiper.js 实时响应自由滑动(FreeMode)过程中的动态效果实现

在 swiper 启用 `freemode` 时,原生事件(如 `settranslate`)仅在拖拽开始或瞬时触发,无法持续响应滑动过程;本文提供基于 `setinterval` 的高频率轮询方案,确保 `setimagepositions()` 在整个拖拽与惯性滚动期间持续执行,实现平滑的视差、位移与旋转动画。

Swiper 的 freeMode: true 模式下,用户可自由拖拽并产生惯性滚动,但 Swiper 不提供持续触发的生命周期事件(如 onDrag, onScrolling, onFreeModeTransitionEnd 等在较新版本中仍不覆盖全程)。因此,依赖 setTranslate 事件只能捕获离散的 translate 变更点,导致 setImagePositions() 调用不连贯,动画卡顿或中断。

为解决这一限制,核心思路是:在每次 setTranslate 触发时,启动一个高频定时器,在滑动活跃期持续调用渲染逻辑,并在合理超时后自动清理。该方案模拟了“实时监听”,兼顾性能与响应性。

天谱乐
天谱乐

唱鸭旗下AI音乐创作平台,为您提供个性化音乐创作体验!

下载

✅ 推荐实现方案(优化版)

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 slideLeft = $slide.offset().left;
    const slideWidth = $slide.width();
    const swiperLeft = $('.swiper').offset().left;
    const swiperWidth = $('.swiper').width();

    const centerOffset = slideLeft + slideWidth / 2 - (swiperLeft + swiperWidth / 2);
    const progressCenter = centerOffset / (swiperWidth + slideWidth); // 归一化 [-~0.5, ~0.5]

    // 应用复合变换:垂直偏移 + 旋转(基于中心进度)
    $inner.css(
      'transform',
      `translateY(${verticalAmount * progressCenter}%) rotate(${rotationAmount * progressCenter}deg)`
    );
  });
}

// 关键:监听 setTranslate,动态启停轮询
swiper.on('setTranslate', () => {
  // 清理上一次可能残留的定时器
  if (freeMoveInterval) {
    clearInterval(freeMoveInterval);
  }

  // 启动高频轮询(10ms 间隔 ≈ 100fps,足够流畅)
  let loopCount = 0;
  const maxLoops = 300; // 总执行上限(约 3 秒),防内存泄漏

  freeMoveInterval = setInterval(() => {
    if (loopCount++ >= maxLoops) {
      clearInterval(freeMoveInterval);
      freeMoveInterval = null;
      return;
    }
    setImagePositions();
  }, 10);
});

// 初始化渲染(避免首屏空白)
setImagePositions();

⚠️ 注意事项与最佳实践

  • 性能权衡:10ms 间隔适合大多数场景;若设备性能受限,可放宽至 16ms(≈60fps);切勿低于 5ms,易引发主线程阻塞。
  • 定时器安全:每次 setTranslate 都先 clearInterval,避免多个定时器并发,造成资源浪费或逻辑冲突。
  • 边界处理:progressCenter 已天然具备方向性(负值向左,正值向右),无需额外取反;示例中已简化计算逻辑,提升可读性与性能。
  • 兼容性提示:该方案兼容 Swiper v8/v9+,不依赖未公开 API,稳定可靠。
  • 进阶建议:如需更高精度,可结合 requestAnimationFrame 替代 setInterval(需自行封装帧同步逻辑),但需注意 rAF 在页面非激活时会暂停,而 setInterval 更可控。

通过该方案,你的视差动画将真正“跟随手指移动”,从拖拽起始、滑动中到惯性结束全程响应,显著提升交互沉浸感与专业度。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

476

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

476

2023.08.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5244

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

471

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

免费看漫画app合集_2026免费漫画app排行榜入口
免费看漫画app合集_2026免费漫画app排行榜入口

2026年免费漫画APP合集来啦!为你精心整理最新免费漫画APP排行榜入口,涵盖漫蛙漫画、香香漫画、包子漫画等热门神器,海量正版国漫、日漫、韩漫资源全免费阅读,无需付费解锁章节!高清全彩画质、每日极速更新,支持离线下载、智能推荐、条漫阅读模式,热血、恋爱、悬疑、古风、搞笑等题材应有尽有。无论你是追新番老粉还是小白漫迷,这里都能让你一站式追漫到爽,告别广告干扰和会员套路!赶紧点击入口下载体验,开启2026无限免费漫画之旅吧!

8

2026.01.07

热门下载

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

精品课程

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

共14课时 | 0.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.8万人学习

CSS教程
CSS教程

共754课时 | 18万人学习

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

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