基于javascript实现按圆形排列DIV元素(二)


Posted in Javascript onDecember 02, 2016

一、原理分析

1.1怎么才能让DIV元素动起来?

动起来的实质,就是改变DIV的位置,也就是改变其left和top值;

  2.2怎么上DIV元素动起来的时候,是在规定的圆周上面?

通过上一次的分析,让DIV按圆形排队,我们知道了,如要让DIV定位在圆周上面,主要是根据角度(弧度)来实现的。

看下图:

基于javascript实现按圆形排列DIV元素(二)

上图中,我们B元素和C元素的定位是如何实现的?根据上一次讲的公式,如下:

(index:元素的索引值,radius半径,dotLeft:圆心的横坐标,dotTop:圆心的纵坐标)

B的left = Math.sin((ahd*Bindex))*radius+dotLeft
B的top = Math.cos((ahd*Bindex))*radius+dotTop
C的left = Math.sin((ahd*Cindex))*radius+dotLeft
C的top = Math.cos((ahd*Cindex))*radius+dotTop

从公式中可以看出,都一样,只是B和C的index,即索引值不一样,从而让角度(弧度)数不一样,结果就是正弦和余弦的值不一样,所以定位也就不一样了,但结果都是在这个圆周上变化。不会跑离这个圆周;

如果我现在想让B元素,定位到C元素的位置,该怎么做呢?

就是让B元素的角度(弧度)和C元素的一样,然后,套用上面的公式,就可以了。

B元素的现在的用的圆心角,是AOB,C元素用的圆心角,是AOC;  B元素和C元素之间相差了上图中BOC这个角度(弧度)值,也就是两个蓝色线条之间的角度(弧度);

得出结论:改变角度(弧度)就可以让元素在圆周上改变位置;

二、实例分析

根据上面的分析,我们已经知道如何在圆周上,改变DIV的位了;现在我们要做的就是怎么去改变才能让元素看起来是在运动?

是“速度”;有运动就会有速度

速度就是在规定时间内移动的距离:速度 = 距离/时间

速度太快就是“瞬间移动”让B移动到C;

速度慢,就可以看到B一点点向C的位置移动;

时间:在Javascript里的时间:就是用的setInterval(....,时间) 

例如:setInterval(移动,1000)  我们规定间隔1000毫秒,让元素做移动。

在本例中的移动:就是改变DVI的left和TOP值,而要改变这个值,需要用到上面的圆周上移动的公式;

速度:设一个速度 speed = 5;

这里的5,就是角度,即让圆心角,每1000毫秒,变化5度。

speed =  speed*Math.PI/180;将这个变化的角度转换成弧度,因为Math.sin只接受弧度单位的参数;

得出:

function 移动(){
speed ++

left = Math.sin((ahd*Bindex+speed ))*radius+dotLeft;

Math.cos((ahd*Bindex+speed))*radius+dotTop
}

三、实现代码:

$(function(){
 //中心点横坐标
 var dotLeft = ($(".container").width()-$(".dot").width())/2;
 //中心点纵坐标
 var dotTop = ($(".container").height()-$(".dot").height())/2;
 //起始角度
 var stard = 0;
 //半径
 var radius = 200;
 //每一个BOX对应的角度;
 var avd = 360/$(".box").length;
 //每一个BOX对应的弧度;
 var ahd = avd*Math.PI/180;
 //运动的速度
 var speed = 2;
 //设置圆的中心点的位置
 $(".dot").css({"left":dotLeft,"top":dotTop});
 //设置DIV圆形排列
 $(".box").each(function(index, element){
 $(this).css({"left":Math.sin((ahd*index))*radius+dotLeft,"top":Math.cos((ahd*index))*radius+dotTop});
 });
 //运动函数
 var fun_animat = function(){ 
 speed = speed<360?speed:2; 
 //运运的速度
 speed+=2;
 //运动距离,即运动的弧度数;
 var ainhd = speed*Math.PI/180; 
 //按速度来定位DIV元素
 $(".box").each(function(index, element){
 $(this).css({"left":Math.sin((ahd*index+ainhd))*radius+dotLeft,"top":Math.cos((ahd*index+ainhd))*radius+dotTop});
 });
 }
 //定时调用运动函数
 var setAnimate = setInterval(fun_animat,100);
 })

    其实也可以反过来思考,即每1000毫秒,我们获得圆周上的一个坐标点,将这个点的left和TOP值,赋给,需要改变位置,即运动的DIV元素!~~

以上就是本文的全部内容,希望对大家有所帮助,有兴趣的朋友可以参考文章《基于javascript实现按圆形排列DIV元素(一)》和《基于javascript实现按圆形排列DIV元素(三)》,谢谢对三水点靠木的支持!

Javascript 相关文章推荐
关于B/S判断浏览器断开的问题讨论
Oct 29 Javascript
13 个JavaScript 性能提升技巧分享
Jul 26 Javascript
jquery div 居中技巧应用介绍
Nov 24 Javascript
使用js简单实现了tree树菜单
Nov 20 Javascript
在Linux上用forever实现Node.js项目自启动
Jul 09 Javascript
js实现精确到秒的日期选择器完整实例
Apr 30 Javascript
JavaScript面向对象分层思维全面解析
Nov 22 Javascript
javascript常用经典算法详解
Jan 11 Javascript
vue 中自定义指令改变data中的值
Jun 02 Javascript
require.js中的define函数详解
Jul 10 Javascript
将RGB值转换为灰度值的简单算法
Oct 09 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
Jul 22 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 #Javascript
Bootstrap Modal对话框如何在关闭时触发事件
Dec 02 #Javascript
基于javascript实现按圆形排列DIV元素(一)
Dec 02 #Javascript
关于Function中的bind()示例详解
Dec 02 #Javascript
bootstrap模态框消失问题的解决方法
Dec 02 #Javascript
谈谈因Vue.js引发关于getter和setter的思考
Dec 02 #Javascript
jquery获取input type=text中的值的各种方式(总结)
Dec 02 #Javascript
You might like
php实现多维数组中每个单元值(数字)翻倍的方法
2015/02/16 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
JS获取url链接字符串 location.href
2013/12/23 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
python网络编程之读取网站根目录实例
2014/09/30 Python
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
在centos7中分布式部署pyspider
2017/05/03 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python装饰器常见使用方法分析
2019/06/26 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
Pytorch转tflite方式
2020/05/25 Python
Python 必须了解的5种高级特征
2020/09/10 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
益模软件Java笔试题
2012/03/27 面试题
幼儿园大班区域活动总结
2014/07/09 职场文书
幼儿园开学通知
2015/04/24 职场文书
高中班主任心得体会
2016/01/07 职场文书