简要教程
这是一款js扑克堆叠式卡片轮播图插件。高轮播图的所有图片像扑克牌一样堆叠在一起,通过鼠标拖拽最上面的一张图片,就可以显示出下一张图片来。
使用方法
在HTML文件中引入。
<scriptsrc="//code.jquery.com/hammer.min.js"></script>
HTML结构
<divid="board"></div>
初始化插件
然后通过下面的代码来初始化插件。
classCarousel{
constructor(element){
this.board=element
//addfirsttwocardsprogrammatically
this.push()
this.push()
//handlegestures
this.handle()
}
handle(){
//listallcards
this.cards=this.board.querySelectorAll('.card')
//gettopcard
this.topCard=this.cards[this.cards.length-1]
//getnextcard
this.nextCard=this.cards[this.cards.length-2]
//ifatleastonecardispresent
if(this.cards.length>0){
//setdefaulttopcardpositionandscale
this.topCard.style.transform='translateX(-50%)translateY(-50%)rotate(0deg)rotateY(0deg)scale(1)'
//destroypreviousHammerinstance,ifpresent
if(this.hammer)this.hammer.destroy()
//listenfortapandpangesturesontopcard
this.hammer=newHammer(this.topCard)
this.hammer.add(newHammer.Tap())
this.hammer.add(newHammer.Pan({position:Hammer.position_ALL,threshold:0}))
//passeventsdatatocustomcallbacks
this.hammer.on('tap',(e)=>{this.onTap(e)})
this.hammer.on('pan',(e)=>{this.onPan(e)})
}
}
onTap(e){
//getfingerpositionontopcard
letpropX=(e.center.x-e.target.getBoundingClientRect().left)/e.target.clientWidth
//getdegreeofYrotation(+/-15degrees)
letrotateY=15*(propX<0.05?-1:1)
//changethetransitionproperty
this.topCard.style.transition='transform100msease-out'
//rotate
this.topCard.style.transform='translateX(-50%)translateY(-50%)rotate(0deg)rotateY('+rotateY+'deg)scale(1)'
//waittransitionend
setTimeout(()=>{
//resettransformproperties
this.topCard.style.transform='translateX(-50%)translateY(-50%)rotate(0deg)rotateY(0deg)scale(1)'
},100)
}
onPan(e){
if(!this.isPanning){
this.isPanning=true
//removetransitionproperties
this.topCard.style.transition=null
if(this.nextCard)this.nextCard.style.transition=null
//gettopcardcoordinatesinpixels
letstyle=window.getComputedStyle(this.topCard)
letmx=style.transform.match(/^matrix\((.+)\)$/)
this.startPosX=mx?parseFloat(mx[1].split(',')[4]):0
this.startPosY=mx?parseFloat(mx[1].split(',')[5]):0
//gettopcardbounds
letbounds=this.topCard.getBoundingClientRect()
//getfingerpositionontopcard,top(1)orbottom(-1)
this.isDraggingFrom=(e.center.y-bounds.top)>this.topCard.clientHeight/2?-1:1
}
//calculatenewcoordinates
letposX=e.deltaX+this.startPosX
letposY=e.deltaY+this.startPosY
//getratiobetweenswipedpixelsandtheaxes
letpropX=e.deltaX/this.board.clientWidth
letpropY=e.deltaY/this.board.clientHeight
//getswipedirection,left(-1)orright(1)
letdirX=e.deltaX<0?-1:1
//calculaterotation,between0and+/-45deg
letdeg=this.isDraggingFrom*dirX*Math.abs(propX)*45
//calculatescaleratio,between95and100%
letscale=(95+(5*Math.abs(propX)))/100
//movetopcard
this.topCard.style.transform='translateX('+posX+'px)translateY('+posY+'px)rotate('+deg+'deg)rotateY(0deg)scale(1)'
//scalenextcard
if(this.nextCard)this.nextCard.style.transform='translateX(-50%)translateY(-50%)rotate(0deg)rotateY(0deg)scale('+scale+')'
if(e.isFinal){
this.isPanning=false
letsuccessful=false
//setbacktransitionproperties
this.topCard.style.transition='transform200msease-out'
if(this.nextCard)this.nextCard.style.transition='transform100mslinear'
//checkthreshold
if(propX>0.25&&e.direction==Hammer.DIRECTION_RIGHT){
successful=true
//getrightborderposition
posX=this.board.clientWidth
}elseif(propX<-0.25&&e.direction==Hammer.DIRECTION_LEFT){
successful=true
//getleftborderposition
posX=-(this.board.clientWidth+this.topCard.clientWidth)
}elseif(propY<-0.25&&e.direction==Hammer.DIRECTION_UP){
successful=true
//gettopborderposition
posY=-(this.board.clientHeight+this.topCard.clientHeight)
}
if(successful){
//throwcardinthechosendirection
this.topCard.style.transform='translateX('+posX+'px)translateY('+posY+'px)rotate('+deg+'deg)'
//waittransitionend
setTimeout(()=>{
//removeswipedcard
this.board.removeChild(this.topCard)
//addnewcard
this.push()
//handlegesturesonnewtopcard
this.handle()
},200)
}else{
//resetcardsposition
this.topCard.style.transform='translateX(-50%)translateY(-50%)rotate(0deg)rotateY(0deg)scale(1)'
if(this.nextCard)this.nextCard.style.transform='translateX(-50%)translateY(-50%)rotate(0deg)rotateY(0deg)scale(0.95)'
}
}
}
push(){
letcard=document.createElement('div')
card.classList.add('card')
//addyouowncontenttothecards
if(this.board.firstChild){
this.board.insertBefore(card,this.board.firstChild)
}else{
this.board.append(card)
}
}
}
如果您觉得本文的内容对您的学习有所帮助:
关键字:
jQuery