最近在网站项目中,有要求将一组图片绕同心以椭圆周轨迹循环运动,并且图片有从小到大的渐近效果。经过考虑,决定用js实现这个特效。

效果如下:

实现思路:先实现圆周运动,通过设置长边与短边,就能实现椭圆运动了。

首先写html代码,设置容器并附id“container”,然后加上若干图片。

加上适当的样式。最为重要的是将#container设置为相对定位,这样才能使图片的绝对定位以容器为参考对象。

最后当然是重头戏,js代码。首先我们进行分析。

我们先封装一个类。

function gallery(){

this.inti.apply(this,arguments);

}

实现方法each(),其参数接受一个函数,对元素进行遍历,并以元素作为函数上下文调用接受的函数,传递下标参数。

each:function(fn){

for(var i=0;i

fn.call(this.img[i],i);

}

实现方法getPageX(),以事件对象为参数,获得当前鼠标在视口X坐标位置。

getPageX:function(event){

if(event.pageX){

return event.pageX;

}else{

return event.clientX + document.documentElement.scrollLeft - document.documentElement.clientLeft;

}

}

实现方法play(),设置绝对定位值,必须使每个节点的 Math.sin()与Math.cos()进行同步,我们需要设置一个变量,表示时间的变化。然后每个节点都有一个初相,错开时间。

this.style.left=(Math.sin(2*3.14*that.time+2*3.14/that.count*index)+1)*(that.divWidth-that.imgWidth)/2+"px";

this.style.top=(Math.cos(2*3.14*that.time+2*3.14/that.count*index)+1)*(that.divHeight-that.imgHeight)/2+"px";

为体现一点点立体感,图片的大小随转动而变化就更好了。为此同样应用Math.sin()与Math.cos()来改变图片的高与宽。

this.style.width=(Math.cos(2*3.14*that.time+2*3.14/that.count*index)+1)*that.imgWidth/2+that.imgWidth/2+"px";

this.style.height=(Math.cos(2*3.14*that.time+2*3.14/that.count*index)+1)*that.imgHeight/2+that.imgHeight/2+"px";

图片的层叠问题当然要用zIndex属性来解决。

this.style.zIndex=Math.floor((Math.cos(2*3.14*that.time+2*3.14/that.count*index)+1)*10);

最后实现初始化函数inti(),获取所有的图片节点,并获得其长度。

this.img=document.getElementById(id).getElementsByTagName("img");

this.count=this.img.length;

用each()方法把图片设置为绝对定位,这样才能使其进行旋动。

this.each(function(index){

this.style.width=that.imgWidth+"px";

this.style.height=that.imgHeight+"px";

this.style.position="absolute";

})

还要解决一个转动的速度问题,设置一个变量表示圆周运动的周期,并添加一个事件处理程序获取鼠标的位置进而改变周期的值实现速度大小的控制。

最后创建实例,展示动画效果。

new gallery("container");

完整js代码:

function gallery(){

this.inti.apply(this,arguments);

}

gallery.prototype={

/*实现圆周运动效果

* id:包含图片容器id

* divWidth:包含图片容器宽

* divHeight:包含图片容器高

* imgWidth:图片宽

* imgHeight:图片高

* speed:转动速度

*/

inti:function(id,divWidth,divHeight,imgWidth,imgHeight,speed){

var that=this;

this.img=document.getElementById(id).getElementsByTagName("img");

this.count=this.img.length;

this.time=0;

this.rate=speed||0.25;

this.divWidth=divWidth||640;

this.divHeight=divHeight||300;

this.imgWidth=imgWidth||150;

this.imgHeight=imgHeight||100;

this.each(function(index){

this.style.width=that.imgWidth+"px";

this.style.height=that.imgHeight+"px";

this.style.position="absolute";

})

document.οnmοusemοve=function(event){

var event=event||window.event,positionX;

var positionX=that.getPageX(event);

that.rate=(positionX-document.body.clientWidth/2)/(document.body.clientWidth/2)*0.25;

}

this.play();

},

play:function(){

var that=this;

setInterval(function(){

that.time+=that.rate*40/1000;

that.each(function(index){

this.style.left=(Math.sin(2*Math.PI*that.time+2*Math.PI/that.count*index)+1)*(that.divWidth-that.imgWidth)/2+"px";

this.style.top=(Math.cos(2*Math.PI*that.time+2*Math.PI/that.count*index)+1)*(that.divHeight-that.imgHeight)/2+"px";

this.style.width=(Math.cos(2*Math.PI*that.time+2*Math.PI/that.count*index)+1)*that.imgWidth/2+that.imgWidth/2+"px";

this.style.height=(Math.cos(2*Math.PI*that.time+2*Math.PI/that.count*index)+1)*that.imgHeight/2+that.imgHeight/2+"px";

this.style.zIndex=Math.floor((Math.cos(2*Math.PI*that.time+2*Math.PI/that.count*index)+1)*10);

})

},40);

},

getPageX:function(event){

if(event.pageX){

return event.pageX;

}else{

return event.clientX + document.documentElement.scrollLeft - document.documentElement.clientLeft;

}

},

each:function(fn){

for(var i=0;i

fn.call(this.img[i],i);

}

}

new gallery("container");

以上js代码就成功实现了将一组图片做同心椭圆周运动、可以使用鼠标拨动控制转速,而且图片有渐近立体效果。

声明:如需转载,请注明来源于www.webym.net并保留原文链接:http://www.webym.net/jiaocheng/355.html

js实现椭圆轨迹_用js实现一组图片同心椭圆周运动 图片有从小到大渐近效果相关推荐

  1. js实现椭圆轨迹_【CSON原创】javascript椭圆旋转相册发布

    功能说明: 1.支持自动和手动两种模式:自动模式下自动旋转展示,手动模式下通过鼠标选择当前图片,或通过提供的接口选择上一张/下一张图片. 2.可自行添加旋转的缓动模式,默认模式为:匀速,先快后慢,先慢 ...

  2. js实现椭圆轨迹_华为开发者大会2020隆重召开,亿健T10椭圆机荣耀参展

    引言:万众瞩目的华为开发者大会2020(HDC·Together)于2020年9月10日在东莞松山湖隆重拉开帷幕.第一天的主题演讲中,华为带来了HarmonyOS 2.0.EMUI 11.HMS.HU ...

  3. js 模拟点击_爬虫js逆向之无限debugger--抖音第三方数据分析平台的坑

    爬虫js逆向系列 我会把做爬虫过程中,遇到的所有js逆向的问题分类展示出来,以现象,解决思路,以及代码实现,这三方面解析,供大家参考爬虫认知 在程序猿所有的方向中,爬虫是离money最近的一个方向,你 ...

  4. jsx怎么往js里传参数_给js文件传参数(详解)

    一.利用全局变量 这是最简单的一种方式,比如Google Adsense: 缺点是引入了全局变量.其中引入文件的方式还有两个变体: // 变体1:用document.write输出 document. ...

  5. js实现椭圆轨迹_Canvas实现直线与圆形的物理运动效果

    导语:之前写过几篇关于canvas实现圆环动画的文章,例如这篇:canvas绘制旋转的圆环百分比进度条和使用HTML5 Canvas arc()绘制圆形/圆环,实现方法是通过循环绘制圆环(圆饼)等来实 ...

  6. java web网站 js 简体繁体切换_通过JS实现网站繁体简体互换

    //网页简繁体转换//本js用于客户在网站页面选择繁体中文或简体中文显示,默认是正常显示,即简繁体同时显示//在用户第一次访问网页时,会自动检测客户端语言进行操作并提示.此功能可关闭//本程序只在UT ...

  7. js控制鼠标移动_原生JS封装可拖拽效果

    项目代码已上传码云:小朋友/JavaScript 封装可拖拽特效 访问该URL可查看效果:http://is666a.gitee.io/javascript_drag/ https://www.zhi ...

  8. js encodeurl java接收_在JS中encodeURI(url)怎样才能不出现乱码?

    这次给大家带来在JS中encodeURI(url)怎样才能不出现乱码?,在JS中使用encodeURI(url)的注意事项有哪些,下面就是实战案例,一起来看一下. 一般情况下, 发送 encodeUR ...

  9. js 时间加减_【JS】550 简单几步让你的 JS 写得更漂亮

    作者:会编程的银猪 http://www.renfed.com/2017/04/29/effective-js-optimize/ 网上有不少关于 JS 编写优化建议,这里我根据自己的经验提出一些比较 ...

  10. js 取得数组下标_剖析JS和Redis的数据结构设计:数组

    语言的数据结构相通性 最近读了Redis的原理实现,感受到程序语言的相通性,只要你掌握了语言的共性,触类旁通其他语言的开发就变得非常简单了. 总体来说,各种程序语言底层的设计思想是非常相通的,首先针对 ...

最新文章

  1. 保姆级NLP学习路线来啦!
  2. c语言中throw的用法,C中的内联throw()方法
  3. html中设置文本框长度,Html的文本框怎样限制录入文本框的字节长度
  4. python 语言教程(1)前言
  5. qq应用之超级店长数据分析
  6. 如何使用ActionScript来检测用户的操作系统种类及浏览器类型
  7. Java 建模:UML 工作簿,第 1 部分
  8. 如何获取当前C#程序所有线程的调用栈信息 ?
  9. Java中的List你真的会用吗
  10. 来华30载,这些都是Oracle的神来之笔……
  11. java 两个对象合并_Java 对象按照多个属性来合并。
  12. adt变频器故障代码ol2_误诊实例换来的变频器维修经验
  13. Python(二)JavaPython混合编程
  14. Simulink嵌入式自动代码DSP F28335(4)——SVPWM
  15. smplayer变成电视操作步骤
  16. (四十七) 蓝牙自拍杆原理学习
  17. Sophix热修复问题以及加固
  18. HCIE大师之路(二)——IPSec Over GRE综合实验
  19. 硬盘分区格式GPT与MBR无损互相转换而不破坏硬盘存储资料
  20. 我真的很郁闷,应该振作起来的

热门文章

  1. 电路串联和并联图解_画简单的串联、并联电路图
  2. Java扫码登录原理
  3. SICK CLV650-6000固定式扫码枪参数配置
  4. 【Unity】Unity Shader学习笔记(一)Unity Shader基础
  5. js实现视频截图,并通过post请求发送图片
  6. Immervision推出由计算机视觉社区开发的首台具有智能视觉的仿人机器人JOYCE
  7. 把window的鼠标指针改成Mac的
  8. RaspberrIPCam – Full HD IP Camera based on Raspberry Pi
  9. armbian 斐讯n1_斐讯N1刷入Armbian(linux)或者电视盒子系统
  10. Ubuntu 18.04安装c++版OpenCV4