如果选项卡太多,如何使 Jquery UI 选项卡水平滚动

IT技术 javascript jquery css user-interface tabs
2021-03-15 12:07:13

默认情况下它显示为多行。

现在上图是“标签太多”的示例,默认显示为多行。

但是我想让它在一行中并且可以水平滚动,在开始选项卡之前和最后一个选项卡之后添加两个箭头,或者自动滚动都可以。

6个回答

我对这个问题有不同的方法,因为我认为标签的滚动是违反直觉的。我创建了一个插件来在选项卡中断到第二行时进行下拉。

https://github.com/jasonday/plusTabs

嘿@Ross,这是我对插件的下一步。你有演示吗?你想提交更改吗?我想让它可配置 - 真/假。
2021-05-01 12:07:13
我更喜欢这种方法。如此之多,我分叉了 Jason 的代码并更新了它,以允许在将剩余的选项卡插入下拉选项卡之前显示尽可能多的选项卡。干杯。 github.com/recarv/plusTabs
2021-05-03 12:07:13

我最近正在寻找解决方案,但其他插件/示例似乎都不适用于 jQuery 1.9+,我还认为 Jason 创建“更多”选项卡并将任何额外选项卡显示为下拉列表的答案提供了最好的UI 体验,因此我扩展了他的回答并为1.9+创建了一个 jQuery 插件,它扩展了 jQuery UI 选项卡,如果所有选项卡的总宽度超过选项卡容器的宽度,则附加选项卡将组合在一个下拉列表中.

在此处输入图片说明

您可以查看JSFiddle Demo以了解它的运行情况。尝试调整浏览器窗口的大小以查看它是否正常工作。

或者您可以在JSFiddle查看完整的插件代码

初始化“溢出选项卡”就像这样简单:

$("#tabs").tabs({
    overflowTabs: true,
    tabPadding: 23, 
    containerPadding: 40,
    dropdownSize: 50
});

tabPadding 是选项卡中文本周围填充的像素数。

containerPadding 是容器的填充。

dropdownSize 是下拉选择器按钮的像素大小

我已经在最新版本中测试了这个ChromeFirefoxIE如果您发现任何问题或可以改进这一点,请随时将其分叉并继续。

现在也可以在GitHub找到

2021-05-01 12:07:13
很好的解决方案。你有计划把代码放到 GitHub 上吗?
2021-05-05 12:07:13
如果你能回答我更多的问题,我将不胜感激。(1) 为什么需要配置tabPadding无法从计算outerWidth<li>元素吗?您的 jFiddle 演示说明padding-left|right是 0.5em,而代码说明tabPadding: 23(px)- 1em = 24px 并不明显。同样的担忧containerPadding
2021-05-09 12:07:13
好的,我发现了一些其他的错误,也许它们还剩下一些。这是我的版本它也有一些好处:一些标签是“可关闭的”,并且有“全部关闭”按钮。最棘手的是如何计算列表隐藏元素的宽度。原始函数_textWidth太复杂了,因为它计算<li>孩子的宽度(?),因此tabPadding需要参数才能正确运行。解决方案:设置.ui-tabs li {display: inline-block; }并应用所有的内边距、边距、边框li和子元素.ui-tabs
2021-05-09 12:07:13

这里列出的插件没有一个对我有用(大多数已经过时并且与 jQuery 2.0+ 不兼容)但我最终发现了这个:https : //github.com/joshreed/jQuery-ScrollTabs ...值得添加到列表中。

我刚刚为此制作了一个非常简单的插件。基本上,您必须向选项卡导航器添加一个固定长度的 div 和一个可移动的 div。

插件代码:

(function ($) {
var settings = {
    barheight: 38
}    

$.fn.scrollabletab = function (options) {

    var ops = $.extend(settings, options);

    var ul = this.children('ul').first();
    var ulHtmlOld = ul.html();
    var tabBarWidth = $(this).width()-60;
    ul.wrapInner('<div class="fixedContainer" style="height: ' + ops.barheight + 'px; width: ' + tabBarWidth + 'px; overflow: hidden; float: left;"><div class="moveableContainer" style="height: ' + ops.barheight + 'px; width: 5000px; position: relative; left: 0px;"></div></div>');
    ul.append('<div style="width: 20px; float: left; height: ' + (ops.barheight - 2) + 'px; margin-left: 5px; margin-right: 0;"></div>');
    var leftArrow = ul.children().last();
    leftArrow.button({ icons: { secondary: "ui-icon ui-icon-carat-1-w" } });
    leftArrow.children('.ui-icon-carat-1-w').first().css('left', '2px');        

    ul.append('<div style="width: 20px; float: left; height: ' + (ops.barheight - 2) + 'px; margin-left: 1px; margin-right: 0;"></div>');
    var rightArrow = ul.children().last();
    rightArrow.button({ icons: { secondary: "ui-icon ui-icon-carat-1-e" } });
    rightArrow.children('.ui-icon-carat-1-e').first().css('left', '2px');        

    var moveable = ul.find('.moveableContainer').first();
    leftArrow.click(function () {
        var offset = tabBarWidth / 6;
        var currentPosition = moveable.css('left').replace('px', '') / 1;

        if (currentPosition + offset >= 0) {
            moveable.stop().animate({ left: '0' }, 'slow');
        }
        else {
            moveable.stop().animate({ left: currentPosition + offset + 'px' }, 'slow');
        }
    });

    rightArrow.click(function () {
        var offset = tabBarWidth / 6;
        var currentPosition = moveable.css('left').replace('px', '') / 1;
        var tabsRealWidth = 0;
        ul.find('li').each(function (index, element) {
            tabsRealWidth += $(element).width();
            tabsRealWidth += ($(element).css('margin-right').replace('px', '') / 1);
        });

        tabsRealWidth *= -1;

        if (currentPosition - tabBarWidth > tabsRealWidth) {
            moveable.stop().animate({ left: currentPosition - offset + 'px' }, 'slow');
        }
    });


    return this;
}; })(jQuery);

http://jsfiddle.net/Bua2d/查看

我喜欢你在这里所做的一切。我的一个建议是,将 li 元素包装在 div 中是无效的 html。考虑用 div 包裹整个 ul 元素。
2021-04-27 12:07:13

这是一个插件:http : //jquery.aamirafridi.com/jst/

因为那个 JQuery UI Tabs 需要在同一个 DIV 中的选项卡和以下内容,而其他滚动插件通常需要一个 DIV 来包含要滚动的对象。所以正是这种冲突让我很难使用任何插件。
2021-05-03 12:07:13