Очень простой слайдер изображений/слайд-шоу с левой и правой кнопкой. Нет автовоспроизведения

Я пытаюсь сделать очень, очень простой слайдер изображений/слайд-шоу без автовоспроизведения, пожалуйста. Я только хочу перейти к следующему или предыдущему изображению по щелчку. Возникли некоторые проблемы, как вы можете прочитать ниже.

Вот jsFiddle http://jsfiddle.net/HsEne/12/ (я просто использовал background цвета вместо изображений в скрипке, а также переключил img на div, но это, конечно, та же проблема)

HTML:

<div id="slider-wrapper">

<div id="slider">
<img class="sp" src="/img1.jpg">
<img class="sp" src="/img2.jpg">
<img class="sp" src="/img3.jpg">
<img class="sp" src="/img4.jpg">
<img class="sp" src="/img5.jpg">
<img class="sp" src="/img6.jpg">
</div>

<img id="button-previous" src="/button-arrow-left.jpg">
<img id="button-next" src="/button-arrow-right.jpg">
</div>

CSS:

#slider-wrapper {
display: block;
max-width: 790px;
margin: 5% auto;
max-height: 500px;
height: 100%; }

#slider {
display: block;
position: relative;
z-index: 99999;
max-width: 710px;
width: 100%;
margin: 0 auto; }

#button-previous { 
position: relative;
left: 0;
margin-top: 40%;
width: 40px;
height: 60px; }

#button-next {
position: relative;
margin-top: 40%;
float: right; }

.sp {
position: absolute; }

#slider .sp {
max-width: 710px;
width: 100%;
max-height: 500px; }

jQuery для следующей кнопки:

jQuery("document").ready(function(){
    jQuery("#slider > img:gt(0)").hide();
     jQuery("#button-next").click(function() { 
        jQuery("#slider > img:first")
    .fadeOut(1000)
    .next()
    .fadeIn(1000)
    .appendTo("#slider");
  });
});

Приведенный выше jQuery работает нормально, за исключением того, что он пропускает первое изображение, если пользователь нажимает следующую кнопку на последнем слайде. Он отображает только первое изображение один раз, все остальные изображения будут скользить каждый раз, когда нажимается следующее. По какой-то причине отображение: к первому изображению ничего не добавляется, но я не знаю, откуда берется этот код.

jQuery для предыдущей кнопки:

jQuery("document").ready(function(){
    jQuery("#slider > img:gt(0)").hide();
     jQuery("#button-previous").click(function() { 
        jQuery("#slider > img:last")
    .fadeOut(1000)
    .next()
    .fadeIn(1000)
    .appendTo("#slider");
  });
});

Этот код jquery выше вернет только что просмотренное изображение, как и должно быть. Но при повторном нажатии ничего не происходит.

Я также пробовал .prev() вместо .next(). Он отлично работает при первом нажатии на предыдущую кнопку. Скажем, мы просматриваем изображение № 4. Когда я нажимаю предыдущую кнопку, она переходит к изображению № 3, как и должно быть. Но когда щелкаешь по нему снова, он не переходит к изображению № 2, он возвращается к изображению № 4, а затем к № 3, а затем к № 4, повторяя себя.


person bob    schedule 26.05.2013    source источник


Ответы (3)


Прочитав ваш комментарий к моему предыдущему ответу, я подумал, что могу поместить это как отдельный ответ.

Хотя я ценю ваш подход к попытке сделать это вручную, чтобы лучше понять jQuery, я все же подчеркиваю достоинства использования существующих фреймворков.

Тем не менее, вот решение. Я изменил некоторые ваши css и HTML, чтобы мне было легче работать с ними.

РАБОТАЮЩАЯ СКРИПКА JS - http://jsfiddle.net/HsEne/15/

это jquery

$(document).ready(function(){
$('.sp').first().addClass('active');
$('.sp').hide();    
$('.active').show();

    $('#button-next').click(function(){

    $('.active').removeClass('active').addClass('oldActive');    
                   if ( $('.oldActive').is(':last-child')) {
        $('.sp').first().addClass('active');
        }
        else{
        $('.oldActive').next().addClass('active');
        }
    $('.oldActive').removeClass('oldActive');
    $('.sp').fadeOut();
    $('.active').fadeIn();


    });

       $('#button-previous').click(function(){
    $('.active').removeClass('active').addClass('oldActive');    
           if ( $('.oldActive').is(':first-child')) {
        $('.sp').last().addClass('active');
        }
           else{
    $('.oldActive').prev().addClass('active');
           }
    $('.oldActive').removeClass('oldActive');
    $('.sp').fadeOut();
    $('.active').fadeIn();
    });




});

