带有jquery的圆形旋转/放大菜单

我正在尝试制作一个包含5个项目/图标的菜单,其中所选项目位于中心。单击此居中图标的左侧或右侧,向左或向右旋转菜单,环绕边缘并移动最靠近边缘的项目通过相反的边缘。单击居中的项目将转到其链接的URL。 菜单也应该以类似于OS X底座的方式放大,除了放大级别是根据位置而不是鼠标悬停设置的。 我做了一个比我的ramblings更容易理解的图表。 alt text http://img442.yfrog.com/img442/9321/navdiagram.png 我已经设法凑齐了一个简单的jQuery版本,其中的项目根据需要交换位置,但无法弄清楚如何动画这个动作,尤其是环绕边缘部分,并根据位置改变大小。 我猜我的代码可能不是最好的:) HTML如下:
<div id="nav">
<div id="leftnav"></div>
<div id="rightnav"></div>
<div id="navblock1" class="navblock">
    one
</div>
<div id="navblock2" class="navblock">
    two
</div>
<div id="navblock3" class="navblock">
    three
</div>
<div id="navblock4" class="navblock">
    four
</div>
<div id="navblock5" class="navblock">
    five
</div>
和JS:
function rotateNav(direction) {
var change = (direction=='left')?(-1):(+1);
$('div.navblock').each(function() {
    oldPos = parseInt($(this).attr('id').substr(9));
    newPos = oldPos+change;
    if (newPos == 0)
        newPos = 5;
    else if (newPos == 6)
        newPos = 1;
    $(this).attr('id','navblock'+newPos);
});
}
$(document).ready(function(){
$("#leftnav").click(function() {
    rotateNav('right');
});
$("#rightnav").click(function() {
    rotateNav('left');
});

});
所有.navblock元素都是绝对定位的。 #leftnav和#rightnav元素也有,并且它们具有更高的z-index,因此浮动在项目/图标上方。 我看过各种jQuery插件,但似乎没有一个接近我需要的东西。     
已邀请:
您可以更改CSS类并使用jQuery UI的
switchClass()
方法为旋转设置动画,而不是更改
id
属性(您实际上不应该首先做)。 你还需要做一些
clone()
ing让它看起来像边缘
navblock
s已经旋转到小部件的另一侧和一些
queue()
/
dequeue()
ing来处理多次点击。 工作演示: http://jsbin.com/ovemu(可通过http://jsbin.com/ovemu/edit编辑) 完整来源: JavaScript的
function rotateNav(direction) {
if (direction === 'left') {
  var change = 1;
  $('.navblock5').clone()
    .removeClass('navblock5')
    .addClass('navblock0')
    .appendTo('#nav');
}
else {
  var change = -1;
  $('.navblock1').clone()
    .removeClass('navblock1')
    .addClass('navblock6')
    .appendTo('#nav');
}

$('div.navblock').each(function() {
  var oldClassName = this.className.split(' ')[1],
    oldPos = parseInt(oldClassName.substr(8)),
    newPos = oldPos + change;

    $(this).switchClass(
      oldClassName,
      'navblock'+newPos,
      'fast', 
      function () { 
        var animated = $('.navblock:animated').length;
        if (newPos === 6 || newPos === 0) {
          $(this).remove(); 
        } 
        if (animated === 1) {
          $('#nav').dequeue();
        }
      }
    );
});
}

$(document).ready(function(){
$("#leftnav").click(function() {
  $('#nav').queue(function(){rotateNav('right');});
});
$("#rightnav").click(function() {
  $('#nav').queue(function(){rotateNav('left');});
});
});
CSS #nav {   宽度:580px;身高:120px;   位置:相对;左:150px;   溢出:隐藏; } .navblock {   身高:100px;宽度:100px;   位置:绝对;上:10px; z-index:50;   背景颜色:灰色; } .navblock0 {left:-110px; } .navblock1 {left:10px; } .navblock2 {left:120px; } .navblock3 {left:230px;宽度:120px;身高:120px;顶部:0;} .navblock4 {left:360px; } .navblock5 {left:470px; } .navblock6 {left:590px; } #leftnav,#rightnav {   位置:绝对; z-index:100;身高:120px;宽度:228px; } #leftnav {left:0; } #rightnav {right:0; } / *取消注释以下内容以帮助调试或查看内部工作原理* / / * #nav {border:1px solid green;溢出:可见; } #leftnav,#rightnav {border:1px solid blue; } * / HTML
<div id="nav">
<div id="leftnav"></div>
<div id="rightnav"></div>

<div class="navblock navblock1">one</div>
<div class="navblock navblock2">two</div>
<div class="navblock navblock3">three</div>
<div class="navblock navblock4">four</div>
<div class="navblock navblock5">five</div>
    
我建议您使用现有的解决方案,而不是自己动手并浪费时间让它正常工作。这里有一些指示(我想通过使用谷歌可以找到更多 jQuery:类似Mac的Dock 类似Mac的图标底座(v2) MAC CSS Dock菜单 jQuery模仿OS X dock 简单的OSX类似于jQuery的dock iconDock jQuery插件     
你似乎走在了正确的轨道上。一个问题就是这一行
oldPos = parseInt($(this).attr('id').substr(9));
应该在substr中使用8:
oldPos = parseInt($(this).attr('id').substr(8));
    

要回复问题请先登录注册