内容宽度未知的 jCarousel
Posted
技术标签:
【中文标题】内容宽度未知的 jCarousel【英文标题】:jCarousel with unknown content width 【发布时间】:2010-09-28 16:07:26 【问题描述】:我正在尝试为 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
);
【问题讨论】:
【参考方案1】:最接近您想要的可能是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">←</a>
<a href="#" class="right">→</a>
</div>
我们要做的是在“window”元素内来回移动“space”元素。这可以通过将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”元素并求和 pouterWidth
来计算。如果您有完全控制权,这是不必要的,但对于完整的独立插件可能是更好的选择。
【讨论】:
【参考方案2】:据我所知,您正在尝试让 JCarousel 做一些它从未设计过的事情。根据我在JCarousel website 上看到的内容,它似乎是一个图像旋转器。
听起来您想要的是一个选项卡式界面。有关如何实现它的演示和文档,请参阅 JQuery UI Tabs。
如果我完全错了,而您正在寻找的只是有关如何正确使用 CSS 选项卡的教程,请查看:
http://unraveled.com/projects/css_tabs/
【讨论】:
【参考方案3】:苏维埃,
其实你说的很对!我试图让 JCarousel 做一些它不是为它设计的事情。
但是,我也不想使用选项卡插件或任何类似的东西,因为我需要完全控制我的输出。例如在需要时将更多元素注入选项卡中,例如双击、加载和许多其他等。
实际上,我正在寻找一种方法来水平滚动 div 内的内容,左右箭头.. 更准确地说,我需要与 www.pageflakes.com 中看到的选项卡完全相同的结构
用户将能够通过单击链接(或任何其他元素)来创建标签,他们将能够内联编辑其名称,只要标签的长度超过 div 的长度,按钮将可见,允许它们在 div 内滑动,我将事件绑定到它们的加载、单击和双击事件。
总而言之,除了滑动/滚动部分之外,我已准备好一切并可以正常工作。关于如何实现此功能,我只需要向你们寻求帮助..
亲切的问候,
【讨论】:
如果你能展示你当前的工作演示会更好,这样你的问题就更容易理解了。【参考方案4】:您要查找的不是标签,而是可拖动的面板。可以在此处找到一个示例,称为 JQuery Portlets。可以在here找到有关Portlets的相关博文。
您可能还想查看JQuery UI 的 Draggable、Droppable 和 Sortable 插件。
【讨论】:
以上是关于内容宽度未知的 jCarousel的主要内容,如果未能解决你的问题,请参考以下文章