Итак, теперь пояснение.
Этап 1
1) Загрузите скрипт в готовый документ.

2) Возьмите первый слайд и добавьте к нему класс «активный», чтобы мы знали, с каким слайдом мы имеем дело.

3) Скрыть все слайды и показать активный слайд. Итак, теперь слайд № 1 — это блок отображения, а все остальные — display:none;

Этап 2 Работа с событием "кнопка-следующий щелчок".
1) Удалите текущий активный класс со слайда, который будет исчезать, и присвойте ему класс oldActive, чтобы мы знали, что он находится на своем месте. выход.

2) Далее следует оператор if, чтобы проверить, находимся ли мы в конце слайд-шоу и нужно ли снова вернуться к началу. Он проверяет, является ли oldActive (то есть исходящий слайд) последним дочерним элементом. Если это так, вернитесь к первому потомку и сделайте его «активным». Если это не последний дочерний элемент, просто возьмите следующий элемент (используя .next() ) и активируйте его класс.

3) Мы удаляем класс oldActive, потому что он больше не нужен.

4) затухание всех слайдов

5) затухание активных слайдов

Шаг 3

То же, что и на втором шаге, но с использованием некоторой обратной логики для обхода элементов в обратном направлении.

Важно отметить, что есть тысячи способов добиться этого. Это всего лишь мой взгляд на ситуацию.

person James    schedule 27.05.2013
comment
Спасибо за подробный ответ. Сработало отлично, и я добавил несколько анимационных эффектов! - person bob; 28.05.2013

Зачем пытаться изобретать велосипед? Существуют более легкие решения для слайд-шоу на jQuery, чем вы могли бы ткнуть палкой, и кто-то уже проделал за вас тяжелую работу и подумал о проблемах, с которыми вы можете столкнуться (кросс-браузерная совместимость и т. д.).

jQuery Cycle — одна из моих любимых облегченных библиотек.

То, чего вы хотите достичь, может быть достигнуто всего за

    jQuery("#slideshow").cycle({
    timeout:0, // no autoplay
    fx: 'fade', //fade effect, although there are heaps
    next: '#next',
    prev: '#prev'
    });

JSFIDDLE, ЧТОБЫ ПОСМОТРЕТЬ, НАСКОЛЬКО ЭТО ПРОСТО

person James    schedule 27.05.2013
comment
Я отметил ваш комментарий, потому что он полезен. Но я пытаюсь изучить jquery, поэтому предпочел бы знать, как это сделать вручную. Я не думаю, что это было бы так сложно, но, возможно, это так. - person bob; 27.05.2013
comment
Это понятно, я добавил для вас еще один ответ, который использует только jQuery. - person James; 27.05.2013

Очень простой код для создания слайдера jquery Вот два div: первый — это средство просмотра слайдера, а второй — контейнер списка изображений. Просто скопируйте код и настройте с помощью css.

    <div class="featured-image" style="height:300px">
     <img id="thumbnail" src="01.jpg"/>
    </div>

    <div class="post-margin" style="margin:10px 0px; padding:0px;" id="thumblist">
    <img src='01.jpg'>
    <img src='02.jpg'>
    <img src='03.jpg'>
    <img src='04.jpg'>
    </div>

    <script type="text/javascript">
            function changeThumbnail()
            {
            $("#thumbnail").fadeOut(200);
            var path=$("#thumbnail").attr('src');
            var arr= new Array(); var i=0;
            $("#thumblist img").each(function(index, element) {
               arr[i]=$(this).attr('src');
               i++;
            });
            var index= arr.indexOf(path);
            if(index==(arr.length-1))
            path=arr[0];
            else
            path=arr[index+1];
            $("#thumbnail").attr('src',path).fadeIn(200);
            setTimeout(changeThumbnail, 5000);  
            }
            setTimeout(changeThumbnail, 5000);
    </script>
person Kaushal Sachan    schedule 07.06.2014