0

0

实现 Swiper.js 在自由滑动(freeMode)过程中持续执行动画函数

花韻仙語

花韻仙語

发布时间:2026-01-04 18:39:20

|

108人浏览过

|

来源于php中文网

原创

实现 Swiper.js 在自由滑动(freeMode)过程中持续执行动画函数

本文介绍如何在 swiper 启用 freemode 时,让自定义动画函数(如 setimagepositions)从拖拽开始到完全停止全程实时响应,解决原生事件缺失导致的更新不连续问题。

Swiper.js 在启用 freeMode: { enabled: true } 时,不会持续触发 setTranslate 事件——该事件仅在每次内部位置更新时触发一次(例如手指刚按下或释放瞬间),而无法覆盖拖拽中高频重绘的需求。因此,依赖 setTranslate 会导致动画卡顿、视觉跳变,无法实现平滑的视差/旋转/位移效果。

为实现“拖拽中持续更新”,需采用主动轮询机制:在检测到滑动开始时启动定时器,在滑动结束后自动清理。Swiper 官方未提供 onDragStart / onDragging / onDragEnd 的 freeMode 专用钩子,因此我们利用 setTranslate 作为“滑动活跃信号”,在其回调中动态启停 setInterval。

GPTBots
GPTBots

企业级AI智能体构建平台

下载

✅ 核心实现逻辑

  • 使用 setInterval 每 10ms 执行一次 setImagePositions(),保障视觉流畅性(60fps 级别响应);
  • 设置最大循环次数(如 maxLoop = 300,对应约 3 秒超时),避免因异常未触发结束而造成内存泄漏;
  • 每次 setTranslate 触发时先清除旧定时器,再新建——确保仅存在一个活跃轮询;
  • 页面加载后立即调用一次 setImagePositions(),保证初始状态正确渲染。

? 优化建议与注意事项

  • 性能权衡:10ms 间隔适合多数场景;若设备性能受限,可放宽至 16ms(≈60fps)或 20ms;过高频率(如 1ms)无实际收益且增加主线程负担。
  • 精准终止:Swiper 本身不暴露“是否已静止”的 API,因此依赖超时机制是当前最可靠方案。如需更高精度,可结合 swiper.isEnd + swiper.progress 变化率做二次判断(进阶可选)。
  • jQuery 依赖提醒:示例使用 jQuery 进行 DOM 查询与样式操作。若项目已迁移到原生 JS,建议改用 swiper.slides 集合与 element.style.transform 替代,减少框架耦合。
  • CSS 性能提示:transform 属性已启用硬件加速,但频繁读取 .offset().left 和 .width() 会触发回流。如需极致性能,可缓存 swiper 容器尺寸并在 resize 事件中更新。

? 完整可运行代码(精简版)

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');
    const slideWidth = $slide.width();
    const swiperEl = $('.swiper')[0];
    const swiperRect = swiperEl.getBoundingClientRect();
    const slideRect = $slide[0].getBoundingClientRect();

    // 计算相对于 swiper 中心的归一化进度(-1 ~ 1)
    const centerOffset = slideRect.left + slideWidth / 2 - (swiperRect.left + swiperRect.width / 2);
    const progressCenter = centerOffset / (swiperRect.width + slideWidth);

    $inner.css(
      'transform',
      `translateY(${verticalAmount * progressCenter}%) rotate(${rotationAmount * progressCenter}deg)`
    );
  });
}

// 在 setTranslate 中启动/重置轮询
swiper.on('setTranslate', () => {
  if (freeMoveInterval) clearInterval(freeMoveInterval);

  let count = 0;
  const maxLoop = 300; // 超时保护:最多执行 300 次(3 秒)

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

// 初始化渲染
setImagePositions();
✅ 最终效果:无论用户快速甩动、缓慢拖拽,还是中途暂停,.swiper-slider-inner 元素均能实时响应位置变化,实现丝滑的 translateY + rotate 动画。

该方案已在 Swiper v9.4+ 环境下验证稳定,是目前兼容性最佳、侵入性最小的 freeMode 实时更新实践。

相关专题

更多
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

css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

506

2023.06.15

漫蛙2入口地址合集
漫蛙2入口地址合集

本专题整合了漫蛙2入口汇总,阅读专题下面的文章了解更多详细内容。

162

2026.01.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号