3

我正在尝试为 jQuery 使用 jCarousel 插件,以便为我的网站用户提供可滚动(水平)的内容。

我提到的内容基本上是用户定义<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

4 回答 4

5

最接近您想要的可能是jscrollhorizo​​ntalpane。我从来没有使用过它,所以我不能保证它作为这个特定问题的解决方案的有效性。

如果您想尝试,这种小部件不应该很难制作。我将分解我将使用的近似方法:

确保使用大量的包装纸。

<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>

我们要做的是在“ window ”元素内来回移动“ space ”元素。这可以通过设置为“ window ”和 “ space ”然后将其转换为 using 来完成,但我将使用该属性。position:relativeposition:absoluteleft:-??pxscrollLeft

添加一些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。如果您有完全控制权,这是不必要的,但对于完整的独立插件可能是更好的选择。

于 2009-01-03T00:44:13.877 回答
0

据我所知,您正在尝试让 JCarousel 做一些它从未设计过的事情。根据我在JCarousel 网站上阅读的内容,它似乎是一个图像旋转器。

听起来你想要的是一个选项卡式界面。有关如何实现它的演示和文档,请参阅JQuery UI 选项卡。

如果我完全错了,并且您正在寻找的只是有关如何执行正确的 CSS 选项卡的教程,请查看:

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

于 2008-12-29T07:22:58.267 回答
0

苏维埃,

你其实很对!我试图让 JCarousel 做一些它不是为之设计的事情。

但是,我也不想使用选项卡插件或任何类似的东西,因为我需要完全控制我的输出。例如在需要时将更多元素注入选项卡,例如双击,加载和许多其他等。

实际上,我正在寻找一种方法来水平滚动 div 内的内容,左右箭头.. 更准确地说,我需要与www.pageflakes.com中看到的选项卡完全相同的结构

用户将能够通过单击链接(或任何其他元素)来创建选项卡,他们将能够内联编辑其名称,只要选项卡的数量超过 div 的长度,按钮就会可见允许它们在 div 内滑动,我会将事件绑定到它们的加载、单击和双击事件。

总而言之,除了滑动/滚动部分之外,我已准备好一切并可以正常工作。只有我必须从你们那里获得关于如何实现此功能的帮助..

亲切的问候,

于 2008-12-29T07:47:56.923 回答
0

您要查找的不是选项卡,而是可拖动的面板。可以在此处找到一个示例,称为JQuery Portlets。可以在此处找到有关 Portlet 的相关博客条目。

您可能还想查看JQuery UI的 Draggable、Droppable 和 Sortable 插件。

于 2008-12-30T07:11:06.747 回答