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


Posted in Javascript onDecember 02, 2016

$(this).css({"left":Math.sin((ahd*index+ainhd))*radius+dotLeft,"top":Math.cos((ahd*index+ainhd))*radius+dotTop});

效果图:

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

分析图:

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

上图中:

黑色:是外层容器;

黄色:是需要按椭圆运动的图片

橙色:每个图片元素距离容器顶部的距离

紫色:长半径或短半径;

蓝色:图片距离容器顶部最大的距离

绿色:坐标轴;

白色:椭圆运动轨迹;

一、原理分析:

1.1按椭圆运运

前面两个随笔分析了“圆形排列”和“按圆形运动”,知道了“排列”和“运动”这两个以后,再来看这个实例应该就有基础了。

根据前面一篇随笔的分析,圆形运去的公式如下:

$(this).css({"left":Math.sin((ahd*index+ainhd))*radius+dotLeft,"top":Math.cos((ahd*index+ainhd))*radius+dotTop});

(如果不清楚这个公式,可以看前面写的一篇“运动”);

现在我们是要按椭圆运运,还能不能套用上面的公式呢??

可以,但……需要有点点变化.

  椭圆和圆形的区别是什么?

是半径;圆只有一个半径,而椭圆有两个,一个长半径,一个短半径,如上图中的OA和OB,紫色线段;

所以公式里面半径需要替换成,长半径和短半径;其它都无变化,如下:

$(this).css({"left":Math.sin((ahd*index+ainhd))*OB+dotLeft,"top":Math.cos((ahd*index+ainhd))*OA+dotTop});

2.2 排列时宽度和透明度的变化

椭圆里排列的图片,宽度和透明度的变化有什么规律,或者说是特点?

是距离容器顶部的距离;如上图中,橙色的线段长度。通过观察发现,在运运过程中,具有相同长度的橙色线段的图片,应该具有相同的宽度、高度、透明度。

那么我们就通过这个橙色线段的,来设定图片的宽、高、透明度;

这里的宽、高、透明度的变化是一个比例的变化,所以我们需要一个比例值,这个比例值为1的时候,去乘以图片的宽和高,就是图片原始的大小,如果比例值小于1,那么图片的宽度就应该是小于正常图片的大小。

  如何得到这个比例值?

用橙色线段的长度,去除以蓝色线段的长度; 因为蓝色线段的长度是橙色线段的最大长度;,所以这个比例值,是在0-1之间的数;同时也满足上面提到的,相同橙色的线段长度,应该有相同的宽、高、透明度;

如下公式是求出每一个图片的距离顶部的值,即上图中橙色线估的长度;

(Math.cos((ahd*index+ainhd))*b+dotTop)

如下公式是求出这个关键的比例值allpers,而这个totpop是上图中蓝色线的长度,也就是橙色的最大长度值

var allpers = (Math.cos((ahd*index+ainhd))*b+dotTop)/totTop;

因为这个比例值是根据橙色线段的长度得来的。(蓝色线段的值,是固定的,橙色线段的值,是在运动中变化的),所以用它去乘以宽、高、透明度就是可以实现,运动中“相同长度的橙色线段的图片,应该具有相同的宽度、高度、透明度。”

因为最小值可能是0.000几,所以要用一个函数处理下:

var wpers = Math.max(0.1,allpers);
var hpers = Math.max(0.1,allpers);
$(this).css({
     "width":wpers*wid,
     "height":hpers*hei,
     "opacity":allpers
    });

2.3 索引值

视觉上距离我们最近的图片,应该是在最上层,即绝对定位的z-index应该是最大,反之而最小,因为这个值也是随图片运动而变化的,所以我们就用到上面的allpers比例值,这个值是0-1之间的,所以我们再用一个函数处理一下:

Math.ceil(allpers*10),让其值在1-10之间

(因为我们这里正好是十个图片,如果多了,这个公式需要变化一下)

三、完整代码

$(function(){
  //中心点横坐标
  var dotLeft = ($(".container").width()-$(".dot").width())/2-100;
  //中心点纵坐标
  var dotTop = ($(".container").height()-$(".dot").height())/2-100;
  //椭圆长边
  a = 460;
  //椭圆短边
  b = 120;
  //起始角度
  var stard = 0;
  //每一个BOX对应的角度;
  var avd = 360/$(".container img").length;
  //每一个BOX对应的弧度;
  var ahd = avd*Math.PI/180;
  //运动的速度
  var speed = 2;
  //图片的宽高
  var wid = $(".container img").width();
  var hei = $(".container img").height();
  //总的TOP值
  var totTop = dotTop+100;
  //设置圆的中心点的位置
  $(".dot").css({"left":dotLeft,"top":dotTop});
  //运动函数
  var fun_animat = function(){ 
   speed = speed<360?speed:2;
   //运运的速度
   speed+=2;
   //运动距离,即运动的弧度数;
   var ainhd = speed*Math.PI/180; 
   //按速度来定位DIV元素
   $(".container img").each(function(index, element){
    var allpers = (Math.cos((ahd*index+ainhd))*b+dotTop)/totTop;
    var wpers = Math.max(0.1,allpers);
    var hpers = Math.max(0.1,allpers);
    $(this).css({
     "left":Math.sin((ahd*index+ainhd))*a+dotLeft,
     "top":Math.cos((ahd*index+ainhd))*b+dotTop,
     "z-index":Math.ceil(allpers*10),
     "width":wpers*wid,
     "height":hpers*hei,
     "opacity":allpers
    });
    });
  }
  //定时调用运动函数
  var setAnimate = setInterval(fun_animat,100);
 })

    弄清原理后,代码量其实很少!~~

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

Javascript 相关文章推荐
js 禁用浏览器的后退功能的简单方法
Dec 10 Javascript
JavaScript 编写匿名函数的几种方法
Feb 21 Javascript
jQuery的live()方法对hover事件的处理示例
Feb 27 Javascript
jQuery的选择器中的通配符使用介绍
Mar 20 Javascript
一个简单的全屏图片上下打开显示网页效果示例
Jul 08 Javascript
批量修改标签css样式以input标签为例
Jul 31 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
Feb 20 Javascript
JavaScript无缝滚动效果的实例代码
Mar 27 Javascript
javascript实现文件拖拽事件
Mar 29 Javascript
jQuery实现常见的隐藏与展示列表效果示例
Jun 04 jQuery
深入浅出理解JavaScript闭包的功能与用法
Aug 01 Javascript
Angular CLI 使用教程指南参考小结
Apr 10 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
Dec 02 #Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
Nov 30 #Javascript
js 动态生成json对象、时时更新json对象的方法
Dec 02 #Javascript
详解JavaScript中数组的reduce方法
Dec 02 #Javascript
基于javascript实现按圆形排列DIV元素(二)
Dec 02 #Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 #Javascript
Bootstrap Modal对话框如何在关闭时触发事件
Dec 02 #Javascript
You might like
用PHP制作静态网站的模板框架(一)
2006/10/09 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
基于jQuery的倒计时实现代码
2012/05/30 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
使用Python抓取模板之家的CSS模板
2015/03/16 Python
浅谈Python单向链表的实现
2015/12/24 Python
详谈python http长连接客户端
2017/06/12 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
施工班组长岗位职责
2014/01/05 职场文书
活动邀请函范文
2014/01/19 职场文书
孩子教育的心得体会
2014/09/01 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL