我想创建一个像this的页面,但我只是在学习javascript / jquery。我真的很喜欢菜单,但我不知道如何将无序菜单列表放在一个圆圈中,然后如何制作悬停效果。
这是html菜单:
<nav>
<ul>
<li><a href="#">Menu1</a></li>
<li><a href="#">Menu2</a></li>
<li><a href="#">Menu3</a></li>
<li><a href="#">Menu4</a></li>
<li><a href="#">Menu5</a></li>
<li><a href="#">Menu6</a></li>
</ul>
</nav>
答案 0 :(得分:4)
我尝试在jsFiddle page上重新创建您要查找的内容。它绝对不是没有bug的,但希望它能帮助你理解制作循环列表所需的jQuery和CSS。
<强> CSS:强>
a {
position: absolute;
text-decoration: none;
border: 1px solid black;
width:98px;
height:98px;
border-radius:50px;
line-height:100px;
text-align:center;
}
我已经以绝对的方式定位链接,以便我们可以操纵他们的顶部/左侧位置。宽度和高度约为边界半径的一半,这将为每个链接提供圆形形状。 css的其余部分是定位文本。
启动jQuery代码:
$(function() {
circle_radius = 100;
$links = $('nav ul li a');
total_links = $links.size();
第一个变量circle_radius
是圆形菜单本身的半径(不是单个链接)。
$links
获取导航代码中的完整链接列表,total_links
存储该导航中的链接数量。这对于确定每个链接的位置非常重要。
更多jQuery代码:
$links.each(function(index) {
$(this).attr('data-index',index);
animateCircle($(this), 1);
});
我们要做的第一件事就是遍历$links
中的每个链接,并为其添加索引值并调用animateCircle(...)
。我们传递link元素本身和另一个值(此值将用于鼠标悬停效果)。
围成一圈定位:
function animateCircle($link, expansion_scale) {
index = $link.attr('data-index');
radians = 2*Math.PI*(index/total_links);
x = -(Math.sin(radians)*circle_radius*expansion_scale);
y = -(Math.cos(radians)*circle_radius*expansion_scale);
$link.animate({
top: x+'px',
left: y+'px'
}, 200);
}
在animateCircle(...)
中,我们首先获得$link
的索引。然后我们使用一些好的旧trig来计算$link
位置的角度(以弧度表示),使用索引和链接总数。接下来,我们使用radians
来计算$link
的x和y位置。注意,我在这里有一个名为expansion_scale
的东西,这是我们传递给这个函数的东西。目前,这只是1,所以它不会影响x和y值。最后,一旦我们得到x和y值,我们使用新值为$link
的top和left属性设置动画。
鼠标悬停时设置动画:
$('li a').hover(function() {
animateCircle($(this), 1.5)
}, function() {
animateCircle($(this), 1)
});
使用animateCircle(...)
可以轻松完成此效果。这是expansion_scale
终于发挥作用的地方。当我们将鼠标悬停在链接上时,它会以animateCircle(...)
为1.5调用expansion_scale
,这使得此特定链接比其他链接移动1.5倍,从而为您提供整洁的效果。最后,当您将鼠标移出时,它会将链接移回其原始位置。
答案 1 :(得分:0)
此菜单也很酷:https://github.com/liri/moonMenuJS
尝试一下,你可以创建一些不错的风格来应用它。