Jquery Div kaydırıcı döngüsü
Küçük bir problemim var. Bölme slaytları ve sona ulaşıldığında, bölme 1'i duraklamadan hızla gösterir. Div 5 göremiyor.
$(function(){ var width = '100vw'; var speed = 1500; var pause = 3000; var current = 1; var $slider = $('.slider'); var $slides = $slider.find('.slides'); var $slide = $slides.find('.slide'); setInterval(function(){ $slides.animate({'margin-left': '-='+width}, speed, function(){
current++;
if(current == $slide.length){ $slides.css('margin-left', 0);
current = 1;
}
});
}, pause);
});
Ama gecikme eklersem
if(current == $slide.length){ $(this).delay(pause).queue(function(){
$slides.css('margin-left', 0);
});
current = 1;
}
$(function(){
var width = '100vw';
var speed = 1500;
var pause = 3000;
var current = 1;
var $slider = $('.slider');
var $slides = $slider.find('.slides');
var $slide = $slides.find('.slide');
setInterval(function(){
$slides.animate({'margin-left': '-='+width}, speed, function(){ current++; if(current == $slide.length){
$(this).delay(pause).queue(function(){ $slides.css('margin-left', 0);
});
current = 1;
}
});
}, pause);
});
.slider {
width: 100%;
height:auto;
text-align: center;
overflow: hidden;
}
.slides {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
/*
scroll-snap-points-x: repeat(300px);
scroll-snap-type: mandatory;
*/
}
.slides::-webkit-scrollbar {
width: 1px;
height: 10px;
}
.slides::-webkit-scrollbar-thumb {
background: #bbb;
}
.slides::-webkit-scrollbar-track {
background: transparent;
}
.slides > div {
scroll-snap-align: start;
flex-shrink: 0;
width: 100vw;
height: 100vh;
background: #eee;
transform-origin: center center;
transform: scale(1);
transition: transform 0.5s;
position: relative;
display: flex;
justify-content: center;
align-items: center;
font-size: 100px;
}
.slides > div:target {
/* transform: scale(0.8); */
}
.author-info {
background: rgba(0, 0, 0, 0.75);
color: white;
padding: 0.75rem;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
margin: 0;
}
.author-info a {
color: white;
}
img {
object-fit: cover;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.slider > a {
display: inline-flex;
width: 1.5rem;
height: 1.5rem;
background: white;
text-decoration: none;
align-items: center;
justify-content: center;
margin: 0 0 0.5rem 0;
position: relative;
border:1px solid green;
}
.slider > a:active {
top: 1px;
}
.slider > a:focus {
background: #666;
}
/* Don't need button navigation */
@supports (scroll-snap-type) {
.slider > a {
display: none;
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="slider">
<div class="slides">
<div id="slide-1" class="slide">Slide 1</div>
<div id="slide-2" class="slide">Slide 2</div>
<div id="slide-3" class="slide">Slide 3</div>
<div id="slide-4" class="slide">Slide 4</div>
<div id="slide-5" class="slide">Slide 5</div>
</div>
</div>
Div 5'i gerektiği gibi gösteriyor, ancak div 1'i gösterdikten sonra artık kaymıyor.
Öyleyse, döngüyü sürdürmek ve her div'i belirli bir zamanda göstermek için ne yapabilirim?
Belki birisi son bölmeye ulaştıktan sonra kaydırıcının nasıl geriye doğru kaydığını gösterebilir ve bölme 1'e geri döner?
Yanıtlar
Birincisi: Probleminiz için KÖTÜ çözüm: (İkinci'ye gidin)
Animasyon kodunuz bir kez current == $slide.lengthsıraya takılırsa, sıradaki işlevi bağımsız değişken olarak geri çağırmanız gerekir, ardından next()diğer işlevi tetiklemek için kullanmanız gerekir. aşağıdaki gibi :
if(current == $slide.length){
$(this).delay(pause).queue(function(next){ //<--- here next argument $slides.css('margin-left', 0);
next(); // <----- next call
});
current = 1;
}
ancak bu, açıklamanın beklendiği gibi çalışmasını sağlamaz
İkincisi: uygun basit çözüm
Önerdiğim şey, animasyonun sol değerini değişken olarak ayarlayın, ardından son olup olmadığını kontrol edin, böylece 0'a kaydırın, diğer akıllıca sola görünüm genişliği kaydırmaya devam edin
Çalışan snippet'e bakın:
$(function(){ var width = '100vw'; var speed = 1500; var pause = 3000; var current = 1; var $slider = $('.slider'); var $slides = $slider.find('.slides'); var $slide = $slides.find('.slide'); var leftAnnime = '-='+width; setInterval(function(){ $slides.animate({'margin-left': leftAnnime }, speed, function(){
current++;
if( current == $slide.length ) {
leftAnnime = 0;
current = 0;
} else {
leftAnnime = '-='+width;
}
});
}, pause);
});
.slider {
width: 100%;
height:auto;
text-align: center;
overflow: hidden;
}
.slides {
display: flex;
overflow-x: hidden;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
/*
scroll-snap-points-x: repeat(300px);
scroll-snap-type: mandatory;
*/
}
.slides::-webkit-scrollbar {
width: 1px;
height: 10px;
}
.slides::-webkit-scrollbar-thumb {
background: #bbb;
}
.slides::-webkit-scrollbar-track {
background: transparent;
}
.slides > div {
scroll-snap-align: start;
flex-shrink: 0;
width: 100vw;
height: 100vh;
background: #eee;
transform-origin: center center;
transform: scale(1);
transition: transform 0.5s;
position: relative;
display: flex;
justify-content: center;
align-items: center;
font-size: 100px;
}
.slides > div:target {
/* transform: scale(0.8); */
}
.author-info {
background: rgba(0, 0, 0, 0.75);
color: white;
padding: 0.75rem;
text-align: center;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
margin: 0;
}
.author-info a {
color: white;
}
img {
object-fit: cover;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.slider > a {
display: inline-flex;
width: 1.5rem;
height: 1.5rem;
background: white;
text-decoration: none;
align-items: center;
justify-content: center;
margin: 0 0 0.5rem 0;
position: relative;
border:1px solid green;
}
.slider > a:active {
top: 1px;
}
.slider > a:focus {
background: #666;
}
/* Don't need button navigation */
@supports (scroll-snap-type) {
.slider > a {
display: none;
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="slider">
<div class="slides">
<div id="slide-1" class="slide">Slide 1</div>
<div id="slide-2" class="slide">Slide 2</div>
<div id="slide-3" class="slide">Slide 3</div>
<div id="slide-4" class="slide">Slide 4</div>
<div id="slide-5" class="slide">Slide 5</div>
</div>
</div>