首页 web前端 js教程 基于jquery的图片轮播 tab切换组件_jquery

基于jquery的图片轮播 tab切换组件_jquery

May 16, 2016 pm 05:51 PM
图片轮播

目前只添加了scroll和none的效果,scroll即滑动的效果,可以支持x和y方向的滑动;none就是没有任何效果,只是显示和隐藏,后续需要添加其他效果再做扩展,写的有点水,呵呵,在此留笔,防止丢失。
  Demo Address:http://demo.jb51.net/js/2012/sinaapp/

复制代码 代码如下:

/**
* 巨无霸轮播
*/
$.fn.loopSlider = function(option) {
var setting = {
// 默认显示的顺序
initIndex: 1,
// 加在title节点上的样式
className: "current",
// 轮播方向,默认为x轴方向轮播
direct: "x",
// 上一张按钮
prevBtn: "",
// 下一张按钮
nextBtn: "",
// 上下翻页按钮禁用的样式
btnDisable: "disable",
// 按钮按下的样式
btnTouchClass: "",
// 自动轮播
auto: false,
// 自动轮播时间间隔
timeFlag: 4000,
// 轮播效果时间
scrollTime: 350,
// 轮播效果
effect: "scroll",
// 在只有一个轮播元素的时候是否隐藏滑动按钮
hideBtn: true,
// 是否循环轮播
cycle: true,
// 轮播的内容区的容器路径
contentContainer: "#imgScroll",
// 轮播的内容区的节点
contentChildTag: "li",
// 标题轮播区域的容器路径
titleContainer: "#titleScroll",
// 标题轮播区域的节点
titleChildTag: "li",
// 轮播的内容区的数组
cont: [],
// 轮播的标题区的数组
tabs: [],
// 当前轮播序号
current: 0,
// 定时器
ptr: "",
// 轮播回调函数,每次轮播调用,参数为当前轮播的序号
callback: function() {
return true;
}
}
if (option) {
$.extend(setting, option);
}
// 初始化当前调用类型的函数
setting.currentMethod = function() {
return true;
}
var boss = $(this);
// 如果不是第一个元素先轮播
if (setting.initIndex != 1) {
setting.current = setting.initIndex - 1;
}
// 获取轮播的节点列表
var childList = boss.find(setting.contentContainer + " " + setting.contentChildTag);
// 获取轮播标题节点列表
var titleList = boss.find(setting.titleContainer + " " + setting.titleChildTag);
// 保存内容区每一个轮播节点
setting.cont = childList;
// 保存标题的轮播节点
setting.tabs = titleList;
// 如果没有需要轮播的内容,直接返回
if (setting.cont.length == 0) {
return;
}
// 给内容区和标题区设置index属性
childList.each(function(index) {
$(this).attr("index", index);
titleList.eq(index).attr("index", index);
});
// 上下箭头
var nextBtn = boss.find(setting.nextBtn);
var prevBtn = boss.find(setting.prevBtn);
// 长度
var counts = childList.length;
// 轮播容器的父节点
var childParent = childList.parent();
var titleParent = titleList.parent();
if (childList.length setting.current = 0;
}
// 初始化
doInit();
if (childList.length return;
}
/**
* 处理无效果的切换
*/
var doScrollNone = {
process: function(i) {
childList.eq(i).css("display", "block").siblings().css("display", "none");
titleList.eq(i).addClass(setting.className).siblings().removeClass(setting.className);
// 记录当前显示的节点
setting.current = i;
// 调用回调函数
setting.callback(setting.current);
},
init: function() {
setting.currentMethod = doScrollNone;
bindEvent();
// 自动轮播
if (setting.auto) {
processAuto();
}
// 初始化的时候也调用回调函数
setting.callback(setting.current);
}
};
var doScrollXY = {
c_width: 0,
c_height: 0,
init: function() {
// 轮播元素的宽度
this.c_width = childList.width();
// 轮播元素的高度
this.c_height = childList.height();
// x轴方向轮播
if (setting.direct == "x") {
childParent.width(this.c_width * (childList.length > 1 ? counts + 1 : counts));
childParent.css("left", -this.c_width * (setting.current));
} else {
childParent.height(this.c_height * (childList.length > 1 ? counts + 1 : counts));
childParent.css("top", -this.c_height * (setting.current));
}
titleList.eq(setting.current).addClass(setting.className).siblings().removeClass(setting.className);
setting.currentMethod = doScrollXY;
// 绑定事件
bindEvent();
// 初始化的时候也调用回调函数
setting.callback(setting.current);
// 自动轮播
if (setting.auto) {
processAuto();
}
},
process: function(i, needFast) {
setting.current = i;
//alert(i)
if (setting.direct == "x") {
// 执行效果动画
childParent.animate({
left: "-" + (this.c_width * i)
},
(needFast ? 50 : setting.scrollTime),
function() {
if (setting.current == counts) {
doScrollXY.processMove("left", $(this));
}
if (setting.auto) {
processAuto();
}
});
} else {
childParent.animate({
top: "-" + (this.c_height * i)
},
(needFast ? 50 : setting.scrollTime),
function() {
if (setting.current == counts) {
doScrollXY.processMove("top", $(this));
}
if (setting.auto) {
processAuto();
}
});
}
if (i == counts) {
i = 0;
}
// 调用回调函数
setting.callback(setting.current);
titleList.eq(i).addClass(setting.className).siblings().removeClass(setting.className);
},
processMove: function(direct, node) {
var childs = node.children();
for (var i = 1; i var removeNode = childs.eq(i).remove();
node.append(removeNode);
}
var first = childs.eq(0).remove();
node.append(first);
node.css(direct, "0");
}
};
switch (setting.effect) {
case "none":
doScrollNone.init();
break;
case "scroll":
doScrollXY.init();
break;
}
// 一些初始化操作
function doInit() {
childParent.css("position", "relative");
if (!setting.cycle) {
prevBtn.removeClass(setting.btnDisable);
nextBtn.removeClass(setting.btnDisable);
if (setting.current == 0) {
prevBtn.addClass(setting.btnDisable);
}
if (setting.current == counts - 1) {
nextBtn.addClass(setting.btnDisable);
}
}
// 只有一个元素,并且需要隐藏按钮
if (childList.length prevBtn.hide();
nextBtn.hide();
}
// 克隆第一个元素到最后
if (childList.length > 1) {
var cloneNode = childList.eq(0).clone();
cloneNode.attr("index", counts);
cloneNode.appendTo(childParent);
}
}
/**
* 绑定轮播事件
*/
function bindEvent() {
nextBtn && nextBtn.bind("click",
function(event) {
// 如果按钮已经被禁用
if ($(this).hasClass(setting.btnDisable)) {
return;
}
var cur = setting.current;
if (cur >= 0) {
prevBtn.removeClass(setting.btnDisable);
}
if (cur == counts - 2 && !setting.cycle) {
$(this).addClass(setting.btnDisable);
}
if (cur == counts) {
setting.current = 1;
} else if (cur == counts - 1) {
// 轮播到最后一个
setting.current = counts;
} else {
setting.current = cur + 1;
}
if (setting.ptr) {
clearInterval(setting.ptr);
setting.ptr = null;
}
$(this).addClass(setting.btnTouchClass);
setting.currentMethod.process(setting.current);
});
prevBtn && prevBtn.bind("click",
function() {
if ($(this).hasClass(setting.btnDisable)) {
return;
}
var cur = setting.current;
if (cur nextBtn.removeClass(setting.btnDisable);
}
if (cur == 1 && !setting.cycle) {
$(this).addClass(setting.btnDisable);
}
setting.current = cur == 0 ? counts - 1 : cur - 1;
if (setting.ptr) {
clearInterval(setting.ptr);
setting.ptr = null;
}
$(this).addClass(setting.btnTouchClass);
var fast = false;
if (cur == 0) {
fast = true;
}
setting.currentMethod.process(setting.current, fast);
});
titleParent && titleParent.bind("click",
function(e) {
var element = $(e.target);
// 得到轮播节点
while (element[0].tagName != titleList[0].tagName) {
element = element.parent();
}
if (setting.ptr) {
clearInterval(setting.ptr);
setting.ptr = null;
}
var index = parseInt(element.attr("index"), 10);
if (index != 0) {
prevBtn.removeClass(setting.btnDisable);
} else if (!setting.cycle) {
prevBtn.addClass(setting.btnDisable);
}
if (index != counts - 1) {
nextBtn.removeClass(setting.btnDisable);
} else if (!setting.cycle) {
nextBtn.addClass(setting.btnDisable);
}
setting.currentMethod.process(index);
});
childParent[0].ontouchstart = handleTouchStart;
// 触摸屏幕事件
function handleTouchStart(event) {
var element = $(event.target);
// 得到标题节点
while (element[0].tagName != childList[0].tagName) {
element = element.parent();
}
if (event.targetTouches.length == 0) {
return;
}
var touch = event.targetTouches[0];
var startX = touch.pageX;
var startY = touch.pageY;
var moveDirect = "";
var currentPosition = setting.direct == "x" ? childParent.css("left") : childParent.css("top");
if (setting.ptr) {
clearInterval(setting.ptr);
setting.ptr = null;
}
// 手指滑动事件
childParent[0].ontouchmove = handleTouchMove;
function handleTouchMove(moveEvent) {
var movetouch = moveEvent.targetTouches[0];
if (setting.direct == 'x') {
var moveX = movetouch.pageX;
var moveY = movetouch.pageY;
var x = moveX - startX;
var y = moveY - startY;
// 这里的目的是在左右滑动图片的时候,阻止浏览器的默认事件,但是如果是上下滑动的情况,一般是滑动滚动条,不能直接就阻止浏览器默认事件,不然会导致用户在上下滑动的时候页面停止的情况,这里设置的是在x轴方向要比在Y轴方向滑动至少多10的像素,可以有效的避免上述情况发生
if (Math.abs(x) - Math.abs(y) > 10) {
// 阻止默认的事件
moveEvent.preventDefault();
childParent.css("left", parseFloat(currentPosition) + x);
moveDirect = x > 0 ? "sub": "add";
} else {
return;
}
} else {
// Y轴方向滚动
moveEvent.preventDefault();
var moveY = touch.pageY;
var y = moveY - startY;
childParent.css("top", parseFloat(currentPosition) + y);
moveDirect = y > 0 ? "sub": "add";
}
childParent[0].ontouchend = handleTouchEnd;
}
//手指离开屏幕
function handleTouchEnd() {
//根据手指移动的方向,判断下一个要显示的节点序号
var fast = false;
if (moveDirect == "add") {
if (setting.current == counts) {
setting.current = 1;
} else {
setting.current = setting.current + 1;
}
} else {
if (setting.current == 0) {
setting.current = counts - 1;
fast = true;
} else {
setting.current = setting.current - 1;
}
}
// 调用对应的处理函数
setting.currentMethod.process(setting.current, fast);
childParent[0].ontouchend = null;
childParent[0].ontouchmove = null;
}
}
}
/**
* 自动轮播
*/
function processAuto() {
if (setting.ptr) {
clearInterval(setting.ptr);
setting.ptr = null;
}
// 设置轮播定时器
setting.ptr = setInterval(function() {
if (setting.current == counts) {
setting.current = 1;
} else if (setting.current == counts - 1) {
// 轮播到最后一个
setting.current = counts;
} else {
setting.current = setting.current + 1;
}
var index = setting.current;
if (index != 0) {
prevBtn.removeClass(setting.btnDisable);
} else if (!setting.cycle) {
prevBtn.addClass(setting.btnDisable);
}
if (index != counts - 1) {
nextBtn.removeClass(setting.btnDisable);
} else if (!setting.cycle) {
nextBtn.addClass(setting.btnDisable);
}
setting.currentMethod.process(setting.current);
},
setting.timeFlag);
}
// 返回一个函数,可以在调用返回函数,指定下一次需要轮播的图片的序号,一般用在点击一个小图,然后需要查看大图的情况下,那么就只需要给大图绑定一次轮播事件,再点击某一张小图的时候只需要调用该函数,把对应的序号传入即可
return function(index) {
if (index index = 0;
} else if (index >= counts) {
index = counts - 1;
}
setting.currentMethod.process(index);
}
}
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用CSS实现响应式图片自动轮播效果的教程 使用CSS实现响应式图片自动轮播效果的教程 Nov 21, 2023 am 08:37 AM

随着移动设备的普及,网页设计需要考虑到不同终端的设备分辨率和屏幕尺寸等因素,以实现良好的用户体验。在实现网站的响应式设计时,常常需要使用到图片轮播效果,以展示多张图片在有限的可视窗口中的内容,同时也能够增强网站的视觉效果。本文将介绍如何使用CSS实现响应式图片自动轮播效果,并提供代码示例和解析。实现思路响应式图片轮播的实现可以通过CSS的flex布局实现。在

如何使用 PHP 实现图片轮播和幻灯片功能 如何使用 PHP 实现图片轮播和幻灯片功能 Sep 05, 2023 am 09:57 AM

如何使用PHP实现图片轮播和幻灯片功能在现代网页设计中,图片轮播和幻灯片功能已经变得非常流行。这些功能可以给网页增添一些动态和吸引力,提升用户体验。本文将介绍如何使用PHP实现图片轮播和幻灯片功能,帮助读者掌握这一技术。在HTML中创建基础结构首先,在HTML文件中创建基础结构。假设我们的图片轮播有一个容器以及几个图片元素。HTML代码如下

JavaScript 如何实现图片的轮播切换效果并加入淡入淡出动画? JavaScript 如何实现图片的轮播切换效果并加入淡入淡出动画? Oct 18, 2023 pm 12:12 PM

JavaScript如何实现图片的轮播切换效果并加入淡入淡出动画?图片轮播是网页设计中常见的效果之一,通过切换图片来展示不同的内容,给用户带来更好的视觉体验。在这篇文章中,我将介绍如何使用JavaScript来实现图片的轮播切换效果,并加入淡入淡出的动画效果。下面是具体的代码示例。首先,我们需要在HTML页面中创建一个包含轮播图的容器,并在其中添加

如何利用PHP开发一个简单的图片轮播功能 如何利用PHP开发一个简单的图片轮播功能 Sep 25, 2023 am 11:21 AM

如何利用PHP开发一个简单的图片轮播功能图片轮播功能在网页设计中十分常见,能够给用户呈现出更好的视觉效果,提升用户体验。本文将介绍如何使用PHP开发一个简单的图片轮播功能,并给出具体的代码示例。首先,我们需要准备一些图片资源作为轮播的图片。将这些图片放在一个文件夹内,并命名为"slider",确保文件夹路径正确。接下来,我们需要编写一个PHP脚本来获取这些图

如何使用HTML、CSS和jQuery制作一个动态的图片轮播 如何使用HTML、CSS和jQuery制作一个动态的图片轮播 Oct 25, 2023 am 10:09 AM

如何使用HTML、CSS和jQuery制作一个动态的图片轮播在网站设计和开发中,图片轮播是一个经常使用的功能,用于展示多张图片或广告横幅。通过HTML、CSS和jQuery的结合,我们可以实现一个动态的图片轮播效果,为网站增加活力和吸引力。本文将介绍如何使用HTML、CSS和jQuery制作一个简单的动态图片轮播,并提供具体的代码示例。第一步:设置HTML结

如何通过WordPress插件实现图片轮播功能 如何通过WordPress插件实现图片轮播功能 Sep 06, 2023 pm 12:36 PM

如何通过WordPress插件实现图片轮播功能在如今的网站设计中,图片轮播功能已经成为一个常见的需求。它可以让网站更具吸引力,并且能够展示多张图片,达到更好的宣传效果。在WordPress中,我们可以通过安装插件来实现图片轮播功能,本文将介绍一种常见的插件,并提供代码示例供参考。一、插件介绍在WordPress插件库中,有许多图片轮播插件可供选择,其中一款常

如何利用vue和Element-plus实现图片轮播和幻灯片展示 如何利用vue和Element-plus实现图片轮播和幻灯片展示 Jul 18, 2023 am 10:32 AM

如何利用Vue和ElementPlus实现图片轮播和幻灯片展示在网页设计中,图片轮播和幻灯片展示是常见的功能需求。而使用Vue和ElementPlus框架可以很轻松地实现这些功能。本文将介绍如何使用Vue和ElementPlus来创建一个简单而美观的图片轮播和幻灯片展示组件。首先,我们需要先安装Vue和ElementPlus。在命令行中执行以下命令:

JavaScript 如何实现图片轮播功能? JavaScript 如何实现图片轮播功能? Oct 18, 2023 am 11:27 AM

JavaScript如何实现图片轮播功能?图片轮播是网页设计中常用的功能之一,它可以展示多张图片,以一定的时间间隔自动切换,增加用户的视觉体验。在JavaScript中实现图片轮播功能并不复杂,本文将以具体的代码示例来讲解实现的方法。首先,我们需要在HTML中创建一个容器,用来显示图片和控制轮播的按钮。可以使用以下代码创建一个基本的轮播容器:&lt

See all articles