jCarousel с неизвестной шириной содержимого - PullRequest
3 голосов
/ 29 декабря 2008

Я пытаюсь использовать плагин 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}
        });

Ответы [ 4 ]

5 голосов
/ 03 января 2009

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

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

Обязательно используйте много оберток.

<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 в " window " и position:absolute в " space ", а затем сдвинув его о 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. Это не нужно, если у вас есть полный контроль, но может быть лучшим выбором для полностью автономного плагина.

0 голосов
/ 29 декабря 2008

Soviut,

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

Тем не менее, я также не хотел бы использовать плагин для вкладок или любой другой подобный материал, так как мне НЕОБХОДИМО ПОЛНОЕ УПРАВЛЕНИЕ через мой вывод. Например, добавление дополнительных элементов во вкладки при необходимости, например двойной щелчок, загрузка и многие другие и т. Д. И т. Д.

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

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

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

С уважением,

0 голосов
/ 30 декабря 2008

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

Возможно, вы захотите взглянуть на JQuery UI Draggable, Droppable и Sortable плагины.

0 голосов
/ 29 декабря 2008

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

То, что вы хотите услышать, это интерфейс с вкладками. См. JQuery UI Tabs для демонстрации и документации о том, как ее реализовать.

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

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

...