Базовая карусель jQuery с нуля

#javascript #jquery #load #carousel

#javascript #jquery #загрузить #карусель

Вопрос:

Я бы использовал один из доступных плагинов jQuery, но ни один из них не соответствует моим потребностям для этого конкретного сайта.

Это код, который у меня есть до сих пор:

 <!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script>
<script type="text/javascript" src="js/pushState.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    $("#nav a.slide").click(function() {
        var img = $(this).children('img').attr('src');
        $('#content').hide().css({ 'background':'url('  img  ') no-repeat 50% 50%' }).fadeIn('3000');
        var remApp = $(this).prev('a.slide');
        remApp.remove();
        $("#nav").append(remApp);
    });
});

</script>
<style type="text/css">
html, body {
padding: 0px;
margin: 0px;
}
#content {
position: absolute;
width: 100%;
height: 100%;
padding: 0px;
margin: 0px;
z-index: 1;
}
#nav {
position: absolute;
top: 70%;
z-index: 3;
}
#nav a.slide {
margin: 0 20px 0 0;
text-decoration: none;
}
#nav .slide img {
width: 100px;
height: 85px;
}
</style>

</head>

<body>
<div id="content">


</div>
<div id="social_links">

</div>
<div id="nav">

<a href="#" class="slide">
<img src="images/slide1.gif" />
</a>

<a href="#" class="slide">
<img src="images/slide2.jpg" />
</a>

<a href="#" class="slide">
<img src="images/slide3.jpg" />
</a>

<a href="#" class="slide">
<img src="images/slide4.jpg" />
</a>

<a href="#" class="slide">
<img src="images/slide5.png" />
</a>
</div>

</body>
</html>
  

Это берет изображение, на которое вы нажимаете, и удаляет его, а затем добавляет его в конец. Мне нужно, чтобы он брал каждое из предыдущих изображений и добавлял их.

Кроме того, похоже, что у него есть одноразовое правило. Я могу заставить каждое из изображений перейти один раз, но тогда ничего не произойдет.

Вы можете увидеть это в разделе «действие» здесь

Комментарии:

1. Какие функции вам нужны, которые недоступны в одном из существующих плагинов?

2. 1 за написание собственного.

3. Спасибо тост 🙂 @Clive, мне нужно написать свой собственный, потому что это такая инструментальная часть сайта, который я разрабатываю. Он должен иметь очень конкретные правила и функциональность.

Ответ №1:

Возможны две проблемы (решение одной из них должно помочь), возникающие в результате того факта, что события привязаны к элементам, и когда элементы удаляются и добавляются снова, события больше не привязываются к элементам. Другими словами, вы удаляете элемент из DOM вместе с удалением прикрепленных событий, но когда вы снова вставляете их в DOM, события не присоединяются повторно.

Есть два способа исправить это:

  • прикрепляйте события не к элементам, а к контейнеру, а затем делегируйте события (используя .delegate() функцию jQuery) нужным вам элементам, например. вот так:

     $("#nav").delegate('a.slide', 'click', function() {
        var img = $(this).children('img').attr('src');
        $('#content').hide().css({ 'background':'url('  img  ') no-repeat 50% 50%' }).fadeIn('3000');
        var remApp = $(this).prev('a.slide');
        remApp.remove();
        $("#nav").append(remApp);
    });
      
  • при удалении элементов делайте это с помощью .detach() , а не .remove() функции jQuery — она удалит элементы без удаления событий. Как .remove() говорится в документации:

    Подобно .empty() , метод .remove() извлекает элементы из DOM. Используйте .remove(), когда вы хотите удалить сам элемент, а также все, что внутри него. В дополнение к самим элементам удаляются все связанные события и данные jQuery, связанные с элементами. Чтобы удалить элементы без удаления данных и событий, вместо этого используйте .detach() .

Ответ №2:

Ваши обработчики событий удаляются со слайдов при использовании .remove . Согласно документации jQuery (курсив мой):

Используйте .remove() , когда вы хотите удалить сам элемент, а также все, что внутри него. В дополнение к самим элементам удаляются все связанные события и данные jQuery, связанные с элементами. Чтобы удалить элементы без удаления данных и событий, вместо этого используйте .detach() .

Я бы не стал ее удалять или отсоединять. Просто добавьте его, и jQuery автоматически поместит его в конец. Поскольку вы также хотите переместить все предыдущие элементы в конец, вы хотите, чтобы это:

 var remApp = $(this).prev('a.slide');
$("#nav").append(remApp.prevAll().andSelf());
  

Обратите внимание, что я удалил .remove команду и добавил .prevAll().andSelf() в remApp . .prevAll() получает все предыдущие версии (но не все) и присоединяется к коллекции. remApp .andSelf() remApp Затем вы добавляете всю коллекцию в конец списка.

Комментарии:

1. Ура! Это сработало! Теперь как насчет того, чтобы проделать это с каждым слайдом, который находится перед тем, на который вы нажимаете?

2. @sun-tzu я не уверен, что понимаю. Что вам нужно сделать с каждым слайдом перед тем, на который вы нажимаете ?

3. То же самое, что он уже делает, только с каждым из них. Прямо сейчас он удаляет и добавляет только один элемент. Мне нужно, чтобы он принимал все элементы, которые находятся перед тем, на который нажимается. Я знаю, что в jQuery есть функция each() , но я не могу понять, как заставить это работать в этом случае.

4. @sun-tzu Ок, понял. Я обновил свой ответ. Не забудьте отметить это как ответ, если вам это нравится 🙂

5. ты мой герой, Джефф! Еще одна вещь, если это возможно… Есть ли какой-нибудь способ добавить к этому немного анимации, чтобы элемент вставлялся вместо тех, которые он удаляет?