#javascript #html #jquery #css
#javascript #HTML #jquery #css
Вопрос:
У меня есть список из 5 элементов, и я хочу, чтобы этот список автоматически прокручивался до каждого элемента каждые 3 секунды, а после завершения последнего элемента возвращался к первому элементу и начинал снова. Это мой пример.
var height = $(".list li:first-child").outerHeight();
setInterval(function(){
$('.list').animate({
scrollTop: 58
}, 500);
}, 3000);
.list{width: 200px;height: 180px;overflow: auto;list-style: none;padding-left: 0px;}
ul.list li{padding:20px 0px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<ul class="list">
<li>Option 01</li>
<li>Option 02</li>
<li>Option 03</li>
<li>Option 04</li>
<li>Option 05</li>
</ul>
Как вы можете видеть, список прокручивается только до второго элемента, а затем останавливается. Как я могу это исправить?
Мне нужна ваша помощь.
Ответ №1:
Проблема с вашим кодом заключается в том, что у вас просто постоянное значение прокрутки 58, из-за чего он просто прокручивается вниз со «значением прокрутки» 58, а затем останавливается.
Что вам нужно сделать, так это сначала прокрутить вниз на 58, подождать 3 секунды, а затем снова прокрутить вниз еще на 58 и так далее, и как только вы достигнете дна, что в вашем случае происходит после 2 прокрутки (что дает общее значение прокрутки 58 58 = 116), вам нужно присвоить значение прокрутки 0, чтобы оно снова прокручивалось вверх.
Следующий код делает это:
let scrollValue = 0
setInterval(function(){
scrollValue < 116 ? scrollValue = 58 : scrollValue = 0;
// console.log(`scrollValue: ${scrollValue}`);
$('.list').animate({
scrollTop: scrollValue
}, 500);
}, 3000);
.list{
width: 200px;
height: 180px;
overflow: auto;
list-style: none;
padding-left: 0px;
}
ul.list li{
padding:20px 0px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<ul class="list">
<li>Option 01</li>
<li>Option 02</li>
<li>Option 03</li>
<li>Option 04</li>
<li>Option 05</li>
</ul>
То, что я здесь сделал, определяется переменной scrollValue
, которая определяет, на сколько прокручивать вниз. Изначально значение равно 0, и каждый раз, когда вызывается функция для анимации, оно увеличивается на 58, и если это значение достигает 116 (поскольку вам приходится дважды прокручивать вниз), scrollValue
становится 0, так что вы прокручиваете вас обратно вверх.
Ответ №2:
Чтобы сделать это, как описано, вам нужно знать, сколько элементов у вас есть, и использовать высоту элемента, который вы уже нашли, но не использовали. Затем вам нужно будет отслеживать текущее количество / шаг и увеличивать его до тех пор, пока оно не станет меньше общей длины элементов, или вернуться к 0, если нет.
Однако существует проблема, из-за которой прокрутка не будет выполняться для любых элементов, которые находятся ближе к низу, поскольку контейнеру некуда прокручивать. Вы могли бы выделить дополнительное пространство для прокрутки, добавив пробел под последним li, как я сделал, но это выглядит немного странно.
var height = $(".list li:first-child").outerHeight();
// Get the number of items
var itemLength = $(".list li").length
// Set the currentItem to 0
var currentItem = 0
// Set the initial scroll to height so the first interval goes to item[1]
var scroll = height
setInterval(function() {
$('.list').animate({
scrollTop: scroll
}, 500);
// Increase the step or return to 0 if it's greater than the length of items
if (currentItem < itemLength - 1) {
currentItem
} else {
currentItem = 0
}
// Set the scroll based on above changes
scroll = currentItem * height
}, 3000);
.list {
width: 200px;
height: 180px;
overflow: auto;
list-style: none;
padding-left: 0px;
}
ul.list li {
padding: 20px 0px;
}
li:last-of-type {
margin-bottom: 150px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<ul class="list">
<li>Option 01</li>
<li>Option 02</li>
<li>Option 03</li>
<li>Option 04</li>
<li>Option 05</li>
</ul>