使用swiper插件,全屏翻页时,某一页的页面长度超过900px,嵌套问题解决

​ 问题描述:在使用swiper进行全屏翻页效果制作时,某页的高度超过900px,且不固定。

结果在使用鼠标滚轴翻页过程中,只会进行swiper-slide切换,而大于屏幕的swiper-slide部分却无法显示

一、解决思路

  • html部分

    1. 搭建好swiper初始框架:swiper-container>swiper-wrapper>及多个swiper-slide (此时外层container为1)
    2. 在大于屏幕宽度的swiper-slide下级,嵌套swiper-container>swiper-wrapper>一个swiper-slide (此时嵌套container为2)
  • js部分

    • 参照js代码注释,使用swiper中回调函数。

      1. 首先判断是否页面滑动到长度大于屏幕的swiper-slide中;

        如果是,关闭外层swiper-container的鼠标控制(此时swiper-container2中的页面可以由鼠标滚轴滑动)

      2. 然后使用swiper回调函数,获取swiper-container2中是否滑动到顶部或者底部。由此控制swiper-container1中的鼠标滚轴。

二、代码

1、css部分

    html, body { position: relative;height: 100%;}
    .swiper-container {width: 100%;height: 100%;}
	#swiper-container2 .swiper-slide {font-size: 18px;height: auto;box-sizing: border-box;display:block;
        line-height:100px; background: #4390EE;color: #fff; }

2、html部分

	<div class="swiper-container" id="swiper-container1">
			<div class="swiper-wrapper"">
				<div class=" swiper-slide" style="height: 911px;">Slide 1</div>
			<div class="swiper-slide" style="height: 911px;">
				<div class="swiper-container " id="swiper-container2">
					<div class="swiper-wrapper">
						<div class="swiper-slide">
							<h4>一段很长的内容</h4>
							<p><br><br><br><br><br><br></p>
							<p><br><br><br><br><br><br></p>
							<p><br><br><br><br><br><br></p>
						</div>
					</div>
					<div class="swiper-scrollbar">
						<div class="swiper-scrollbar-drag"></div>
					</div>
					<span class="swiper-notification" aria-live="assertive" aria-atomic="true"></span>
				</div>
			</div>
			<div class="swiper-slide" style="height: 911px;">Slide 3</div>
			<div class="swiper-slide" style="height: 911px;">Slide 4</div>
			<div class="swiper-slide" style="height: 911px;">Slide 5</div>
		</div>
		<!-- Add Pagination -->
		<div class="swiper-pagination">
			<span class="swiper-pagination-bullet"></span>
			<span class="swiper-pagination-bullet"></span>
			<span class="swiper-pagination-bullet"></span>
			<span class="swiper-pagination-bullet"></span>
			<span class="swiper-pagination-bullet"></span></div>
		<span class="swiper-notification" aria-live="assertive" aria-atomic="true"></span>
		</div>

3、js部分

window.onload = function() {
				var mySwiper1 = new Swiper('#swiper-container1', {
					direction: 'vertical',  //页面滑动的方向
					mousewheel: true,   //开启鼠标滚轮控制翻页
					pagination: {
						el: '.swiper-pagination',
						clickable: true, //开启点击分页器进行跳转
					},
					on: {  //slideChangeTransitionEnd回调函数,swiper从一个slide过渡到另一个slide结束时执行。
                        	//this.mousewheel.disable()禁止鼠标滚轴控制。
                        	//此时是当进入页面2时,关闭container1的鼠标滚轴控制
						slideChangeTransitionEnd: function() {
							if (this.activeIndex == 1) {this.mousewheel.disable();}
						},
					}
				});

				var swiper = new Swiper('#swiper-container2', {
					direction: 'vertical',
					slidesPerView: 'auto',  //设置slider容器能够同时显示的slides数量
					freeMode: true,  //动量反弹。slides通过惯性滑动到边缘时,无法反弹。
					scrollbar: {el: '.swiper-scrollbar',}, //为Swiper增加滚动条。
					mousewheel: true,
                    //当在container2中滚到最下方,或者最上面的时候都会开启container1的鼠标滚轴控制
					on: {reachEnd: function() { //回调函数,当Swiper切换到最后一个Slide时执行(长页面滑动到底部的时候)
                        mySwiper1.mousewheel.enable();//开启container1的滚轴控制
                    },
						reachBeginning: function() {//回调函数,Swiper切换到初始化位置时执行
                            mySwiper1.mousewheel.enable();}
					}
				});
			}

swiper版本号:5.4.5 整理日期:2020/10/14

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Vue 项目中使用多个 Swiper 插件可能会导致它们之间互相影响的问题,这是因为它们共享了一些全局变量和事件,导致冲突。为了避免这种情况,你可以使用 Swiper 的 `destroy()` 方法来销毁每个 Swiper 实例,然后再重新初始化。 在 Vue 中,你可以在组件的 `beforeDestroy()` 生命周期钩子中调用 `destroy()` 方法来销毁 Swiper 实例。这样可以确保在组件销毁之前,所有的 Swiper 实例都被正确地销毁了。同,在组件的 `mounted()` 生命周期钩子中,你可以重新初始化 Swiper 实例。 以下是一个示例代码: ```vue <template> <div> <div ref="swiper1" class="swiper-container"> <div class="swiper-wrapper"> <div class="swiper-slide">Slide 1</div> <div class="swiper-slide">Slide 2</div> <div class="swiper-slide">Slide 3</div> </div> </div> <div ref="swiper2" class="swiper-container"> <div class="swiper-wrapper"> <div class="swiper-slide">Slide 1</div> <div class="swiper-slide">Slide 2</div> <div class="swiper-slide">Slide 3</div> </div> </div> </div> </template> <script> import Swiper from 'swiper'; export default { mounted() { // 初始化 Swiper 实例 this.initSwiper(); }, beforeDestroy() { // 销毁 Swiper 实例 this.destroySwiper(); }, methods: { initSwiper() { // 初始化 Swiper 实例 this.swiper1 = new Swiper(this.$refs.swiper1, {/* options */}); this.swiper2 = new Swiper(this.$refs.swiper2, {/* options */}); }, destroySwiper() { // 销毁 Swiper 实例 this.swiper1.destroy(); this.swiper2.destroy(); } } } </script> ``` 在这个示例中,我们在组件的 `mounted()` 生命周期钩子中初始化了两个 Swiper 实例,并在 `beforeDestroy()` 生命周期钩子中销毁了它们。这样可以确保在组件销毁之前,所有的 Swiper 实例都被正确地销毁了。在实际使用中,你可以根据需要添加更多的 Swiper 实例,并在相应的生命周期钩子中进行初始化和销毁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值