swiper一屏切换,内部滚动不影响slide切换

移动端Swiper切换与表格滚动冲突解决

前言

我在做移动端项目是,需要用到swiper 切换展示,但是遇到一个恼火的,有个swiper-slide 页有表格数据,内容太多了需要表格内滚动。在网上找了很多方法都不能解决,最后用不是很好的方法但能解决切换和表格内滚动不冲突。

先看我在网上找过的方法
  1. 事件阻止默认行为
    在需要内部滚动的地方加入 e.preventDefault(); 效果 无用
document.querySelector('.t-cont').addEventListener('touchmove', function(e) {
    e.preventDefault();
}, { passive: false });
  1. 设置Swiper 的 noSwiping 选项
    只能控制当页slide禁止滚动,如果后面还有slide就 无用 像以下代码在第二个swiper-slide中加入了noSwipingClass,但是我后面还有两个swiper-slide,这里禁用了切换,怎么切换下一页呢,也许有办法,但比较麻烦
<div class="swiper">
	<div class="swiper-wrapper">
		<div class="swiper-slide" style="background: url(/material/img/bg2.jpg) no-repeat;background-size: 100%;">
			<p>第一页</p>
		</div>
		<div class="swiper-slide pannel-c" style="background: url(/material/img/bg3.jpg) no-repeat;background-size: 100%;">
	    	<p>第二页</p> 
		</div>
		<div class="swiper-slide" style="background: url(/material/img/bg4.jpg) no-repeat;background-size: 100%;">
            <p>第三页</p>
    	</div>
        <div class="swiper-slide" style="background: url(/material/img/bg5.jpg) no-repeat;background-size: 100%;">
            <p>第四页</p> 
        </div>
    </div>
</div>
var swiper = new Swiper('.swiper-container', {
    direction: 'vertical',
    noSwiping: true, // 禁用滑动
    noSwipingClass: 'pannel-c' // 指定禁用滑动的Slide类名
});
  1. 还看到有说swiper嵌套的,好像可以,但是对于每个swiper-slide 的height都是100vh 不起作用。相关文章,文章链接
我自己写的

我是把要滚动的内容提出去当做一个页面,用iframe引入,这样表格内容是归另一个页面管,不属于swiper。所以表格内滚动不影响swiper切换
预览链接

<!-- index.html -->
<!DOCTYPE html> 
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>swiper slide内滚动</title>
    <link rel="stylesheet" href="http://39.104.18.107/tool/swiper10.0.4.min.css">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .main {
            max-width: 750px;
            min-width: 320px;
            width: 100%;
            margin: 0 auto;
            font-size: .32rem;
        }
        .swiper-slide img {
            width: 100%;
            object-fit: cover;
        }
        .swiper-slide p {
            position: relative;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            margin: 0 auto;
            text-align: center;
            color: #5a5a5a;
            font-weight: bold;
            font-size: 1rem;
        }
        .swiper-wrapper {
            width: 100%;
            height: 100vh;
        }
        .my-iframe {
            position: relative;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
        }
    </style>
    <script>
        (function (doc, win) {
            var docEl = doc.documentElement,
                resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
                recalc = function () {
                    var clientWidth = docEl.clientWidth;
                    if (!clientWidth) return;
                    if (clientWidth >= 750) {
                        docEl.style.fontSize = '100px';
                    } else {
                        docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
                    }
                };

            if (!doc.addEventListener) return;
            win.addEventListener(resizeEvt, recalc, false);
            doc.addEventListener('DOMContentLoaded', recalc, false);
        })(document, window);
    </script>
</head>
<body>
    <section class="main">
        <div class="swiper">
            <div class="swiper-wrapper">
                <div class="swiper-slide" style="background: url(/material/img/bg2.jpg) no-repeat;background-size: 100%;">
                    <p>第一页</p>
                </div>
                <div class="swiper-slide" style="background: url(/material/img/bg2.jpg) no-repeat;background-size: 100%;">
                    <iframe class="my-iframe" src="tables.html" style="width: 5.6rem;height: 55vh; "
                        frameborder="0"></iframe> 
                </div>
                <div class="swiper-slide" style="background: url(/material/img/bg3.jpg) no-repeat;background-size: 100%;">
                    <p>第二页</p>
                </div>
                <div class="swiper-slide" style="background: url(/material/img/bg4.jpg) no-repeat;background-size: 100%;">
                    <p>第三页</p>
                </div>
                <div class="swiper-slide" style="background: url(/material/img/bg5.jpg) no-repeat;background-size: 100%;">
                    <p>第四页</p> 
                </div>
            </div>
        </div>
    </section>
    <script src="/tool/jquery-2.0.3.min.js"></script>
    <script src="/tool/swiper10.0.4.min.js"></script>
    <script>
        var swiper = new Swiper('.swiper', {
            direction: 'vertical',
        });
    </script>
