Слайдер в bootstrap 3 carousel

Armo

Новичок
Подскажите пожалуйста пытаюсь сверстать макет PSD в Bootstrap 3, и там несколько слайдеров. Вот пытаюсь их реализовать на плагине carousel. И как всегда есть одно но. Слайдер должен быть адаптивным для мобильных устройств. И тут начинается самое интересное.

В мануале написана вот такая структура:
Код:
<div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
  <!-- Wrapper for slides -->
  <div class="carousel-inner">
    <div class="item active">
    Содержимое
    </div>
  </div>
  <a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"></a>
  <a class="right carousel-control" href="#carousel-example-generic" data-slide="next"></a>
</div>
У меня пл дизайну несколько блоков .item в которых соответственно располагаются блоки.

И собственно в зависимости от ширины окна количество элементов должно меняться что бы блоки не наезжали друг на друга.

Я написал jQ мини плагинчик для адаптации HTML структуры под ширину экрана:
Код:
$(function () {
    $.fn.slideradapt = function (options) {
        options = $.extend({
            width: 300, // минимальная ширина
        }, options);

        this.each(function () {

            $(this).off('slideradapt');

            var $this = $(this);
            var $inner = $this.find('.carousel-inner');
            var $items = $this.find('.items > div');

            var width = options.width, ecount = $items.size(), initemcount = Math.floor($inner.width() / width),
                    itemscount = Math.ceil(ecount / initemcount), ewidth = $inner.width() / initemcount,
                    div = '', i = 1, group = 1;

            // Группировка объектов для помещения в Item
            $items.each(function () {
                $(this).addClass('group' + group);
                i++;
                if (i > initemcount) {
                    i = 1;
                    group++;
                }
            });

            for (i = 1; i <= itemscount; i++) {
                var active = (i === 1) ? ' active' : '';
                div += '<div class="item' + active + '">';
                $items.each(function () {
                    if ($(this).hasClass('group' + i)) {
                        div += '<div';
                        div += $(this).attr('id') ? ' id="' + $(this).attr('id') + '"' : '';
                        div += $(this).attr('class') ? ' class="' + $(this).attr('class') + '"' : '';
                        div += '>' + $(this).html() + '</div>';
                    }
                });
                div += '</div>';
            }

            $inner.find('.item').remove(); // reset
            $inner.html(div).remove('.item:empty');
            delete(div);
            $inner.find('.item > div').width(ewidth);

            $('.carousel-control[href="#' + $this.attr('id') + '"]').removeClass('off').removeClass('_off');
            $('.carousel-control.left[href="#' + $this.attr('id') + '"]').addClass('off');
            itemscount === 1 && $('.carousel-control[href="#' + $this.attr('id') + '"]').addClass('_off');
           
            $this.off('slid.bs.carousel').on('slid.bs.carousel', function () {
                var i = $(this).find('.active').index();
                if (!i) {
                    $('.carousel-control.right[href="#' + $this.attr('id') + '"]').removeClass('off');
                    $('.carousel-control.left[href="#' + $this.attr('id') + '"]').addClass('off');
                }
                else if (i == $(this).find('.item').size() - 1) {
                    $('.carousel-control.left[href="#' + $this.attr('id') + '"]').removeClass('off');
                    $('.carousel-control.right[href="#' + $this.attr('id') + '"]').addClass('off');
                }
                else {
                    $('.carousel-control[href="#' + $this.attr('id') + '"]').removeClass('off');
                }
            });
           
            delete($this, $inner, $items);

            return $(this);
        });
    };
})
При событии load или redy плагин успешно выполняет свои задачи. Но стоит мне его привязать на событие ресайза окна:
Код:
$(function () {
   
    $(window).bind('load resize', function(){
        $('#partners_carousel').slideradapt({width: 200}).carousel();
    });
});
Как начинаются лаги. На мобильном страница вообще не подгружается а на PC при ресайзе окна браузера появляется не понятный scroll который зависает и браузер уходит в себя. В чём причина помогите пожалуйста ребят. Мозги в клочья с Bootstrap 3 да и вообще с bootstrap столкнулся в первый раз.
 

hell0w0rd

Продвинутый новичок
Не подчищаешь за собой потому что. Убирай старые слушатели.
А еще лучше ресайз засунть в плагин, чтобы он сам высчитывал все, и не пересоздавал слушателей.
 
  • Like
Реакции: Armo

Armo

Новичок
Не подчищаешь за собой потому что. Убирай старые слушатели.
А еще лучше ресайз засунть в плагин, чтобы он сам высчитывал все, и не пересоздавал слушателей.
Я извиняюсь а что такое слушатель? В данном контексте?
 

Armo

Новичок
Код:
$(window).bind('load resize', function(){
        $('#partners_carousel').slideradapt({width: 200}).carousel();
    });
вероятнее всего $(window)
По всей видимости мне нужно сделать unbind но где конкретно после или до? И как сбросить именно slideradapt при помощи unbind?
 

hell0w0rd

Продвинутый новичок
так и знал, что не надо перевод писать. event-listener. window.addEventListener, ну или $(window).on, не важно. Где on, должен быть и off, где add, должен быть и remove.
 

hell0w0rd

Продвинутый новичок
Объясняю. Засунь внутрь плагина обновление ширины слайдера. А в опциях передавай соотношение сторон, или что-то еще.
PS 3 закон Ньютона знаешь? На каждое действие должно быть противодействие. Ты повесил обработчик события, надо его убрать, когда он перестает быть нужным. В JS, современном, хорошем, не нуждающемся в мерзком jquery, есть EventTarget.addEventListener и EventTarget.removeEventListener. В мире jquery это on и off, если я не ошибаюсь.
 
  • Like
Реакции: Armo

Armo

Новичок
Объясняю. Засунь внутрь плагина обновление ширины слайдера. А в опциях передавай соотношение сторон, или что-то еще.
PS 3 закон Ньютона знаешь? На каждое действие должно быть противодействие. Ты повесил обработчик события, надо его убрать, когда он перестает быть нужным. В JS, современном, хорошем, не нуждающемся в мерзком jquery, есть EventTarget.addEventListener и EventTarget.removeEventListener. В мире jquery это on и off, если я не ошибаюсь.
Во другое дело от души) Я честно говоря когда то перешёл на jQ и потерял хвосты развития простого JS. Будем копать.

Сейчас попробую ещё раз спасибо.
 

Armo

Новичок
Объясняю. Засунь внутрь плагина обновление ширины слайдера. А в опциях передавай соотношение сторон, или что-то еще.
PS 3 закон Ньютона знаешь? На каждое действие должно быть противодействие. Ты повесил обработчик события, надо его убрать, когда он перестает быть нужным. В JS, современном, хорошем, не нуждающемся в мерзком jquery, есть EventTarget.addEventListener и EventTarget.removeEventListener. В мире jquery это on и off, если я не ошибаюсь.
Я не черта не догнал ( Чего ты предложил. Вернее сначала думал что понял а сейчас понимаю что не черта не понял...( Я к тому что если я сделаю off на window resize как функция после отключения будет вызываться? Как мне перехватить $(window).rezize() из плагина.
 
Последнее редактирование:
Сверху