<head>
<title>图片环形滚动</title>
<style>
html,body{background:#990000margin:0px }
#pics_3d{
position:absolute
height:300px
width:100%
background:#000
top:120px
border-bottom:20px solid #420000
border-top:20px solid #420000
}
img{
position:absolute
background:#eee
left:0top:0
border:5px solid #00CCFF
}
</style>
</head>
<body>
<div id="pics_3d">
<img src="/jscss/demoimg/wall5.jpg" />
<img src="/jscss/demoimg/wall6.jpg" />
<img src="/jscss/demoimg/wall7.jpg" />
</div>
</body>
<script >
Item=function(UI){
this.angle=0
this.UI=UI
this.update()
}
Item.ini={
axle_w:400,
axle_h:10,
cen_x:500,
cen_y:260
}
Item.prototype.update=function(){
var J=this.UI.style,C=Item.ini,W=C.axle_w,H=C.axle_h,X=C.cen_x,Y=C.cen_y
var angle=this.angle/180*Math.PI
var left=Math.cos(angle)*W+X
var top=Math.sin(angle)*H+Y
var A=this.angle>270?this.angle-360:this.angle
var size=360-Math.abs(90-A)*3
this.UI.width=Math.max(size,120)
var opacity=Math.max(10,size-180)
J.filter='alpha(opacity='+opacity+')'
J.opacity=opacity/100
J.left=(left-this.UI.offsetWidth/2)+'px'
top=(top-this.UI.offsetHeight)+'px'
J.top=top
J.zIndex=parseInt(size*100)
}
Nav_3D={
items:[],
dir:1,
index:0,
hover:false,
add:function(item){
this.items.push(item)
item.index=this.items.length-1
item.UI.onclick=function (){
var J=item.angle,M=Nav_3D
if(M.uping)return
if(J==90){
return alert('goto new url..')
}
M.wheel_90(item)
M.index=item.index
}
item.UI.onmouseover=function (){
if(item.angle==90){
Nav_3D.hover=true
clearTimeout(Nav_3D.autoTimer)
}
}
item.UI.onmouseout=function (){
if(item.angle==90){
Nav_3D.hover=false
Nav_3D.auto()
}
}
return this
},
wheel_90:function(hot){
if(this.uping)return
this.uping=true
var This=this
this.timer=setInterval(function (){
clearTimeout(This.autoTimer)
var A=hot.angle
This.dir=A<270&&A>90?-1:1
if(A==90){
clearInterval(This.timer)
This.uping=false
This.onEnd(hot)
}
if(A>270)A-=360
var set=Math.ceil(Math.abs((90-A)*0.1))
for (var i=0i<This.items.lengthi++ ) {
var J=This.items[i]
J.angle+= (set*This.dir)
J.update()
if(J.angle>360)J.angle-=360
if(J.angle<0)J.angle +=360
}
},15)
},
ready:function(){
var J=this.items,step=parseInt(360/J.length)
for (var i=0i<J.lengthi++) {J[i].angle=i*step+90}
this.wheel_90(this.items[0])
Nav_3D.prevHot=this.items[0].UI
Nav_3D.setHot()
},
setHot:function(isHot){
if(!this.prevHot)return
with(this.prevHot.style){
borderColor=isHot!==false?'#CC0000':'#00CCFF'
cursor=isHot!==false?'default':"pointer"
}
return this
},
auto:function(){
this.index--
if(this.index<0)this.index=this.items.length-1
var J=this.items[this.index]
this.setHot(false).prevHot=J.UI
this.setHot()
this.wheel_90(J)
},
onEnd:function(hot){
if(this.hover){
return setTimeout(function(){Nav_3D.onEnd()},100)
}
this.autoTimer=setTimeout(function(){Nav_3D.auto()},1500)
}
}
var imgs=document.getElementById("pics_3d").getElementsByTagName("IMG")
for (var i=0i<imgs.lengthi++ ) {
Nav_3D.add(new Item(imgs[i]))
}
Nav_3D.ready()
</script>
</html>
项目需要做个环形的导航排列,网上找到一篇详细介绍原理的文章 javascript-按圆形排列DIV元素(一)---- 分析 ,然后尝试着把它实现了,效果图如下:
源码分享给大家哦,拿走不谢O(∩_∩)O
vue版本的根据项目需求做了些略微的修改
<div style="border-radius:50pxwidth:100pxheight:100pxborder:3px solid #666"></div>
border-radius 就是圆角样式,不过这个样式并不兼容所有浏览器,建议你用图片代替或者换其他的样式样子