</body>
</html>
<!-- tables.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        .tables {
            background: #ffffff;
            overflow: auto;
        }
        table,
        th,
        td {
            border: 1px solid #000;
            border-collapse: collapse;
            text-align: center;
            padding: 4px 6px;
            font-size: .32rem;
        }
    </style>

    <script>
        (function (doc, win) {
            var docEl = doc.documentElement,
                resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
                recalc = function () {
                    var clientWidth = docEl.clientWidth;
                    if (!clientWidth) return;
                    if (clientWidth >= 750) {
                        docEl.style.fontSize = '100px';
                    } else {
                        docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
                    }
                };

            if (!doc.addEventListener) return;
            win.addEventListener(resizeEvt, recalc, false);
            doc.addEventListener('DOMContentLoaded', recalc, false);
        })(document, window);
    </script>
</head>

<body>
    <div class="tables">
        <table style="width: 100%;">
            <tr>
                <th style="width: 42%;">省份</th>
                <th style="width: 58%;">城市</th>
            </tr>
            <tbody>
                <tr>
                    <td>北京市</td>
                    <td>北京市</td>
                </tr>
                <tr>
                    <td>天津市</td>
                    <td>天津市</td>
                </tr>
                <tr>
                    <td>上海市</td>
                    <td>上海市</td>
                </tr>
                <tr>
                    <td>重庆市</td>
                    <td>重庆市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>哈尔滨市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>齐齐哈尔市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>黑龙江省</td>
                    <td>江市</td>
                </tr>
                <tr>
                    <td>内蒙古自治区</td>
                    <td>呼和浩特市</td>
                </tr>
                <tr>
                    <td>内蒙古自治区</td>
                    <td>包头市</td>
                </tr>
                <tr>
                    <td>内蒙古自治区</td>
                    <td>乌海市</td>
                </tr>
                <tr>
                    <td>内蒙古自治区</td>
                    <td>赤峰市</td>
                </tr>
            </tbody>
        </table>
    </div>
</body>
</html>

在这里插入图片描述

结语

业务不管你怎么实现,只想要这个效果。有时候一些笨方法也挺好用的。

虽然给定引用中未直接提及vue swiper组件在窗口切换滚动问题的解决方案,但可以从引用的相关设置中获取思路。 首先,要确保swiper能够实时感知到窗口及自身元素的变化,可在 `swiperOption` 中设置 `observer` 和 `observeParents` 为 `true`,这两个参数能让swiper在自身或父元素修改时自动初始化,有助于在窗口切换后重新正常滚动。示例代码如下: ```javascript data() { return { swiperOption: { // 其他参数... observer: true, // 修改swiper自己或子元素时,自动初始化swiper observeParents: true, // 修改swiper的父元素时,自动初始化swiper } } } ``` 另外,在窗口切换后重新启动自动播放功能也很关键。可在窗口获得焦点时,手动调用swiper的自动播放方法。可通过监听 `window` 的 `focus` 事件来实现,示例代码如下: ```javascript mounted() { window.addEventListener('focus', () => { const swiper = this.$refs.mySwiper.swiper; if (swiper) { swiper.autoplay.start(); } }); } ``` 在vue组件中,完整代码示例如下: ```vue <template> <swiper :options="swiperOption" ref="mySwiper"> <swiper-slide v-for="(picitem, index) in swiperList" :key="index"> <img :src="picitem.imgpath" :gid="picitem.gid" :type="picitem.type" :bigsort="picitem.bigsort" alt="" style="display:inline-block;width:100%;height:100%;"> </swiper-slide> <div class="swiper-pagination" slot="pagination"></div> </swiper> </template> <script> export default { data() { return { swiperOption: { pagination: { el: '.swiper-pagination', bulletClass : 'my-bullet-swiper', bulletActiveClass: 'my-bullet-active-swiper' }, loop: true, autoplay: { disableOnInteraction: false }, direction: 'horizontal', slidesPerView: 'auto', centeredSlides: true, spaceBetween: 10, loopedSlides: 3, preventClicksPropagation : false, preventClicks : false, observer: true, observeParents: true }, swiperList: [ // 图片列表数据 ] }; }, mounted() { window.addEventListener('focus', () => { const swiper = this.$refs.mySwiper.swiper; if (swiper) { swiper.autoplay.start(); } }); } }; </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿珍敲code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值