1Gb.ru counter

Пример создания SlideUp скроллера с помощью jQuery

Понадобилось мне сделать эффект скроллирования списка с цикличным повтором элементов. Т.е. список как бы закольцован и закрыт от взгляда пользователя за исключением небольшой области, в которую видно несколько элементов списка. При этом область, видимая пользователю, должна двигаться над списком. Надеюсь реализация прояснит возможные вопросы от такой постановки задачи :)

Сразу понятно, что задачу без яваскрипта не решить. Ну а так как анимацию делать самостоятельно мне было лень, я решил воспользоваться своим любимым фреймворком - jQuery.

Начнем с заготовки html-страницы:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ru">
<head>
    <meta content="text/html; charset=UTF-8" http-equiv="content-type">
    <title>SlideUp Scroller example</title>
    <script src="jquery.js" type="text/javascript"></script>
</head>
<body>

</body>
</html>

Добавим список:

...
<body>
<div class="scroller">
  <ul id="frame">
    <li></li>
    <li>Test block #1</li>
    <li>Test block #2</li>
    <li>Test block #3</li>
    <li>Test block #4</li>
    <li>Test block #5</li>
    <li>Test block #6</li>
    <li>Test block #7</li>
    <li>Test block #8</li>
    <li>Test block #9</li>
  </ul>
</div>
</body>
...

В стиле зададим высоту видимой части списка и высоту каждого элемента:

  .scroller {
    height: 150px;
    overflow: hidden;
  }
  #frame {
    margin-top: -30px;
  }
  li {
    height: 30px;
    line-height: 30px;
  }

У контейнера (DIV с классом “scroller”) я задал высоту 150 пикселей и установил свойство overflow в hidden для того, чтобы скрыть лишние элементы списка. А у самого списка я сделал отрицательный отступ сверху равный высоте одного элемента (кстати, в самом списке первым присутствует пустой элемент - ниже я объясню зачем). Высота строки для элемента задана просто для красоты.

А теперь перейдем к самому яваскрипту:

    var topElementId = '0', t;

    $(document).ready(function(){
      var el =$('#frame').children();
      // проверяем количество элементов в списке: если элементов больше
      // чем вмещается в видимую область, то начинаем скролирование
      if (el.size() > 6) {
        // присваиваем каждому элементу списка свой ID
        el.each(function(i){
          $(this).attr('id','row'+i);
        });
        // запускаем таймер. число задает количество милисекунд между
        // загрузкой страницы и началом скролирования
        t = setTimeout('listSlideUp()', 3000);
      }
    });

    function listSlideUp() {
      // для самого верхнего элемента списка (не видимого на странице)
      // вызываем функцию плавного уменьшения высоты
      $('#row'+topElementId).slideUp(2000, function(){
        // тут определяем кол-бэк функцию, выполняющуюся после завершения
        // работы slideup
        
        // если текущий элемент не вспомогательный,
        // то переносим его в конец списка
        if (topElementId > 0) {
          // создаем копию верхнего элемента
          var topElement = jQuery('#row'+topElementId).clone().show();
          // убираем верхний элемент из списка
          $('#row'+topElementId).remove();
          // добавляем скопированный элемент в конец списка
          $('#frame').append(topElement);
        }
        topElementId++;
        // если номер верхнего элемента больше количества элементов,
        // то сбрасываем его в 1
        if (topElementId >= jQuery('#frame').children().size()) {
          topElementId = 1;
        }
      });
      // опять запускаем таймер
      t = setTimeout('listSlideUp()', 4000);
    }

Алгоритм работы скрипта очень прост. Через равные промежутки времени вызывается функция, которая плавно уменьшает высоту верхнего (невидимого) элемента до 0. После чего этот элемент переносится в конец списка и цикл повторяется снова.

У скрипта есть два недостатка: использование глобального пространства имен и необходимость фиксировать высоту элементов. Может у кого-нибудь возникнут идеи по устранению этих недостатков? Тогда велком в комментарии…

Для желающих посмотреть результат работы скрипта, я выложил архив со всем необходимым - код скрипта SlideUp-scroller (16кб)

Upd: У всем любимого (в плохом смысле слова…) ослика обнаружилась неприятная особенность - дерганье при слайдАп-эффекте на теге LI. Пришлось переделать на использование DIV-ов. Новый архив забираем тут: SlideUp-scroller (IE-bugfix)

PS: Прошу в комментариях отписаться о работе скрипта в различных браузерах.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Метки: , , ,

7 комментариев to “Пример создания SlideUp скроллера с помощью jQuery”

  1. Kuzma Says:

    рекомендую посмотреть на jcarousel - плагин к jquery, который делает то же самое

  2. Лобач Олег Says:

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

  3. Darkside Says:

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

  4. Лобач Олег Says:

    Спасибо за благодарность. Я рад, что мое решение кому-то пригодилось.

  5. Darkside Says:

    Теперь возникла задача реализовать эту фичу без фиксированной высоты блоков:)

  6. Darkside Says:

    это решение скроллера блоков с динамической высотой.
    комменты к коду пока нет времени писать. кому не понятно, спрашивайте или пишите на darkside@i.ua

  7. Лобач Олег Says:

    Интересное решение. Спасибо!

    Я оформил Ваше решение в виде готового к употреблению архива. Кому интересно, забрать можно тут - slider-example-darkside.zip

Leave a Reply


FireStats icon Работает с FireStats