【问题标题】:How to make Jquery UI Tabs scroll horizontally if there are too many tabs如果选项卡太多,如何使 Jquery UI 选项卡水平滚动
【发布时间】:2011-10-03 08:58:15
【问题描述】:

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

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

【问题讨论】:

  • 我很高兴看到这个页面上有五个插件解决方案。 :} 我想知道还有多少。
  • @VaelVictus 在下面的答案中添加了另一个变体,它适用于最新版本的 jQuery UI 库stackoverflow.com/a/45259166/2952405

标签: javascript jquery css user-interface tabs


【解决方案1】:

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

https://github.com/jasonday/plusTabs

【讨论】:

  • 我更喜欢这种方法。如此之多,我分叉了 Jason 的代码并对其进行了更新,以允许在将剩余的选项卡插入下拉选项卡之前显示尽可能多的选项卡。干杯。 github.com/recarv/plusTabs
  • 嘿@Ross,这是我插件的下一步。你有演示吗?你想提交更改吗?我想让它可配置——真/假。
【解决方案2】:

我最近一直在寻找解决方案,但其他插件/示例似乎都不适用于 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 的最新版本上对此进行了测试。如果您发现任何问题或可以改进它,请随时 fork 并继续。

现在也可以通过GitHub 获得。

【讨论】:

  • 很好的解决方案。你有计划把代码放到 GitHub 上吗?
  • 如果您能回答我的更多问题,我将不胜感激。 (1) 为什么需要配置tabPadding?难道不能从<li> 元素的outerWidth 计算出来吗?您的 jFiddle 演示声明 padding-left|right 是 0.5em,而代码声明 tabPadding: 23(px) - 1em = 24px 并不明显。同样的问题containerPadding
  • 好的,我发现了一些其他的错误修复,也许他们还有一些。 Here is my verison。它也有一些好处:一些标签是“可关闭的”,并且有“全部关闭”按钮。最棘手的是如何计算列表隐藏元素的宽度。原始函数_textWidth 太棘手了,因为它计算了<li> 子级(?)的宽度,因此需要tabPadding 参数才能正确运行。解决方案:设置.ui-tabs li {display: inline-block; } 并为li.ui-tabs 内的子项应用所有填充、边距、边框。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我刚刚为此制作了一个非常简单的插件。基本上,您必须向选项卡导航器添加一个固定长度的 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 元素。
    【解决方案5】:

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

    【讨论】:

    • 因为JQuery UI Tabs需要tabs和后面的内容在同一个DIV中,而其他滚动插件往往需要一个DIV来包含要滚动的对象。所以正是这种冲突让我很难使用任何插件。
    【解决方案6】:

    我还为它创建了一个 jQuery 插件here,但我的主要重点是为空间很小且可以依赖的移动网站创建这样的结构也可以使用 touch 和控制箭头进行水平滚动。

    解决方案如下所示:

    我正在使用 Bootstrap 并实现您基本上需要包含的插件:

    在您的 HTML 中具有以下结构,以便箭头可以正常工作(我正在为它们使用 font-awesome)

     <div id="js_image_selection" class="horizontal-scrollable-tabs">
      <div class="scroller arrow-left"><i class="fa fa-arrow-left"></i></div>
      <div class="scroller arrow-right"><i class="fa fa-arrow-right"></i></div>
      <div class="horizontal-tabs">
        <ul role="tablist" class="nav nav-tabs nav-tabs-horizontal">
          <li role="presentation" class="active"><a href="#image01" data-toggle="tab"><img src="external/images/t-shirt-white.jpg"/></a></li>
          <li role="presentation"><a href="#image02" data-toggle="tab"><img src="external/images/t-shirt-orange.jpg"/></a></li>
          <li role="presentation"><a href="#image03" data-toggle="tab"><img src="external/images/t-shirt-green.jpg"/></a></li>
          <li role="presentation"><a href="#image01" data-toggle="tab"><img src="external/images/t-shirt-white.jpg"/></a></li>
          <li role="presentation"><a href="#image02" data-toggle="tab"><img src="external/images/t-shirt-orange.jpg"/></a></li>
          <li role="presentation"><a href="#image03" data-toggle="tab"><img src="external/images/t-shirt-green.jpg"/></a></li>
          <li role="presentation"><a href="#image01" data-toggle="tab"><img src="external/images/t-shirt-white.jpg"/></a></li>
          <li role="presentation"><a href="#image02" data-toggle="tab"><img src="external/images/t-shirt-orange.jpg"/></a></li>
          <li role="presentation"><a href="#image03" data-toggle="tab"><img src="external/images/t-shirt-green.jpg"/></a></li>
        </ul>
      </div>
    </div>
    

    然后叫你Js:

    $("#js_image_selection").horizontalTabs();
    

    希望它对将来的任何人有所帮助! 干杯!

    【讨论】:

      【解决方案7】:

      一个插件可以在这里找到https://github.com/Casper1131/scroller 它可以用于任何无序列表。

      【讨论】:

        【解决方案8】:

        回复:André Lourenço - 很棒的插件,只是想加入一个需要改进的 hack,允许滚动条在窗口调整大小时调整大小(即:旋转移动设备);

            if(!$(".fixedContainer").length) {
                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 class="leftBtn" style="width: 40px; 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('text-align', 'center');        
        
                ul.append('<div class="rightBtn" style="width: 40px; 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('text-align', 'center');        
            } else {
                var leftArrow = $(".leftBtn");
                var rightArrow = $(".rightBtn");
                $(".fixedContainer").css("width", tabBarWidth);
            }
        

        然后我在调整窗口大小时再次调用它:

            $(window).resize(function(e){
                $("#tabs").scrollabletab();
            });
        

        这不是最有效的方法,但它目前适用于我的测试目的。

        【讨论】:

          【解决方案9】:

          我为此创建了另一个插件。这次使用 Chrome 样式的选项卡大小调整行为。

          初始化

          $( ".tabpanel" ).tabs().tabs('overflowResize');
          

          Demo

          GitHub

          【讨论】:

            【解决方案10】:

            在单行显示选项卡时需要处理多种场景和案例。

            1. 简单的解决方案是在 ui-tab-header &lt;ul&gt; 周围添加一个 div 并将溢出设置为 scroll。当浏览器处理标签标题的滚动时,此方法开箱即用。但是浏览器提供的默认滚动条看起来很奇怪。所以你需要一个自定义/时尚的滚动条插件。
            2. 要使用 jQuery UI 选项卡扩展,如下所示:

            扩展的 jQuery UI 小部件提供可滚动的选项卡功能,并通过在需要时显示导航控件来自动处理响应式页面大小变化。

            特点:

            • 它是响应式或流畅的布局
            • 支持触摸滑动以滚动浏览触摸设备中的选项卡标题(* 需要外部依赖)
            • 完全可定制和基于 css 的样式
            • 支持使用关闭按钮删除选项卡
            • 不需要额外的 HTML 结构更改,它会自动动态增强标记。

            https://davidsekar.github.io/jQuery-UI-ScrollTabs

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-04-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多