jquery实现走马灯特效实例(扑克牌切换效果)
短信预约 -IT技能 免费直播动态提醒
话不多说,先上大致效果:
本着程序员的开源精神,代码奉上:
html代码:
<div class="main-box">
<div class="poker_box">
<div class="pokerCaroursel poker-content" data-setting='{
"width":1094,
"height":338,
"pokerWidth":488,
"pokerHeight":338,
"scale":0.85,
"speed": 500,
"autoPlay":true,
"delay":2000,
"verticalAlign":"middle"
}'>
<!-- 向左按钮 -->
<div class="poker-btn poker-prev-btn"></div>
<ul class="poker-list">
<!-- 图片张数最好是基数,这样呈现的画面才好看 -->
<li class="poker-item poker-rad">
<div class="item">
<a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><img class="tabImg" class="lazy" data-src="images/01.jpg"></a>
<span class="poker-item-title">图一</span>
</div>
</li>
<li class="poker-item poker-rad">
<div class="item">
<a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><img class="tabImg" class="lazy" data-src="images/02.jpg"></a>
<span class="poker-item-title">图二</span>
</div>
</li>
<li class="poker-item poker-rad">
<div class="item">
<a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" ><img class="tabImg" class="lazy" data-src="images/03.jpg"></a>
<span class="poker-item-title">图三</span>
</div>
</li>
</ul>
<!-- 向右按钮 -->
<div class="poker-btn poker-next-btn"></div>
</div>
</div>
</div>
注意:
- 类名不要随意更改(否则插件里面的也要更改),替换图片地址即可。
- data-setting属性记得按照以上格式设置,不然可能报错
script代码:
<script class="lazy" data-src="jquery.js"></script>
<script class="lazy" data-src="jquery.pokerCarousel.js"></script>
<script>
pokerCaroursel.init($('.pokerCaroursel'))
</script>
注意:
要记得先引入jquery.js文件(可去官网下载:https://jquery.com/download/),再引入jquery.pokerCarousel.js文件
jquery.pokerCarousel.js文件完整代码:
var MIDDLE_PIC_POS = 1
//计算如何用最短的距离移动到目标
//由于有两种移动方式,向左边移动或者像右边移动,只需要在这两种方式中选择一个小的就行了
;(function($){
var pokerCaroursel = function (caroursel){
var self = this;
this.caroursel = caroursel;
this.pokerList = caroursel.find(".poker-list");
this.pokerItems = caroursel.find(".poker-item");
this.firstpokerItem = this.pokerItems.first();
this.lastpokerItem = this.pokerItems.last();
this.prevBtn = this.caroursel.find(".poker-prev-btn");
this.nextBtn = this.caroursel.find(".poker-next-btn");
this.buttonItems = caroursel.find(".tabBtn");
//每个移动元素的位置索引,用于记录每个元素当前的位置,在每次移动的时候,该数组的值都会发生变化
//数组的下标对应li元素的位置索引
this.curPositions = [];
for(var i = 0;i<this.pokerItems.length;++i){
this.curPositions[i] = i+1;
}
this.setting = {
"width":"1106",
"height":"340",
"pokerWidth":"488",
"pokerHeight":"340",
"scale":"0.8",
"speed":"1000",
"isAutoplay":"true",
"dealy":"2000"
};
$.extend(this.setting,this.getSetting());
this.setFirstPosition();
this.setSlicePosition();
this.refreshCss();
this.rotateFlag = true;
this.prevBtn.bind("click",function(){
if(self.rotateFlag){
self.rotateFlag = false;
self.rotateAnimate("left")
}
});
this.nextBtn.bind("click",function(){
if(self.rotateFlag){
self.rotateFlag = false;
self.rotateAnimate("right")
}
});
//绑定位置按钮事件
this.buttonItems.each(function(index){
var _this = $(this);
_this.click(function(){
self.clickPosButtonIndex(index);
})
});
if(this.setting.isAutoplay){
this.autoPlay();
this.caroursel.hover(function(){clearInterval(self.timer)},function(){self.autoPlay()})
}
};
pokerCaroursel.prototype = {
autoPlay:function(){
var that = this;
this.timer = window.setInterval(function(){
that.nextBtn.click();
},that.setting.dealy)
},
refreshCss:function(){
var that= this;
var curFirstPos;//当前位于中间的li元素位置
this.buttonItems.each(function(index){
var _this = $(this);
var curPos = that.curPositions[index];
if(curPos == 1){
_this.addClass('poker-btn-active');
}
else{
_this.removeClass('poker-btn-active');
}
});
},
//记录每次移动的状态
refreshPositions:function(offset){
for(var i = 0; i < this.curPositions.length; ++i)
{
var nextPos = this.curPositions[i] + offset;
if (nextPos > this.curPositions.length) {//移动超过末尾,则位置变成到开头
nextPos = nextPos - this.curPositions.length;
}else
if (nextPos < 1) {向左边移动已经移动到开始位置更左边,则位置变成结束
nextPos = this.curPositions.length + nextPos;
}
this.curPositions[i] = nextPos;
}
//console.log('after refreshPositions',this.curPositions);
this.refreshCss();
},
cal_move_path:function(curPos,desPos,arraySize) {
if(curPos == desPos) return null;
//往左边移动
var goRightSteps;
var goLeftSteps;
var retDirect;
var retStep;
if(curPos > desPos){
goRightSteps = curPos - desPos;
goLeftSteps = desPos + (arraySize - curPos);
retDirect = (goRightSteps <= goLeftSteps) ? "left":"right";
return {"direct":retDirect,"step":Math.min(goLeftSteps,goRightSteps)};
}
},
//点击位置按钮,根据点击的按钮索引 决定向左还是向右移动[因为只有三个位置,该方法能够仅靠向左或向右就能将
//指定的位置移动到中间]
clickPosButtonIndex:function(index){
var self = this;
if(self.rotateFlag == false) {//目前正在移动等移动结束后才能进入
return;
}
var curPos = this.curPositions[index];
var retPath = this.cal_move_path(curPos,MIDDLE_PIC_POS,this.curPositions.length);
if (retPath == null){
return;
}
var direct = retPath.direct;
var step = retPath.step;
self.rotateFlag = false;
self.rotateAnimate(direct,step)
},
rotateAnimate:function(type,step){
step = step || 1;
var that = this;
var zIndexArr = [];
var speed = that.setting.speed;
this.pokerItems.each(function(){
var self = $(this);
var destPic = null;
var curPic = self;
for (var i = 0; i < step;++i){
if(type == "left"){// 向左边移动, 下一张图片在自己的右边,所以用next()
destPic = curPic.next().get(0)?curPic.next():that.firstpokerItem;
}
else{
destPic = curPic.prev().get(0)?curPic.prev():that.lastpokerItem;
}
curPic = destPic;
}
var width = destPic.css("width");
var height = destPic.css("height");
var zIndex = destPic.css("zIndex");
var opacity = destPic.css("opacity");
var left = destPic.css("left");
var top = destPic.css("top");
zIndexArr.push(zIndex);
self.animate({
"width":width,
"height":height,
"left":left,
"opacity":opacity,
"top":top
},speed,function(){
that.rotateFlag = true;
});
});
this.pokerItems.each(function(i){
$(this).css("zIndex",zIndexArr[i]);
});
if (type == 'right'){
this.refreshPositions(-step);
}else{
this.refreshPositions(step);
}
},
setFirstPosition:function(){
this.caroursel.css({"width":this.setting.width,"height":this.setting.height});
this.pokerList.css({"width":this.setting.width,"height":this.setting.height});
var width = (this.setting.width - this.setting.pokerWidth) / 2;
console.log(this.pokerItems.length)
this.prevBtn.css({"width":width , "height":this.setting.height,"zIndex":Math.ceil(this.pokerItems.length/2)});
this.nextBtn.css({"width":width , "height":this.setting.height,"zIndex":Math.ceil(this.pokerItems.length/2)});
this.firstpokerItem.css({
"width":this.setting.pokerWidth,
"height":this.setting.pokerHeight,
"left":width,
"zIndex":Math.ceil(this.pokerItems.length/2),
"top":this.setVertialType(this.setting.pokerHeight)
});
},
setSlicePosition:function(){
var _self = this;
var sliceItems = this.pokerItems.slice(1),
level = Math.floor(this.pokerItems.length/2),
leftItems = sliceItems.slice(0,level),
rightItems = sliceItems.slice(level),
pokerWidth = this.setting.pokerWidth,
pokerHeight = this.setting.pokerHeight,
Btnwidth = (this.setting.width - this.setting.pokerWidth) / 2,
gap = Btnwidth/level,
containerWidth = this.setting.width;
var i = 1;
var leftWidth = pokerWidth;
var leftHeight = pokerHeight;
var zLoop1 = level;
leftItems.each(function(index,item){
var scale = _self.setting.scale;
if(index==1){
scale = scale*scale;
}
leftWidth = pokerWidth * scale;
leftHeight = pokerHeight*scale;
$(this).css({
"width":leftWidth,
"height":leftHeight,
"left": Btnwidth - i*gap,
"zIndex":zLoop1--,
"opacity":2/(i+1),
"top":_self.setVertialType(leftHeight)
});
i++;
});
var j = level;
var zLoop2 = 1;
var rightWidth = pokerWidth;
var rightHeight = pokerHeight;
rightItems.each(function(index,item){
var scale = _self.setting.scale;
if(index==0){
scale = scale*scale;
}
var rightWidth = pokerWidth * scale;
var rightHeight = pokerHeight*scale;
$(this).css({
"width":rightWidth,
"height":rightHeight,
"left": containerWidth -( Btnwidth - j*gap + rightWidth),
"zIndex":zLoop2++,
"opacity":2/(j+1),
"top":_self.setVertialType(rightHeight)
});
j--;
});
},
getSetting:function(){
var settting = this.caroursel.attr("data-setting");
if(settting.length > 0){
return $.parseJSON(settting);
}else{
return {};
}
},
setVertialType:function(height){
var align = this.setting.align;
if(align == "top") {
return 0
}else if(align == "middle"){
return (this.setting.pokerHeight - height) / 2
}else if(align == "bottom"){
return this.setting.pokerHeight - height
}else {
return (this.setting.pokerHeight - height) / 2
}
}
};
pokerCaroursel.init = function (caroursels){
caroursels.each(function(index,item){
new pokerCaroursel($(this));
}) ;
};
window["pokerCaroursel"] = pokerCaroursel;
})(jQuery);// JavaScript Document
css代码:
.main-box{ height: 352px; width:1118px;position: absolute;top: 122px;left: 32px;}
.poker_box h2 {font-size: 30px;color: #015293;font-weight: bold;text-align: center;}
.poker_box h3 {font-size: 16px;color: #015293;margin: 10px 0 35px;text-align: center;}
.poker-content {width: 1129px;position: relative;width: 100%;height: 350px!important;margin-left: auto;margin-right: auto;}
.poker-content img {display: block;box-shadow: 0px 0px 10px #222222;-webkit-box-shadow: 0px 0px 10px #222222;border: 0;}
.poker-content a, .poker-content img {display: block;width: 100%;height: 100%;border: none;}
img {border: none;display: block;}
.poker-content .poker-list {width: 1118px;height: 500px;}
.poker-content .poker-list .poker-item {width: 200px;height: 350px;position: absolute;left: 0;top: 0;}
.poker-rad{ border-radius: 20px; overflow: hidden;}
.poker-rai{ border-radius: 20px; overflow: hidden;}
.poker-content .poker-list .poker-item .item {position: relative;width: 100%;height: 100%;}
.poker-content .poker-btn {position: absolute;top: 0;cursor: pointer;filter: opacity(.5) brightness(1);}
.poker-content .poker-btn:hover {filter: opacity(1) brightness(2);}
.poker-content .poker-prev-btn {left: 0;}
.poker-content .poker-next-btn {right: 0;}
.poker-item-title {background:rgba(42, 42, 42, 0.8) none repeat scroll 0 0 !important;filter:Alpha(opacity=80); background:#2a2a2a;text-align: center;color: #FFF;width: 100%;height: 52px;line-height: 52px;position: absolute;bottom: 0;text-indent: 29px}
到此这篇关于jquery实现走马灯特效实例(扑克牌切换效果)的文章就介绍到这了,更多相关jquery 走马灯内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341