Skip to content

Instantly share code, notes, and snippets.

@adardesign
Created July 6, 2011 14:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adardesign/1067350 to your computer and use it in GitHub Desktop.
Save adardesign/1067350 to your computer and use it in GitHub Desktop.
bannerSlider with more options
// bannerSlider, Version 1
// Copyright (c) July 30, 2011 adardesign.com
// bannerSlider is freely distributable under the terms of an MIT-style license
// This means you are free to use the code, but please leave this copyright notice intact
// Added relToSrc performance....
(function ($) {
$.fn.bannerSlider = function (options) {
var defaults = {
buildNav: function (count) {
var i = 0,
container = $("<div class='controlsContainer'>").hide(),
navElements = "",
countWidh = 12;
for (i = 0; i < count; i++) {
navElements += "<span class='slideControl directToBanner'></span>";
}
container.html(navElements).css("margin-left", "-" + count * countWidh);
return container;
},
runAutomatic: true,
infiniteBelt:false,
interval: 5000,
normalSpeed: 1500,
fastSpeed: 500,
scrollBackSpeed:2000
};
var options = $.extend(defaults, options);
return this.each(function (i, el) {
var bannerContainer = $(el),
bannerBelt = bannerContainer.find(".bannerSliderBelt"),
banners = bannerBelt.children(),
bannersLength = banners.length,
animSpeed = options.fastSpeed,
resetBelt = false
bannerWidth, bannerNavCount, bannerArrowRight, bannerArrowLeft, beltPos, animSpeed, animateBelt, animProperties, doResetBelt, updateValues, toggleEnableControll, intervalID, startInterval,simulateClick;
if(bannersLength < 2){
return false;
};
bannerWidth = banners.width(),
bannerNavCount = bannerContainer.append((options.buildNav(bannersLength).fadeIn(options.fastSpeed))).find(".controlsContainer span").eq(0).addClass("active").end(),
bannerArrowRight = $("<div class='bannerSliderArrow bannerSliderArrowRight slideControl'></div>").appendTo(bannerContainer),
bannerArrowLeft = $("<div class='bannerSliderArrow bannerSliderArrowLeft slideControl'></div>").appendTo(bannerContainer),
beltPos = 0,
//animate belt
animSpeed = options.fastSpeed,
resetBelt = false;
// if there is a infiniteBelt then clone first and last....
options.infiniteBelt && (function(){
bannerBelt.append(banners.eq(0).clone());
bannerBelt.prepend(banners.eq(-1).clone());
bannerBelt.css({left:-(bannerWidth)+"px"})
})();
animateBelt = function (dir){
var animTo = function (){
var animToVal;
if (dir === "left") {
if (beltPos === 0) {
animToVal = "-=" + bannerWidth * (bannersLength - 1);
options.infiniteBelt && (animToVal = "+=" + bannerWidth);
animSpeed = options.scrollBackSpeed;
resetBelt = false;
}
if (beltPos < 0) {
animToVal = "+=" + bannerWidth;
resetBelt = false;
}
}
if (dir === "right") {
if (Math.abs(beltPos) > bannerWidth * (bannersLength - 2)) {
animToVal = 0;
animSpeed = options.scrollBackSpeed;
resetBelt = -(bannerWidth * bannersLength-2);
} else {
animToVal = "-=" + bannerWidth;
animSpeed = options.normalSpeed;
resetBelt = false;
}
}
if (typeof dir === "number") {
if (dir === 0) {
animToVal = dir;
} else if (dir === bannersLength) {
animToVal = "-" + bannerWidth * (bannersLength - 2);
} else {
animToVal = "-" + bannerWidth * dir
}
}
return animToVal;
},
animProperties = {
left: animTo() + "px"
}
bannerBelt.animate(animProperties, animSpeed, "easeOutExpo", function () {
updateValues(dir);
});
},
doResetBelt = function(){
if(!options.infiniteBelt || resetBelt === false){
return
}
resetVal = {left:resetBelt+"px"};
bannerBelt.css(resetVal);
}
updateValues = function (dir) {
beltPos = parseInt(bannerContainer.find(".bannerSliderBelt").css("left"), 10);
//bannerContainer.find(".bannerSliderBelt").children().eq(0).appendTo($(".bannerSliderBelt"));
updateActiveNav();
toggleEnableControll("enable");
doResetBelt();
}
toggleEnableControll = function (action) {
var action = action === "disable" ? "addClass" : "removeClass";
bannerContainer.find(".slideControl")[action]("disabledControl");
}
updateActiveNav = function () {
bannerContainer.find(".controlsContainer span").eq(Math.abs(beltPos) / bannerWidth).addClass("active").siblings().removeClass("active");
}
bannerBelt.width(bannerWidth * bannersLength);
bannerContainer.delegate(".slideControl", "click", function () {
var thisEle = $(this)
if (thisEle.hasClass("disabledControl")) {
return
}
toggleEnableControll("disable");
if (thisEle.hasClass("directToBanner")) {
var index = bannerNavCount.index(thisEle);
animateBelt(index);
return
}
if (thisEle.is(".bannerSliderArrowRight")) {
animateBelt("right");
return
} else if (thisEle.is(".bannerSliderArrowLeft")) {
animateBelt("left");
}
})
if (options.runAutomatic) {
simulateClick = function () {
bannerContainer.find(".bannerSliderArrowRight").trigger("click");
};
intervalID, startInterval = function () {
intervalID = setInterval(simulateClick, options.interval);
}
startInterval();
bannerContainer.hover(
function () {
clearInterval(intervalID)
}, function () {
startInterval();
})
}
});
};
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment