上面的图片是“太多标签”的一个例子, 默认情况下,它会呈现为多行显示。
但我想让它在一行内水平滚动,可以在第一个标签之前和最后一个标签之后添加两个箭头,也可以自动滚动。
上面的图片是“太多标签”的一个例子, 默认情况下,它会呈现为多行显示。
但我想让它在一行内水平滚动,可以在第一个标签之前和最后一个标签之后添加两个箭头,也可以自动滚动。
我对这个问题有不同的看法,我认为为标签添加滚动条是不直观的。因此,我创建了一个插件,在标签换行时会自动转变成下拉菜单。
$("#tabs").tabs({
overflowTabs: true,
tabPadding: 23,
containerPadding: 40,
dropdownSize: 50
});
tabPadding
表示标签文字周围的像素填充数。
containerPadding
是容器的填充。
dropdownSize
是下拉选择按钮的像素大小。
我已经在最新版的 Chrome
、Firefox
和 IE
上测试过了。如果您发现任何问题或可以改进,欢迎分支并进行修改。
现在还可以在 GitHub 上获取。
tabPadding
?它不能从<li>
元素的outerWidth
计算出来吗?您的jFiddle演示说明padding-left|right
为0.5em,而代码则说明tabPadding: 23(px)
-这并不明显1em = 24px。同样的问题也适用于containerPadding
。 - dma_k_textWidth
太过复杂,因为它计算了 <li>
子元素的宽度(?),因此需要 tabPadding
参数才能正确运行。解决方案:设置 .ui-tabs li {display: inline-block; }
并将所有填充、边距、边框应用于 .ui-tabs
内部的 li
和子元素。 - dma_k这里列出的插件都不能完全满足我的需求(大部分已经过时且不兼容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/以了解更多关于编程方面的内容。
解决方案如下图所示:
我正在使用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>
并在您的JavaScript中调用:
$("#js_image_selection").horizontalTabs();
针对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();
});
这不是最有效的方法,但目前对我的测试目的来说可行。
在单行显示选项卡时,有多种情况和案例需要处理。
<ul>
周围添加一个 div
并将溢出设置为 scroll
。这种方法可以直接使用,因为浏览器通过选项卡标题进行滚动处理。但是,浏览器提供的默认滚动条看起来很奇怪。因此,您需要自定义/时尚的滚动条插件。或者扩展了 jQuery UI 小部件,提供可滚动的选项卡功能,并在需要时自动处理响应式页面大小更改,显示导航控件。
特点: