jQuery实现径向动画菜单效果


Posted in Javascript onJuly 17, 2015

最终效果:

jQuery实现径向动画菜单效果

在径向菜单的制作前,首先需要知道几点知识点:

Math.sin(x)      x 的正玄值。返回值在 -1.0 到 1.0 之间;

Math.cos(x)    x 的余弦值。返回的是 -1.0 到 1.0 之间的数;

这两个函数中的X 都是指的“弧度”而非“角度”,弧度的计算公式为: 2*PI/360*角度,使用js表示是这样的:Math.PI/180*度数(1度=180/Math.PI)

如:30° 角度 的弧度 = 2*PI/360*30

如何计算圆上任何点坐标(用于计算出子菜单相对于圆的位置)

jQuery实现径向动画菜单效果

以父容器左上角为圆点,建立坐标系

代码如下:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<title>径向菜单的制作</title>
<meta charset="utf-8"/>
<meta name="keywords" content="" />
<meta name="description" content="" />
<script type="text/javascript" src="jquery.js"></script> <!--此处需引入jquery文件-->
<style type="text/css">
* {
margin: 0;
padding: 0;
}
body {
background-color: #292a38;
font-family: "Microsoft Yahei";
}
h1 {
margin-top: 20px;
text-align: center;
color: #fff;
} 
.navWrap {
position: relative;
width: 200px;
height: 200px;
margin: 50px auto;
border: 2px dotted #4e5061;
border-radius: 50%;
}
.navWrap .main-nav {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);/*分别向左上移动元素对象的50%,保证居中*/
width: 40px;
height: 40px;
line-height: 40px;
font-size: 12px;
text-align: center;
text-decoration: none;
color: #fff;
border-radius: 3px;
text-shadow: 1px 1px 0px #000;
background: #15a5f3;
cursor: pointer;
} 
.navWrap nav {
position: absolute;
width: 100%;
height: 100%;
transform: scale(0);
transition: all 0.5s ease-out;
opacity: 0;
} 
.navWrap.active nav {
transform: scale(1);
opacity: 1;
}
.navWrap nav > a{
position: absolute;
width: 30px;
height: 30px;
background: #f44283;
text-align: center;
line-height: 30px;
text-decoration: none;
color: #fff;
border-radius: 3px;
text-shadow: 1px 1px 0px #000;
transform: translate(-50%,-50%);
} 
</style>
</head> 
<body>

<h1>径向动画菜单效果演示</h1>

<div class="navWrap">
<nav>
<a>1</a>
<a>2</a>
<a>3</a>
<a>4</a>
<a>5</a>
<a>6</a>
<a>7</a>
<a>8</a>
</nav>
<a class="main-nav">点我</a>
</div>

<script type="text/javascript">
$(document).ready(function() {
var isLocated = false; //防止重复初始化子菜单位置
$(".navWrap").on('click', '.main-nav', function(event) {
event.preventDefault();
var me = $(this);
var navWrap = me.closest('.navWrap');
var nav = navWrap.find('nav a');
if(!navWrap.hasClass('active')&&!isLocated){ 
//Y=R+Rsinθ
//X=R+Rcosθ
var r = navWrap.width()/2;
var startAngle =0, endAngle=360; //可以通过改变角度,做出各种各样的径向菜单

//子菜单的夹角
var total = nav.length;
var gap = (endAngle - startAngle)/total;

//角度->弧度
var radian = Math.PI/180;

/*
* 计算并确定各个子菜单的最终位置
*/
$.each(nav,function(index, el) {
// 当前子菜单与x轴正向的夹角 θ (角度->弧度)
var myAngle = (startAngle + gap*index) * radian; // θ
var x = r+r*Math.cos(myAngle),//myAngle为弧度
y = r+r*Math.sin(myAngle);
// 设置当前子菜单的位置 (left,top) = (x,y)
$(this).css({
left: x + 'px',
top: y + 'px'
});
});
isLocated = true;
}
navWrap.toggleClass('active');
});
})
</script>
</body>
</html>

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
Jul 08 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
Sep 28 Javascript
自己写的Javascript计算时间差函数
Oct 28 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
Mar 13 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
Jun 12 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
Feb 13 Javascript
javascript将url解析为json格式的两种方法
Aug 18 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
Dec 20 Javascript
详解vue路由篇(动态路由、路由嵌套)
Jan 27 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
Jun 20 Javascript
vue实现绑定事件的方法实例代码详解
Jun 20 Javascript
koa2 用户注册、登录校验与加盐加密的实现方法
Jul 22 Javascript
jquery合并表格中相同文本的相邻单元格
Jul 17 #Javascript
用svg制作富有动态的tooltip
Jul 17 #Javascript
jquery实现根据浏览器窗口大小自动缩放图片的方法
Jul 17 #Javascript
JavaScript调用浏览器打印功能实例分析
Jul 17 #Javascript
JS判断页面是否出现滚动条的方法
Jul 17 #Javascript
javascript图片预加载实例分析
Jul 16 #Javascript
javascript的BOM汇总
Jul 16 #Javascript
You might like
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
javascript import css实例代码
2008/07/18 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
jQuery中ajax的使用与缓存问题的解决方法
2013/12/19 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
jQuery替换textarea中换行的方法
2015/06/10 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
jQuery EasyUI中的日期控件DateBox修改方法
2016/11/09 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
Python 连连看连接算法
2008/11/22 Python
Python创建日历实例
2014/08/21 Python
python实现的文件夹清理程序分享
2014/11/22 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
django富文本编辑器的实现示例
2019/04/10 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
物业管理专业个人的自我评价
2013/11/19 职场文书
半年思想汇报
2013/12/30 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
七年级作文之关于奶奶
2019/10/29 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python