Bezdepbonusu7Программирование: статьи и ответы

Вопрос

JQuery - сбросить var/обновить var при изменении размера окна

Автор вопроса: ArielОтветов: 1

Я работаю с плагином jQuery, который имеет следующее:

var $el  = $(this),

$wrapper = $el.find('div.ca-wrapper'),

$items   = $wrapper.children('div.ca-item'),

cache    = {};

// save the with of one item

cache.itemW      = $items.width();

// save the number of total items

cache.totalItems = $items.length;

Моя проблема здесь в том, что ширина div, которую мне нужно получить, является плавной: это 33% его оболочки. Плагин хорошо работает, когда страница загружается, но ужасно ломается, когда изменяется размер окна.

Я думаю, что мне нужно снова получить переменные при изменении размера, если вы не можете придумать лучшую альтернативу.

Вот ссылка на WIP: http://arielodiz.com.ar/test/ (прокрутите вниз в "портфолио")

Это оригинальный плагин: http://tympanus.net/codrops/2011/08/16/circular-content-carousel/

jqueryrefreshwindowvarresize

Ответы

Ответ 1 · Didier Ghys

Проблема в том, что плагин делает DIV абсолютным позиционированием и не обновляет позиции при изменении размера автоматически.

Быстрое решение (хотя и не очень хорошее) - снова запустить плагин при изменении размера окна:

$(window).resize(function() {
    $('#ca-container').contentcarousel({
        scroll : 2
    });
});

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

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

Вот код, который нужно добавить в метод инициализации (см. скрипт для правильного места).

var resizeTimer;
// bind the resize event of the window
$(window).resize(function() {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(function() {
        // re-select the items in the order they are now
        var $elements = $wrapper.children('.ca-item');
        // re-calc the width
        cache.itemW = $elements.width();
        // change position accordingly
        $elements.each(function(i) {
            $(this).css({
                left: i * cache.itemW + 'px'
            });
        });
    }, 150);
});

ДЕМО

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы