一. 效果图

二. 功能介绍

  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. hexo博客域名重复提交问题

    之前电脑重装系统,导致我的博客也忘记备份了.呜呜 期间试过hexo的next主题,虽然很好看,但是一直出问题,最终又恢复到了原来的主题,还是原来的配方,还是原来的味道 记录: 一.加载域名管理器 二. ...

  2. php redis 操作大全

    类和方法 用法 Redis类 类RedisException 预定义的常量 Redis类 说明:创建一个Redis客户端 例 $redis = new Redis(); 类RedisException ...

  3. node遍历给定目录下特定文件,内容合并到一个文件

    遍历目录用了fs.readdir这个异步方法,得到当前目录下所有的文件和目录的一个数组.然后判断: if文件,并且后缀符合设定的规则(本文例子是符合后缀ts,js)直接用同步方法写入, if目录,继续 ...

  4. Spring框架系列(七)--Spring常用注解

    Spring部分: 1.声明bean的注解: @Component:组件,没有明确的角色 @Service:在业务逻辑层使用(service层) @Repository:在数据访问层使用(dao层) ...

  5. 【原】Python学习

    1.常用模块介绍 #python -m SimpleHTTPServer 执行上面的命令就会在服务器当前目录下启动一个文件下载服务器,默认打开8000端口.这个时候,你只需要将IP和端口告诉客户端,即 ...

  6. Python中使用SQLite

    参考原文 廖雪峰Python教程 使用SQLite SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是用C写的,而且体积很小,所以经常被集成到各种应用程序中,甚至在IOS和 ...

  7. <MySQL>入门二 增删改 DML

    -- DML语言 /* 数据操作的语言 插入:insert 修改:update 删除:delete */ 1.插入 -- 插入语句 /* 语法:insert into 表名(列名...) values ...

  8. linux性能优化cpu-02平均负载

    每次我们系统变慢时,我们通常做的第一件事就是top命令或者uptime命令,看一下系统的负载情况,比如下面: 我在命令行中输入uptime 22:15:51    表示当前系统时间 up 13 min ...

  9. CCF201703-2 学生排队 java(100分)

    试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排 ...

  10. calculate Cp history (from Fluent) using Matlab

    input data : unscaled time history of moment/thrust from ANSYS fluent example of input data, "m ...