取消隐藏容器后如何让 Swiper 自动播放? (idangero.us/swiper)
How do I make Swiper autoplay after un-hiding container? (idangero.us/swiper)
主要问题
我正在尝试在 div 中使用 Swiper,它的可见性已切换。但是,在隐藏和显示 div 之后,Swiper 不会自动播放 - 即使在触发 mySwiper.Update()、mySwiper.autoplay.start() 之后,observer 和 observeParents 选项设置为 true。
备选方案
在切换可见性功能中使用新的 Swiper 确实可以使其自动播放,但会导致一系列新问题。拖动不正常,自动播放时不时跳转。
代码
我创建了两个代码笔来演示:
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.0/js/swiper.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.0/css/swiper.min.css">
</head>
<style>
.hidden {
display: none;
}
.nav, .swiper-container {
text-align: center;
margin: 10px;
}
</style>
<body>
<div class="nav">
<a href="javascript:void(0)" onclick="toggleHidden();">Toggle Hidden</a>
<a href="javascript:void(0)" onclick="startFunction();">Start Autoplay</a>
</div>
<!-- Swiper parent container -->
<div class="swiper-parent active">
<!-- Slider main container -->
<div class="swiper-container">
<!-- Additional required wrapper -->
<div class="swiper-wrapper">
<!-- Slides -->
<div class="swiper-slide">
<img src='https://cdn.pixabay.com/photo/2019/08/19/07/45/pets-4415649_960_720.jpg' class="slide-image"/>
</div>
<div class="swiper-slide">
<img src='https://cdn.pixabay.com/photo/2019/07/02/08/10/sunny-4311828_960_720.jpg' class="slide-image"/>
</div>
<div class="swiper-slide">
<img src='https://cdn.pixabay.com/photo/2019/08/25/16/57/purple-4429887_960_720.jpg' class="slide-image"/>
</div>
<div class="swiper-slide">
<img src='https://cdn.pixabay.com/photo/2019/02/15/11/04/book-3998252_960_720.jpg' class="slide-image"/>
</div>
</div>
</div>
</div>
<script>
//Swiper Initialization
new Swiper('.swiper-container', {
// Optional parameters
observer: true,
observeParents: true,
loop: true,
loopedSlides: 4,
slidesPerView: 1,
speed: 1800,
autoplay: {
delay: 100,
disableOnInteraction: true,
},
});
var mySwiper = document.querySelector('.swiper-container').swiper;
function startFunction(){
mySwiper.autoplay.start();
};
function toggleHidden(){
if ($('.swiper-parent').hasClass('active')){
$('.swiper-parent').removeClass('active');
$('.swiper-parent').addClass('hidden');
} else {
$('.swiper-parent').removeClass('hidden');
$('.swiper-parent').addClass('active');
mySwiper.update();
mySwiper.autoplay.start();
};
};
</script>
</body>
</html>
替代切换功能:
function toggleHidden(){
if ($('.swiper-parent').hasClass('active')){
$('.swiper-parent').removeClass('active');
$('.swiper-parent').addClass('hidden');
mySwiper.destroy();
} else {
$('.swiper-parent').removeClass('hidden');
$('.swiper-parent').addClass('active');
new Swiper('.swiper-container', {
observer: true,
observeParents: true,
loop: true,
loopedSlides: 4,
slidesPerView: 1,
speed: 1800,
autoplay: {
delay: 100,
disableOnInteraction: true,
},
});
var mySwiper = document.querySelector('.swiper-container').swiper;
};
};
我找到了解决方案,不过,我没有经验,所以我认为这不是完成此任务的最佳或最干净的方法。
我用这一行$("#swiper-parent-id").load(location.href+" #swiper-parent-id>*","");
重新加载div内容,导致隐藏div时Swiper实例被销毁。
然后在显示 div 时,我创建了一个新的 Swiper 实例。
这是我打算用替代解决方案做的事情,但由于某种原因,它奏效了,而 mySwiper.destroy();
没有奏效。
编辑:
自从我最初发布以来,我得到了 mySwiper.destroy();正常工作。如果其他人遇到这个问题,那是因为我初始化刷卡器的方式。最好在主体代码末尾的 document.ready 函数中执行此操作。
主要问题
我正在尝试在 div 中使用 Swiper,它的可见性已切换。但是,在隐藏和显示 div 之后,Swiper 不会自动播放 - 即使在触发 mySwiper.Update()、mySwiper.autoplay.start() 之后,observer 和 observeParents 选项设置为 true。
备选方案
在切换可见性功能中使用新的 Swiper 确实可以使其自动播放,但会导致一系列新问题。拖动不正常,自动播放时不时跳转。
代码
我创建了两个代码笔来演示:
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.0/js/swiper.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.0/css/swiper.min.css">
</head>
<style>
.hidden {
display: none;
}
.nav, .swiper-container {
text-align: center;
margin: 10px;
}
</style>
<body>
<div class="nav">
<a href="javascript:void(0)" onclick="toggleHidden();">Toggle Hidden</a>
<a href="javascript:void(0)" onclick="startFunction();">Start Autoplay</a>
</div>
<!-- Swiper parent container -->
<div class="swiper-parent active">
<!-- Slider main container -->
<div class="swiper-container">
<!-- Additional required wrapper -->
<div class="swiper-wrapper">
<!-- Slides -->
<div class="swiper-slide">
<img src='https://cdn.pixabay.com/photo/2019/08/19/07/45/pets-4415649_960_720.jpg' class="slide-image"/>
</div>
<div class="swiper-slide">
<img src='https://cdn.pixabay.com/photo/2019/07/02/08/10/sunny-4311828_960_720.jpg' class="slide-image"/>
</div>
<div class="swiper-slide">
<img src='https://cdn.pixabay.com/photo/2019/08/25/16/57/purple-4429887_960_720.jpg' class="slide-image"/>
</div>
<div class="swiper-slide">
<img src='https://cdn.pixabay.com/photo/2019/02/15/11/04/book-3998252_960_720.jpg' class="slide-image"/>
</div>
</div>
</div>
</div>
<script>
//Swiper Initialization
new Swiper('.swiper-container', {
// Optional parameters
observer: true,
observeParents: true,
loop: true,
loopedSlides: 4,
slidesPerView: 1,
speed: 1800,
autoplay: {
delay: 100,
disableOnInteraction: true,
},
});
var mySwiper = document.querySelector('.swiper-container').swiper;
function startFunction(){
mySwiper.autoplay.start();
};
function toggleHidden(){
if ($('.swiper-parent').hasClass('active')){
$('.swiper-parent').removeClass('active');
$('.swiper-parent').addClass('hidden');
} else {
$('.swiper-parent').removeClass('hidden');
$('.swiper-parent').addClass('active');
mySwiper.update();
mySwiper.autoplay.start();
};
};
</script>
</body>
</html>
替代切换功能:
function toggleHidden(){
if ($('.swiper-parent').hasClass('active')){
$('.swiper-parent').removeClass('active');
$('.swiper-parent').addClass('hidden');
mySwiper.destroy();
} else {
$('.swiper-parent').removeClass('hidden');
$('.swiper-parent').addClass('active');
new Swiper('.swiper-container', {
observer: true,
observeParents: true,
loop: true,
loopedSlides: 4,
slidesPerView: 1,
speed: 1800,
autoplay: {
delay: 100,
disableOnInteraction: true,
},
});
var mySwiper = document.querySelector('.swiper-container').swiper;
};
};
我找到了解决方案,不过,我没有经验,所以我认为这不是完成此任务的最佳或最干净的方法。
我用这一行$("#swiper-parent-id").load(location.href+" #swiper-parent-id>*","");
重新加载div内容,导致隐藏div时Swiper实例被销毁。
然后在显示 div 时,我创建了一个新的 Swiper 实例。
这是我打算用替代解决方案做的事情,但由于某种原因,它奏效了,而 mySwiper.destroy();
没有奏效。
编辑: 自从我最初发布以来,我得到了 mySwiper.destroy();正常工作。如果其他人遇到这个问题,那是因为我初始化刷卡器的方式。最好在主体代码末尾的 document.ready 函数中执行此操作。