多Tabs的横向滚动插件(支持Zepto和jQuery)
一. 效果图

二. 功能介绍
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)的更多相关文章
- Sublime text代码补全插件(支持Javascript、JQuery、Bootstrap框架)
Sublime text代码补全插件(支持Javascript.JQuery.Bootstrap框架) 插件名称:javascript-API-Completions 支持Javascript.J ...
- 移动端日历选择控件(支持Zepto和JQuery)
移动端日历选择控件(支持Zepto和JQuery) <!DOCTYPE html> <html> <head> <meta charset="utf ...
- 移动端翻页插件dropload.js(支持Zepto和jQuery)
一. 声明 代码来源:github上的dropload项目. 二. 问题 dropload.js提供了最基本的上拉翻页,下拉刷新功能.对于由服务端一次返回所有数据的情况基本通用. 但是,需求往往不是服 ...
- 移动端-手机端-日历选择控件(支持Zepto和JQuery)
一. 效果图 二. 功能说明 1. 支持切换年份,月份. 2. 支持点击选中日期,也可以点击确定选择日期. 三. 使用方法 1. 添加Input 在你的页面中添加Input输入框.可以再html里,也 ...
- 移动端轮播图插件(支持Zepto和jQuery)
一. 效果图 二. 功能介绍 1. 支持图片自动轮播和非自动轮播 2. 支持点击和滑动. 三. 简单介绍 代码都有注释,逻辑简单,不做更多赘述. 1. 在你的html中添加一行. <sectio ...
- 使 WPF 支持触摸板的横向滚动
微软终于开始学苹果一样好好做触摸板了(就是键盘空格键下面那一大块).然而鉴于以前没有好好做,以至于 WPF 程序甚至都没有对触摸板的横向滚动提供支持(竖向滚动是直接使用了 MouseWheel,汗-- ...
- Javascript和jQuery WordPress 图片轮播插件, 内容滚动插件,前后切换幻灯片形式显示
用于在有限的网页空间内展示一组产品图片或者照片,同时还有非常吸引人的动画效果.本文向大家推荐12款实用的 jQuery 图片轮播效果插件,帮助你在你的项目中加入一些效果精美的图片轮播效果,希望这些插件 ...
- VUE 滚动插件(better-scroll)
1. 概述 1.1 说明 better-scroll是一款重点解决移动端(已支持PC)各种滚动场景需求的插件.例如淘宝聚划算中的类型选择(女装/家纺/生鲜美食等),没有滚动条显示却实现了滚动功能. 1 ...
- FullPage.js全屏滚动插件学习总结
如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次.比如 iPhone 5C 的介绍页面(查看),QQ浏览器的官网站.如果 ...
随机推荐
- 石墨烯(转自wiki)
石墨烯(Graphene)是一种由碳原子以sp2杂化轨道组成六角型呈蜂巢晶格的平面薄膜,只有一个碳原子厚度的二维材料[1].石墨烯一直被认为是假设性的结构,无法单独稳定存在[1],直至2004年,英国 ...
- C# 访问mongodb数据库
1.引用四个mongodb动态库MongoDB.Bson.dll,MongoDB.Driver.Core.dll,MongoDB.Driver.dll,MongoDB.Driver.Legacy.dl ...
- [ SPOJ RESTACK ] Restacking haybales
\(\\\) Description 给出一个环,每个位置有一个初值 \(A_i\),有一个目标值 \(B_i\),保证 \(\sum A_i=\sum B_i\) 每个位置只能把值分给隔壁的,每次分 ...
- 关于vue项目 路由中 使用的坑
关于vue路由重定向的时候 记得一定要先声明先声明
- PendingIntent 显示通知
安卓显示通知 PendingIntent pendingIntent=PendingIntent.getActivity(Media.this,0, new Intent(Media.this,Med ...
- phpcms v9文章内容页调用上一篇下一篇的方法(转)
phpcms v9文章内容页调用上一篇下一篇的方法如下,魔客吧(www.moke8.com)提示您直接摘取如下代码中的红色部分即可: 上一篇:{$previous_page[url]}" t ...
- unbuntu系统:python2.7安装pyspark
以前在进行搜索引擎rank-svm排序模型训练时,直接使用python读取的HDFS日志文件.统计计算等预处理操作再进行svm模型,最终产生出训练模型.现在回想一下,数据预处理这一块完全可以使用spa ...
- mongodb数据库命令
常用数据库命令汇总 Database Commands Api 下面简单列一下Shell常用的基本命令 启动连接Mongodb #带配置信息启动 mongod -f xxx.conf #连接 mong ...
- 音视频】5.ffmpeg命令分类与使用
GT其实平时也有一些处理音视频的个人或者亲人需求,熟练使用ffmpeg之后也不要借助图示化软件,一个命令基本可以搞定 G: 熟练使用ffmpeg命令!T :不要死记硬背,看一遍,自己找下规律,敲一遍, ...
- Linux 报错 ifconfig command not found
1.Linux 中输入ifconfig命令报错:ifconfig command not found 有可能是没有安装ifconfig,如果没有,安装上去 2.查看是不是缺少了ifconfig,它是在 ...