jCarousel с неизвестной шириной контента

Я пытаюсь использовать плагин jCarousel для jQuery, чтобы предоставить пользователям моего сайта прокручиваемый (горизонтальный) контент.

Контент, который я упоминаю, в основном представляет собой определяемые пользователем <li> элементы, стилизованные таким образом, чтобы они выглядели как вкладка. поэтому в основном я пытаюсь добиться того же эффекта, что и вкладки на pageflakes.com. Как вы понимаете, пользователи сами создают вкладки и присваивают им имена.

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

Я попытался использовать глупый метод, такой как угадывание ширины программно, предполагая, что каждая буква составляет примерно 5 пикселей, и умножая 5 на длину слова, которое они дали в качестве имени для вкладки. даже в этом случае мне нужно было динамически манипулировать файлом css, что я не уверен, как это сделать, и даже если это возможно сделать.

Любые решения приветствуются...

<lu>
<li class='MyTab' id='578'>This is my tab</li>
<li class='MyTab' id='579'>of which I can</li>
<li class='MyTab' id='580'>never guess</li>
<li class='MyTab' id='581'><img src='img/bullet_key.png' /> The length of</li>
</lu>

Приведенный выше html создается программно через ajax_tabs_output.aspx, загружается в массив javascript, а jCarousel позаботится обо всем остальном.

     function outputTabsArray() {
        $.ajax({
            url: 'ajax_tabs_output.aspx', 
            type: 'get', 
            data: 'q=array', 
            async: false, 
            success: function(out) 
                {
                    tabs_array = out;
                } 
            });
            }// end outputTabsArray

        function mycarousel_itemLoadCallback(carousel, state)
        {
            for (var i = carousel.first; i <= carousel.last; i++) {
                if (carousel.has(i)) {
                    continue;
                }

                if (i > tabs_array.length) {
                    break;
                }

                carousel.add(i, mycarousel_getItemHTML(tabs_array[i-1]));
            }
        };

        /**
         * Item html creation helper.
         */
        function mycarousel_getItemHTML(item)
        {
            return '<div class="MyTab" id="' + item.tab_id + "'>" + item.tab_name + '</div>';
        };


            $('#mycarousel').jcarousel({
                size: tabs_array.length,
                itemLoadCallback: {onBeforeAnimation: mycarousel_itemLoadCallback}
        });

person Subliminal Hash    schedule 29.12.2008    source источник


Ответы (4)


Ближе всего к тому, что вам нужно, вероятно, jscrollhorizontalpane. Я никогда не использовал его, поэтому не могу поручиться за его эффективность в решении этой конкретной проблемы.

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

Убедитесь, что вы используете много оберток.

<div class="scrollable">
  <div class="window">
    <div class="space">
      <ul class="tabs">
        <li class="tab">...</li>
        <li class="tab">...</li>
        <li class="tab">...</li>
      </ul>
    </div>
  </div>
  <a href="#" class="left">&larr;</a>
  <a href="#" class="right">&rarr;</a>
</div>

Мы будем перемещать элемент "space" вперед и назад внутри элемента "window". Это можно сделать, установив position:relative на "окно" и position:absolute на "пробел", а затем сдвинув его с помощью left:-??px, но я буду использовать свойство scrollLeft.

Добавьте CSS.

.window {
  overflow : hidden;
  width : 100%;
}
.space {
  width : 999em;      /* lots of space for tabs */
  overflow : hidden;  /* clear floats */
}
.tabs {
  float : left;       /* shrink so we can determine tabs width */
}
.tab {
  float : left;       /* line tabs up */
}

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

Добавить события для изменения размера окна.

$(window)
  .resize(function () {
    var sz = $('.window');
    var ul = sz.find('ul');
    if ( sz.width() < ul.width() ) {
      $('.scrollable a.left, .scrollable a.right').show();
    }
    else {
      $('.scrollable a.left, .scrollable a.right').hide();
    }
  })
  .trigger('resize');

Добавьте события к кнопкам прокрутки.

$('.scrollable a.left').hover(
  function (e) {
    var sz = $('.window');
    sz.animate({ scrollLeft : 0 }, 1000, 'linear');
  },
  function (e) {
    $('.window').stop();
  });

$('.scrollable a.right').hover(
  function (e) {
    var sz = $('.window');
    var margin = sz.find('ul').width() - sz.width();
    sz.animate({ scrollLeft : margin }, 1000, 'linear');
  },
  function (e) {
    $('.window').stop();
  });

Сделанный!

Ширину также можно рассчитать, перебирая элементы "tab" и суммируя upp outerWidth. В этом нет необходимости, если у вас есть полный контроль, но это может быть лучшим выбором для полноценного автономного плагина.

person Borgar    schedule 03.01.2009

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

Похоже, вам нужен интерфейс с вкладками. См. Вкладки пользовательского интерфейса JQuery для демонстрации и документации о том, как это реализовать.

Если я совершенно не прав, и все, что вам нужно, это руководство по созданию правильных вкладок CSS, взгляните на:

http://unraveled.com/projects/css_tabs/

person Soviut    schedule 29.12.2008

Советский,

Вы на самом деле совершенно правы! Я пытаюсь заставить JCarousel делать то, для чего он не предназначен.

Тем не менее, я также не хотел бы использовать плагин вкладок или что-то подобное, поскольку мне НУЖЕН ПОЛНЫЙ КОНТРОЛЬ над моим выводом. Например, добавление дополнительных элементов на вкладки при необходимости, например, двойной щелчок, загрузка и многое другое и т. д. и т. д.

На самом деле, я ищу способ горизонтальной прокрутки содержимого внутри div со стрелками слева и справа. Точнее, мне нужна точно такая же структура вкладок, как и в www.pageflakes.com

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

Подводя итог, у меня все готово и работает, кроме части скольжения/прокрутки. Мне нужно только получить от вас помощь, ребята, относительно того, как реализовать эту функциональность.

С уважением,

person Subliminal Hash    schedule 29.12.2008
comment
Было бы хорошо, если бы вы могли показать свою текущую рабочую демонстрацию, чтобы было легче понять ваш вопрос. - person Soviut; 30.12.2008

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

Вы также можете изучить подключаемые модули JQuery UI Draggable, Droppable и Sortable.

person Soviut    schedule 30.12.2008