Добавление рандомизации к простому рекомендательному ротатору
Я нашел здесь удивительный, супер-минимальный ротатор свидетельства, но мне любопытно, как я могу заставить его просто рандомизировать результаты. Вот ротатор, как он сейчас функционирует:
$('.testimonials div:first').show();
setInterval(function(){
$('.testimonials div:first-child')
.fadeOut(1000)
.next('div')
.delay(1000)
.fadeIn(1000)
.end()
.appendTo('.testimonials')
},3000);
3 ответа
Попробуй это:
var $items = $('.testimonials .item');
function getRandomItem(){
return $items.eq(Math.floor($items.length * Math.random()));
}
getRandomItem().show();
setInterval(function(){
var $outgoing = $items.filter(':visible');
var $incoming = getRandomItem();
$outgoing.fadeOut(1000, function(){
$incoming.fadeIn(1000);
});
}, 3000);
Этот код гарантирует, что один и тот же элемент не отображается дважды, и продолжает работать, если вы измените количество отзывов. Первый показанный элемент также является случайным.
$(document).ready(function() {
$('.testimonials div').eq(Math.floor((Math.random() * $('.testimonials div').length))).show();
setInterval(function() {
var $items = $('.testimonials div');
if ($items.length < 2) {
return;
}
var $currentItem = $items.filter(':visible');
var currentIndex = $currentItem.index();
var nextIndex = currentIndex;
while (nextIndex == currentIndex) {
nextIndex = Math.floor((Math.random() * $items.length));
}
$currentItem.fadeOut(1000, function() {
$items.eq(nextIndex).fadeIn(1000);
});
}, 3000);
});
Эта проблема продолжала поглощать меня, и я понял, что настоящая проблема здесь в том, что вы хотите способ перемешать отзывы. Если бы у вас был способ сделать это, то ваша первоначальная функция работала бы даже так, как задумано. Как оказалось, перетасовать список элементов jQuery не так просто, как вы думаете. Я начал с реализации функции, которая позволяет поменять местами два произвольных элемента jQuery (это позволяет избежать использования jQuery.clone
, который имеет побочные эффекты, такие как удаление слушателей событий):
function swap($a, $b){
var $aNext = $a.next(),
$aParent = $a.parent();
$a.insertAfter($b);
if($aNext.length) $b.insertBefore($aNext);
else $aParent.append($b);
}
Затем вы можете реализовать перемешивание Фишера-Йейтса:
function shuffle($items){
var i, j;
for(i=$items.length-1; i>1; i--){
j = Math.floor(Math.random() * (i+1));
swap($items.eq(i), $items.eq(j));
}
}
Теперь вы можете просто перемешать все ваши отзывы:
shuffle($('.testimonials .item'));
Затем используйте свой оригинальный код:
$('.testimonials div:first').show();
setInterval(function(){
$('.testimonials div:first-child')
.fadeOut(1000)
.next('div')
.delay(1000)
.fadeIn(1000)
.end()
.appendTo('.testimonials')
},3000);
Конечно, после того, как вы ознакомитесь со всеми отзывами, вы можете захотеть переставить их, чтобы они не повторяли один и тот же порядок снова и снова.