一. 效果图

二. 功能介绍

  1. 支持横向移动

  2. 支持点击Tab后该Tab居中

  3. 拉到最左边和最右边后依然可以拉动,只是tabs的移动距离变小。

三. 使用说明

  1. 在你的html中添加Tabs相关的代码。

<div class="analysis-tabs-title">
<ul>
<li class="active" data-param="overview">综合分析</li>
<li data-param="expected_profits">预期收益</li>
<li data-param="bull_profits">追涨能力</li>
<li data-param="profit_ranking">收益排名</li>
<li data-param="bear_loss">抗跌能力</li>
<li data-param="alpha">Alpha</li>
<li data-param="sharpe">夏普比率</li>
</ul>
</div>

  2. 在你的JS中添加调用插件的代码。

    curShow: 当前选中的Tab的index。

$(".analysis-tabs-title").offsetSlider({
curShow: parseInt($('.analysis-tabs-title ul').find('.active').index())
});

  3. 添加CSS样式

    tabs数量不同,注意更改ul的width。

.analysis-tabs-title {
overflow: hidden;
border-top: 1px solid #f0f0f0;
border-bottom: 1px solid #f0f0f0;
} .analysis-tabs-title ul {
width: 180%;
display: -webkit-box;
display: flex;
display: -webkit-flex;
-webkit-box-pack: justify;
justify-content: space-between;
-webkit-justify-content: space-between;
} .analysis-tabs-title ul li {
padding: 10px;
text-align: center;
display: block;
} .analysis-tabs-title ul li:first-child {
margin-left: 8px;
} .analysis-tabs-title ul li:last-child {
margin-right: 8px;
} .analysis-tabs-title ul li.active {
color: #8e6cd1;
border-bottom: 2px solid #8e6cd1;
}

  4. JS源代码

'use strict';
(function($) {
$.extend($.fn, {
offsetSlider: function(obj) {
this.each(function() {
var $self = $(this);
var dom = {
"wrap": $self.find("ul"),
"item": $self.find("li")
};
var settings = {
"len": dom.item.length,
"maxOffset": $('body').width() - dom.wrap.width(),
"distance": 50,
"startX": 0,
"startY": 0,
"curShow": obj ? (obj.curShow ? obj.curShow : 0) : 0
};
var funs = {
init: function() {
funs.getWidthData();
funs.initUI();
if (settings.len > 1) {
funs.bindEvent();
}
},
getWidthData: function() {
settings.itemWidth = [];
settings.FirstLiOffsetLeft = 0;
settings.LiDistance = 0;
dom.item.each(function() {
settings.itemWidth.push($(this)[0].offsetWidth);
});
settings.FirstLiOffsetLeft = dom.item[0].offsetLeft;
if (settings.itemWidth.length <= 1) return;
settings.LiDistance = (dom.wrap.width() - 2 * settings.FirstLiOffsetLeft - eval(settings.itemWidth.join('+'))) / (settings.itemWidth.length - 1);
},
updateOffset: function() {
if (settings.itemWidth.length <= 1) {
settings.currentOffset = settings.offset = 0;
} else {
settings.curShow = Math.min(settings.curShow, settings.itemWidth.length - 1);
var allLiWidth = 0
for (var i = 0; i < settings.curShow; i++) {
allLiWidth += settings.itemWidth[i];
}
// leftOffSet + last (n-1) li width + (n-1) * lis distance + this li width / 2;
var leftDistance = settings.FirstLiOffsetLeft + allLiWidth + settings.curShow * settings.LiDistance + settings.itemWidth[settings.curShow] / 2;
var currentOffset = parseInt($(window).width() / 2 - leftDistance);
if (currentOffset > 0) {
settings.currentOffset = settings.offset = 0;
} else if (currentOffset < settings.maxOffset) {
settings.currentOffset = settings.offset = settings.maxOffset;
} else {
settings.currentOffset = settings.offset = currentOffset;
}
}
dom.wrap.css("-webkit-transition", "-webkit-transform 0.5s ease-in-out")
dom.wrap.css("-webkit-transform", "translate3d(" + settings.currentOffset + "px, 0, 0)");
},
initUI: function() {
if (!settings.curShow) {
settings.currentOffset = settings.offset = 0;
dom.wrap.css("-webkit-transform", "translate3d(0, 0, 0)");
} else {
funs.updateOffset();
}
},
bindEvent: function() {
dom.item.on({
"click": function(e) {
e.stopPropagation();
settings.curShow = parseInt($(this).index());
funs.updateOffset();
}
});
$self.off().on({
"touchstart": function(e) {
e.stopPropagation();
settings.startX = e.touches ? e.touches[0].pageX : e.originalEvent.touches[0].pageX;
settings.startY = e.touches ? e.touches[0].pageY : e.originalEvent.touches[0].pageY;
},
"touchmove": function(e) {
e.stopPropagation();
e.preventDefault();
var curX = e.touches ? e.touches[0].pageX : e.originalEvent.touches[0].pageX;
var curY = e.touches ? e.touches[0].pageY : e.originalEvent.touches[0].pageY;
var moveX = curX - settings.startX;
var moveY = curY - settings.startY;
if (Math.abs(moveY) > Math.abs(moveX)) {
window.event.returnValue = true;
} else {
e.preventDefault();
}
dom.wrap.css("-webkit-transition", "")
var val = moveX + parseInt(settings.offset);
if (val < settings.maxOffset) {
if (Math.abs(val - settings.maxOffset) > settings.distance) {
settings.currentOffset = -settings.distance / 2 + (val - settings.maxOffset + settings.distance) / 5 + settings.maxOffset;
} else {
settings.currentOffset = (val - settings.maxOffset) / 2 + settings.maxOffset;
}
} else if (val > 0) {
if (val > settings.distance) {
settings.currentOffset = (val - settings.distance) / 5 + settings.distance / 2;
} else {
settings.currentOffset = val / 2;
}
} else {
settings.currentOffset = val;
}
dom.wrap.css("-webkit-transform", "translate3d(" + settings.currentOffset + "px, 0, 0)");
},
"touchend": function(e) {
e.stopPropagation();
if (settings.currentOffset < settings.maxOffset) {
dom.wrap.css("-webkit-transition", "-webkit-transform 0.5s ease-in-out")
settings.currentOffset = settings.offset = settings.maxOffset;
} else if (settings.currentOffset > 0) {
dom.wrap.css("-webkit-transition", "-webkit-transform 0.5s ease-in-out")
settings.currentOffset = settings.offset = 0;
} else {
settings.offset = settings.currentOffset;
}
dom.wrap.css("-webkit-transform", "translate3d(" + settings.currentOffset + "px, 0, 0)");
},
"webkitTransitionEnd": function(e) {
e.stopPropagation();
e.preventDefault();
dom.wrap.css("-webkit-transition", "")
if (settings.currentOffset < settings.maxOffset) {
settings.currentOffset = settings.offset = settings.maxOffset;
} else if (settings.currentOffset > 0) {
settings.currentOffset = settings.offset = 0;
} else {
settings.offset = settings.currentOffset;
}
dom.wrap.css("-webkit-transform", "translate3d(" + settings.currentOffset + "px, 0, 0)");
}
});
$(window).on({
"resize": function() {
funs.adjustPos();
},
"orientationchange": function() {
funs.adjustPos();
}
});
},
adjustPos: function() {
settings.maxOffset = $('body').width() - dom.wrap.width();
funs.getWidthData();
funs.initUI();
}
};
funs.init();
});
}
});
})(window.jQuery || window.Zepto);

