You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
7.6 KiB
JavaScript

(function($){
$.fn.mobileSlider = function(settings){
var defaultSettings = {
width: 640, //容器宽度
height: 320, //容器高度
autoMove: true,
during: 5000, //间隔时间
speed:30 //滑动速度
}
settings = $.extend(true, {}, defaultSettings, settings);
return this.each(function(){
var _this = $(this), s = settings;
var startX = 0, startY = 0; //触摸开始时手势横纵坐标
var temPos; //滚动元素当前位置
var iCurr = 0; //当前滚动屏幕数
var timer = null; //计时器
var oMover = $("ul", _this); //滚动元素
var oLi = $("li", oMover); //滚动单元
var num = oLi.length; //滚动屏幕数
var oPosition = {}; //触点位置
var moveWidth = s.width; //滚动宽度
//初始化主体样式
_this.width(s.width).height(s.height).css({
position: 'relative',
overflow: 'hidden',
margin:'0 auto'
}); //设定容器宽高及样式
oMover.css({
position: 'absolute',
left: 0
});
oLi.css({
float: 'left',
display: 'inline'
});
$("img", oLi).css({
width: s.width,
height: s.height
});
//初始化焦点容器及按钮
_this.append('<div class="focus"><div></div></div>');
var oFocusContainer = $(".focus");
for (var i = 0; i < num; i++) {
$("div", oFocusContainer).append("<span></span>");
}
var oFocus = $("span", oFocusContainer);
oFocusContainer.css({
minHeight: $(this).find('span').height() * 2,
position: 'absolute',
bottom: 0
})
$("span", oFocusContainer).css({
display: 'block',
float: 'left',
cursor: 'pointer'
})
$("div", oFocusContainer).width(oFocus.outerWidth(true) * num).css({
position: 'absolute',
right: 10,
top: '50%',
marginTop: -$(this).find('span').width() / 2
});
oFocus.first().addClass("current");
//页面加载或发生改变
$(window).bind('resize load', function(){
if (isMobile()) {
mobileSettings();
bindTochuEvent();
}
oLi.width(_this.width()).height(_this.height());//设定滚动单元宽高
oMover.width(num * oLi.width());
oFocusContainer.width(_this.width()).height(_this.height() * 0.15).css({
zIndex: 2
});//设定焦点容器宽高样式
_this.fadeIn(300);
});
//页面加载完毕BANNER自动滚动
s.autoMove && autoMove();
//PC机下焦点切换
if (!isMobile()) {
oFocus.hover(function(){
iCurr = $(this).index() - 1;
stopMove();
doMove();
}, function(){
autoMove();
})
}
//自动运动
function autoMove(){
timer = setInterval(doMove, s.during);
}
//停止自动运动
function stopMove(){
clearInterval(timer);
}
//运动效果
function doMove(){
iCurr = iCurr >= num - 1 ? 0 : iCurr + 1;
doAnimate(-moveWidth * iCurr);
oFocus.eq(iCurr).addClass("current").siblings().removeClass("current");
}
//绑定触摸事件
function bindTochuEvent(){
oMover.get(0).addEventListener('touchstart', touchStartFunc, false);
oMover.get(0).addEventListener('touchmove', touchMoveFunc, false);
oMover.get(0).addEventListener('touchend', touchEndFunc, false);
}
//获取触点位置
function touchPos(e){
var touches = e.changedTouches, l = touches.length, touch, tagX, tagY;
for (var i = 0; i < l; i++) {
touch = touches[i];
tagX = touch.clientX;
tagY = touch.clientY;
}
oPosition.x = tagX;
oPosition.y = tagY;
return oPosition;
}
//触摸开始
function touchStartFunc(e){
clearInterval(timer);
touchPos(e);
startX = oPosition.x;
startY = oPosition.y;
temPos = oMover.position().left;
}
//触摸移动
function touchMoveFunc(e){
touchPos(e);
var moveX = oPosition.x - startX;
var moveY = oPosition.y - startY;
if (Math.abs(moveY) < Math.abs(moveX)) {
e.preventDefault();
oMover.css({
left: temPos + moveX
});
}
}
//触摸结束
function touchEndFunc(e){
touchPos(e);
var moveX = oPosition.x - startX;
var moveY = oPosition.y - startY;
if (Math.abs(moveY) < Math.abs(moveX)) {
if (moveX > 0) {
iCurr--;
if (iCurr >= 0) {
var moveX = iCurr * moveWidth;
doAnimate(-moveX, autoMove);
}
else {
doAnimate(0, autoMove);
iCurr = 0;
}
}
else {
iCurr++;
if (iCurr < num && iCurr >= 0) {
var moveX = iCurr * moveWidth;
doAnimate(-moveX, autoMove);
}
else {
iCurr = num - 1;
doAnimate(-(num - 1) * moveWidth, autoMove);
}
}
oFocus.eq(iCurr).addClass("current").siblings().removeClass("current");
}
}
//移动设备基于屏幕宽度设置容器宽高
function mobileSettings(){
moveWidth = $(window).width();
var iScale = $(window).width() / s.width;
_this.height(s.height * iScale).width($(window).width());
oMover.css({
left: -iCurr * moveWidth
});
}
//动画效果
function doAnimate(iTarget, fn){
oMover.stop().animate({
left: iTarget
}, _this.speed , function(){
if (fn)
fn();
});
}
//判断是否是移动设备
function isMobile(){
if (navigator.userAgent.match(/Android/i) || navigator.userAgent.indexOf('iPhone') != -1 || navigator.userAgent.indexOf('iPod') != -1 || navigator.userAgent.indexOf('iPad') != -1) {
return true;
}
else {
return false;
}
}
});
}
})(jQuery);