swiper一个页面多个轮播

本文详细解析了使用Swiper实现多个轮播图时出现的控制冲突问题,通过调整类名和初始化参数,成功实现了独立控制每个轮播图,避免了相互影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常遇到来寻找这个的都是因为轮播不受控制,我们就来看一看用swiper轮播的坑

<!-- 第一个轮播-->
			<div class="lunbo">
				<div class="swiper-container banner_swiper1">
					<div class="swiper-wrapper">
						<div class="swiper-slide">
							<img src="image/benqiang_img03.png" alt="">
						</div>
						<div class="swiper-slide">
							<img src="image/benqiang_img03.png" alt="">
						</div>
						<div class="swiper-slide">
							<img src="image/benqiang_img03.png" alt="">
						</div>
					</div>
					<div class="swiper-pagination"></div>
				</div>
			</div>
			
<!-- 第二个轮播-->
			
			<div class="lunbo1">
					<div class="swiper-container banner_swiper2">
						<div class="swiper-wrapper">
							<div class="swiper-slide">
								<img src="image/benqiang_cat01.jpg" alt="">
							</div>
							<div class="swiper-slide">
								<img src="image/benqiang_cat02.jpg" alt="">
							</div>
							<div class="swiper-slide">
								<img src="image/benqiang_cat03.jpg" alt="">
							</div>
						</div>	
					</div>
					<div class="swiper-button-prev z_anniu1 swiper-button-white"></div>
    				<div class="swiper-button-next y_anniu1 swiper-button-white"></div>
				</div>
				
<!-- 第三个轮播-->

				<div class="lunbo2">
					<div class="swiper-container banner_swiper3">
						<div class="swiper-wrapper">
							<div class="swiper-slide">
								<img src="image/benqiang_zhizi01.jpg" alt="">
							</div>
							<div class="swiper-slide">
								<img src="image/benqiang_zhizi02.jpg" alt="">
							</div>
							<div class="swiper-slide">
								<img src="image/benqiang_zhizi03.jpg" alt="">
							</div>
							<div class="swiper-slide">
								<img src="image/benqiang_zhizi04.jpg" alt="">
							</div>
							<div class="swiper-slide">
								<img src="image/benqiang_zhizi05.jpg" alt="">
							</div>
						</div>	
					</div>
					<div class="swiper-button-prev z_anniu2 swiper-button-white"></div>
    				<div class="swiper-button-next y_anniu2 swiper-button-white"></div>
				</div>
			</div>
var mySwiper1 = new Swiper('.banner_swiper1', {
	autoplay: 5000,//可选选项,自动滑动
	autoplayDisableOnInteraction : false,
	loop : true,
	pagination : '.swiper-pagination',
	paginationClickable :true,
	paginationBulletRender: function (swiper, index, className) {
      return '<span class="' + className + '">' + (index + 1) + '</span>';
  	}
})
var mySwiper2 = new Swiper('.banner_swiper2', {
	loop : true,
	slidesPerView : 3,
	slidesPerGroup : 1,
	prevButton:'.z_anniu1',
	nextButton:'.y_anniu1',
})
var mySwiper3 = new Swiper('.banner_swiper3', {
	loop : true,
	slidesPerView : 5,
	prevButton:'.z_anniu2',
	nextButton:'.y_anniu2',
})

直接上代码来分析一下,当时我遇到的问题就是有3个轮播,开始是我还在弄第二个就出现了问题,给第二个轮播设置左右按钮的时候并不会显示在第二个轮播上面也不是控制第二个的,而是显示和控制在第一个轮播上面,然而改了类名后可以实现控制第二个了,但是又有问题,他会连同第一个一起控制,这个时候就单独的添加一个类名,但是必须要加上以前的"swiper-container"这个类名,不然还是没有用,所以就单独给出不同的类名控制每一个,这样不管怎么设置都不会起冲突,最好的话把js部分var mySwiper1, 2,3,不同的名字看完赶紧去试试吧

### 实现两个 Swiper 轮播图同步切换或联动效果 要实现两个 Swiper 轮播图之间的联动效果,可以通过监听 `slideChange` 事件并调用 `slideTo` 方法来完成。具体来说,当一个 Swiper 的当前活动索引发生变化时,通过该索引控制另一个 Swiper 同步移动到相同位置。 以下是详细的实现方式: #### 使用原生 JavaScript 配置 Swiper 如果仅使用原生 JavaScript 来配置 Swiper,则可以直接绑定 `slideChange` 事件,并在回调函数中触发目标 Swiper 的 `slideTo` 方法[^1]。 ```javascript var swiper1 = new Swiper('.swiper-container1', { direction: 'horizontal', slidesPerView: 1, }); var swiper2 = new Swiper('.swiper-container2', { direction: 'horizontal', slidesPerView: 1, }); // 绑定 slideChange 事件 swiper1.on('slideChange', function () { swiper2.slideTo(swiper1.activeIndex); // 将第二个 Swiper 移动到第一个 Swiper 当前索引处 }); swiper2.on('slideChange', function () { swiper1.slideTo(swiper2.activeIndex); // 将第一个 Swiper 移动到第二个 Swiper 当前索引处 }); ``` 上述代码实现了双向联动的效果,即无论哪个 Swiper 发生滑动变化,都会使另一个 Swiper 同步更新其显示的内容。 --- #### Vue 中的实现方案 在 Vue.js 环境下,由于组件生命周期的影响,可能会遇到初始化顺序问题导致功能失效的情况[^3]。为了避免这种情况,建议采用以下优化策略之一: ##### 方案一:延迟初始化 通过设置短时间延时(如 500ms),等待 DOM 完全渲染后再初始化 Swiper 对象。这种方法虽然简单有效,但并非最佳实践。 ```javascript export default { data() { return { swiper1: null, swiper2: null, }; }, mounted() { setTimeout(() => { this.initSwipers(); }, 500); }, methods: { initSwipers() { this.swiper1 = new Swiper('.swiper-container1', { /* 参数 */ }); this.swiper2 = new Swiper('.swiper-container2', { /* 参数 */ }); this.swiper1.on('slideChange', () => { this.swiper2.slideTo(this.swiper1.activeIndex); }); this.swiper2.on('slideChange', () => { this.swiper1.slideTo(this.swiper2.activeIndex); }); } } }; ``` ##### 方案二:动态创建 Swiper 实例 利用 `$nextTick()` 或者观察数据的变化,在确保 DOM 已经完全挂载之后再实例化 Swiper 对象。这种方式更加优雅且可靠。 ```javascript export default { data() { return { swiper1: null, swiper2: null, }; }, mounted() { this.$nextTick(() => { this.initSwipers(); }); }, methods: { initSwipers() { this.swiper1 = new Swiper('.swiper-container1', {}); this.swiper2 = new Swiper('.swiper-container2', {}); this.swiper1.on('slideChange', () => { this.swiper2.slideTo(this.swiper1.activeIndex); }); this.swiper2.on('slideChange', () => { this.swiper1.slideTo(this.swiper2.activeIndex); }); } } }; ``` --- #### 多级联动场景下的扩展应用 对于更复杂的多级联动需求,例如大疆官网中的产品展示页面使用轮播效果[^2],可以考虑引入多个 Swiper 并分别定义它们的关系链路。例如,三个 Swiper 可能形成如下关系: - **Swiper A → Swiper B** - **Swiper B → Swiper C** 在这种情况下,只需依次为每一对关联的 Swiper 添加类似的逻辑即可。 --- ### 性能优化提示 为了提升用户体验和性能表现,请注意以下几点: 1. 如果 Swiper 数据量较大,可启用虚拟列表模式 (`virtual`) 减少内存占用。 2. 设置合理的懒加载参数 (lazy loading),减少不必要的图片资源请求。 3. 在销毁组件时记得清理掉已注册的事件监听器,防止潜在的记忆泄漏问题。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值