多Tabs的横向滚动插件(支持Zepto和jQuery)的更多相关文章

  1. Sublime text代码补全插件(支持Javascript、JQuery、Bootstrap框架)

    Sublime text代码补全插件(支持Javascript.JQuery.Bootstrap框架)   插件名称:javascript-API-Completions 支持Javascript.J ...

  2. 移动端日历选择控件(支持Zepto和JQuery)

    移动端日历选择控件(支持Zepto和JQuery) <!DOCTYPE html> <html> <head> <meta charset="utf ...

  3. 移动端翻页插件dropload.js(支持Zepto和jQuery)

    一. 声明 代码来源:github上的dropload项目. 二. 问题 dropload.js提供了最基本的上拉翻页,下拉刷新功能.对于由服务端一次返回所有数据的情况基本通用. 但是,需求往往不是服 ...

  4. 移动端-手机端-日历选择控件(支持Zepto和JQuery)

    一. 效果图 二. 功能说明 1. 支持切换年份,月份. 2. 支持点击选中日期,也可以点击确定选择日期. 三. 使用方法 1. 添加Input 在你的页面中添加Input输入框.可以再html里,也 ...

  5. 移动端轮播图插件(支持Zepto和jQuery)

    一. 效果图 二. 功能介绍 1. 支持图片自动轮播和非自动轮播 2. 支持点击和滑动. 三. 简单介绍 代码都有注释,逻辑简单,不做更多赘述. 1. 在你的html中添加一行. <sectio ...

  6. 使 WPF 支持触摸板的横向滚动

    微软终于开始学苹果一样好好做触摸板了(就是键盘空格键下面那一大块).然而鉴于以前没有好好做,以至于 WPF 程序甚至都没有对触摸板的横向滚动提供支持(竖向滚动是直接使用了 MouseWheel,汗-- ...

  7. Javascript和jQuery WordPress 图片轮播插件, 内容滚动插件,前后切换幻灯片形式显示

    用于在有限的网页空间内展示一组产品图片或者照片,同时还有非常吸引人的动画效果.本文向大家推荐12款实用的 jQuery 图片轮播效果插件,帮助你在你的项目中加入一些效果精美的图片轮播效果,希望这些插件 ...

  8. VUE 滚动插件(better-scroll)

    1. 概述 1.1 说明 better-scroll是一款重点解决移动端(已支持PC)各种滚动场景需求的插件.例如淘宝聚划算中的类型选择(女装/家纺/生鲜美食等),没有滚动条显示却实现了滚动功能. 1 ...

  9. FullPage.js全屏滚动插件学习总结

    如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次.比如 iPhone 5C 的介绍页面(查看),QQ浏览器的官网站.如果 ...

随机推荐

  1. android序列化(1)Parcelable与Serializable

    1.Android中实现序列化有两个选择 一是实现Serializable接口(是JavaSE本身就支持的),实现Serializable接口非常简单. 一是实现Parcelable接口(是Andro ...

  2. OpenCV2.4.9 + VS2012 + win10 配置

    Step1 下载opencv 2.4.9 pack Step2 解压到本地 我解压路径是: C:\OPENCV Step3 添加环境变量: 这里虽然把X64下的VC11(VC11对应VS2012的C+ ...

  3. c++自动导出lua绑定

    cocos 使用bindings-generator脚本代替了toLua++. 编写效率大大提高. 具体的在本机中分享:http://note.youdao.com/noteshare?id=0f41 ...

  4. document.write清除原有内容情况

    原博客: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...

  5. Python学习日记之文件读取操作

    Python内置了文件读写的函数open,read 用法示例: open('/home/root/files.txt ') 在打开文件后,操作完成后可以使用close()关闭文件,但比较好的文件读写方 ...

  6. Hue - Error loading MySQLdb module: libmysqlclient.so.20: cannot open shared object file: No such file or

    解决下面两点异常 >> 1. Hue页面 点击DB 查询时弹出: Error loading MySQLdb module: libmysqlclient.so.20: cannot op ...

  7. iframe子页面让父页面跳转 parent.location.href

    if ($roleNum < 9) { echo "<script > parent.location.href='admin_login.php' </script ...

  8. WindowsForms获取服务名称

    StringBuilder sb = new StringBuilder(); ServiceController[] services = ServiceController.GetServices ...

  9. JS函数assign

    Object函数提供了一个叫做assign的函数,用来合并多个对象. Object.assign(...): 你可以传递多个对象给该函数,这些对象中的自有且可枚举的属性,会被拷贝给第一个对象. var ...

  10. layer实现窗口抖动效果

    function showMsg(msg, icon){ layer.msg(msg, { //1:正确:2:错误:3:询问:4:锁定:5:失败:6:成功:7:警告:16:加载 icon : icon ...