1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > JS JQuery实现简单的鼠标移动动画效果

JS JQuery实现简单的鼠标移动动画效果

时间:2020-07-07 08:07:25

相关推荐

JS JQuery实现简单的鼠标移动动画效果

JS JQuery实现简单的鼠标移动动画效果

说明:

之前看到过很多别人写的的网页鼠标特效,感觉很炫酷。

但是那些都涉及到复杂的数学知识和逻辑,我没有能力写出类似的鼠标效果,于是我仿照一般的显示鼠标移动轨迹特效,使用js和dom元素写出了一个简单的鼠标移动效果。

其中涉及到的知识并不复杂,只需要熟悉js和jquery即可。

运行效果:

思路:

主要是给document对象添加mousemove鼠标移动事件,创建并操控记录鼠标位置的div。

程序中用到了旋转效果,因此除jquery外还需要引入jQueryRotate这个jquery旋转动画库。

该程序不需要依赖css样式,故除jquery和jQueryRotateCompressedz库外,只需要引入一个js文件即可在网页中使用该效果。

需要注意的是,虽然这个程序只是一个逻辑简单的鼠标移动效果,但在鼠标移动时依然会消耗较多的电脑性能。因为在鼠标移动时浏览器会同时处理三个定时器和一个鼠标移动事件,在几乎每个步骤中还会对dom元素数组中的每一个元素都进行操作。

这显然是需要进行优化的,但我目前还没有学会能够进一步优化的方法。

代码:

jQueryRotateCompressed jQuery旋转动画库压缩代码

// VERSION: 2.3 LAST UPDATE: 11.07./** Licensed under the MIT license: /licenses/mit-license.php** Made by Wilq32, wilq32@, Wroclaw, Poland, 01.* Website: */(function(k){for(var d,f,l=document.getElementsByTagName("head")[0].style,h=["transformProperty","WebkitTransform","OTransform","msTransform","MozTransform"],g=0;g<h.length;g++)void 0!==l[h[g]]&&(d=h[g]);d&&(f=d.replace(/[tT]ransform/,"TransformOrigin"),"T"==f[0]&&(f[0]="t"));eval('IE = "v"=="\v"');jQuery.fn.extend({rotate:function(a){if(0!==this.length&&"undefined"!=typeof a){"number"==typeof a&&(a={angle:a});for(var b=[],c=0,d=this.length;c<d;c++){var e=this.get(c);if(e.Wilq32&&e.Wilq32.PhotoEffect)e.Wilq32.PhotoEffect._handleRotation(a);else{var f=k.extend(!0,{},a),e=(new Wilq32.PhotoEffect(e,f))._rootObj;b.push(k(e))}}return b}},getRotateAngle:function(){for(var a=[0],b=0,c=this.length;b<c;b++){var d=this.get(b);d.Wilq32&&d.Wilq32.PhotoEffect&&(a[b]=d.Wilq32.PhotoEffect._angle)}return a},stopRotate:function(){for(var a=0,b=this.length;a<b;a++){var c=this.get(a);c.Wilq32&&c.Wilq32.PhotoEffect&&clearTimeout(c.Wilq32.PhotoEffect._timer)}}});Wilq32=window.Wilq32||{};Wilq32.PhotoEffect=function(){return d?function(a,b){a.Wilq32={PhotoEffect:this};this._img=this._rootObj=this._eventObj=a;this._handleRotation(b)}:function(a,b){this._img=a;this._onLoadDelegate=[b];this._rootObj=document.createElement("span");this._rootObj.style.display="inline-block";this._rootObj.Wilq32={PhotoEffect:this};a.parentNode.insertBefore(this._rootObj,a);if(plete)this._Loader();else{var c=this;jQuery(this._img).bind("load",function(){c._Loader()})}}}();Wilq32.PhotoEffect.prototype={_setupParameters:function(a){this._parameters=this._parameters||{};"number"!==typeof this._angle&&(this._angle=0);"number"===typeof a.angle&&(this._angle=a.angle);this._parameters.animateTo="number"===typeof a.animateTo?a.animateTo:this._angle;this._parameters.step=a.step||this._parameters.step||null;this._parameters.easing=a.easing||this._parameters.easing||this._defaultEasing;this._parameters.duration=a.duration||this._parameters.duration||1E3;this._parameters.callback=a.callback||this._parameters.callback||this._emptyFunction;this._parameters.center=a.center||this._parameters.center||["50%","50%"];this._rotationCenterX="string"==typeof this._parameters.center[0]?parseInt(this._parameters.center[0],10)/100*this._imgWidth*this._aspectW:this._parameters.center[0];this._rotationCenterY="string"==typeof this._parameters.center[1]?parseInt(this._parameters.center[1],10)/100*this._imgHeight*this._aspectH:this._parameters.center[1];a.bind&&a.bind!=this._parameters.bind&&this._BindEvents(a.bind)},_emptyFunction:function(){},_defaultEasing:function(a,b,c,d,e){return-d*((b=b/e-1)*b*b*b-1)+c},_handleRotation:function(a,b){d||plete||b?(this._setupParameters(a),this._angle==this._parameters.animateTo?this._rotate(this._angle):this._animateStart()):this._onLoadDelegate.push(a)},_BindEvents:function(a){if(a&&this._eventObj){if(this._parameters.bind){var b=this._parameters.bind,c;for(c in b)b.hasOwnProperty(c)&&jQuery(this._eventObj).unbind(c,b[c])}this._parameters.bind=a;for(c in a)a.hasOwnProperty(c)&&jQuery(this._eventObj).bind(c,a[c])}},_Loader:function(){return IE?function(){var a=this._img.width,b=this._img.height;this._imgWidth=a;this._imgHeight=b;this._img.parentNode.removeChild(this._img);this._vimage=this.createVMLNode("image");this._vimage.src=this._img.src;this._vimage.style.height=b+"px";this._vimage.style.width=a+"px";this._vimage.style.position="absolute";this._vimage.style.top="0px";this._vimage.style.left="0px";this._aspectW=this._aspectH=1;this._container=this.createVMLNode("group");this._container.style.width=a;this._container.style.height=b;this._container.style.position="absolute";this._container.style.top="0px";this._container.style.left="0px";this._container.setAttribute("coordsize",a-1+","+(b-1));this._container.appendChild(this._vimage);this._rootObj.appendChild(this._container);this._rootObj.style.position="relative";this._rootObj.style.width=a+"px";this._rootObj.style.height=b+"px";this._rootObj.setAttribute("id",this._img.getAttribute("id"));this._rootObj.className=this._img.className;for(this._eventObj=this._rootObj;a=this._onLoadDelegate.shift();)this._handleRotation(a,!0)}:function(){this._rootObj.setAttribute("id",this._img.getAttribute("id"));this._rootObj.className=this._img.className;this._imgWidth=this._img.naturalWidth;this._imgHeight=this._img.naturalHeight;var a=Math.sqrt(this._imgHeight*this._imgHeight+this._imgWidth*this._imgWidth);this._width=3*a;this._height=3*a;this._aspectW=this._img.offsetWidth/this._img.naturalWidth;this._aspectH=this._img.offsetHeight/this._img.naturalHeight;this._img.parentNode.removeChild(this._img);this._canvas=document.createElement("canvas");this._canvas.setAttribute("width",this._width);this._canvas.style.position="relative";this._canvas.style.left=-this._img.height*this._aspectW+"px";this._canvas.style.top=-this._img.width*this._aspectH+"px";this._canvas.Wilq32=this._rootObj.Wilq32;this._rootObj.appendChild(this._canvas);this._rootObj.style.width=this._img.width*this._aspectW+"px";this._rootObj.style.height=this._img.height*this._aspectH+"px";this._eventObj=this._canvas;for(this._cnv=this._canvas.getContext("2d");a=this._onLoadDelegate.shift();)this._handleRotation(a,!0)}}(),_animateStart:function(){this._timer&&clearTimeout(this._timer);this._animateStartTime=+new Date;this._animateStartAngle=this._angle;this._animate()},_animate:function(){var a=+new Date,b=a-this._animateStartTime>this._parameters.duration;if(b&&!this._parameters.animatedGif)clearTimeout(this._timer);else{if(this._canvas||this._vimage||this._img)a=this._parameters.easing(0,a-this._animateStartTime,this._animateStartAngle,this._parameters.animateTo-this._animateStartAngle,this._parameters.duration),this._rotate(~~(10*a)/10);this._parameters.step&&this._parameters.step(this._angle);var c=this;this._timer=setTimeout(function(){c._animate.call(c)},10)}this._parameters.callback&&b&&(this._angle=this._parameters.animateTo,this._rotate(this._angle),this._parameters.callback.call(this._rootObj))},_rotate:function(){var a=Math.PI/180;return IE?function(a){this._angle=a;this._container.style.rotation=a%360+"deg";this._vimage.style.top=-(this._rotationCenterY-this._imgHeight/2)+"px";this._vimage.style.left=-(this._rotationCenterX-this._imgWidth/2)+"px";this._container.style.top=this._rotationCenterY-this._imgHeight/2+"px";this._container.style.left=this._rotationCenterX-this._imgWidth/2+"px"}:d?function(a){this._angle=a;this._img.style[d]="rotate("+a%360+"deg)";this._img.style[f]=this._parameters.center.join(" ")}:function(b){this._angle=b;b=b%360*a;this._canvas.width=this._width;this._canvas.height=this._height;this._cnv.translate(this._imgWidth*this._aspectW,this._imgHeight*this._aspectH);this._cnv.translate(this._rotationCenterX,this._rotationCenterY);this._cnv.rotate(b);this._cnv.translate(-this._rotationCenterX,-this._rotationCenterY);this._cnv.scale(this._aspectW,this._aspectH);this._cnv.drawImage(this._img,0,0)}}()};IE&&(Wilq32.PhotoEffect.prototype.createVMLNode=function(){document.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{return!document.namespaces.rvml&&document.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),function(a){return document.createElement("<rvml:"+a+' class="rvml">')}}catch(a){return function(a){return document.createElement("<"+a+' xmlns="urn:schemas-:vml" class="rvml">')}}}())})(jQuery);

鼠标移动动画代码:

// 需要配合jquery库和jquery rotate compressed库使用$(() => {// 鼠标元素和样式const moveObj = $(`<div></div>`);moveObj.css({width: '40px', height: '40px', background: 'yellow',position: 'absolute',top: '0', left: '0'});const $body = $('body');// jquery body对象$body.append(moveObj);// 向body中追加鼠标样式元素$body.css('cursor', 'none');// 隐藏bodyconst $doc = $(document);// jquery document对象const moveElements = [], elemAssocArray = [];// 移动效果元素数组, 移动效果元素关联数组const elementsLength = 28;// 移动效果元素数组长度const defDeg = -45;// 效果元素默认旋转角度const timeMs = 46;// 效果元素在屏幕上留存的时间,单位ms// 初始化效果元素数组for (let i = 0; i < elementsLength; i++) {const $element = $('<div></div>');$element.css({width: '30px', height: '30px', // background: 'blue', display: 'none', position: 'absolute',transform: `rotate(${defDeg}deg)`});moveElements[i] = $element;elemAssocArray[i] = {rotateDeg: defDeg, time: timeMs};$body.append($element);}// 颜色数组const colorArray = ['yellow', 'blue', 'red', 'green', 'aquamarine', 'darkblue', 'deepskyblue', 'coral'];const colorArrayLen = colorArray.length;const toFree = (n, m) => parseInt(Math.random() * (m - n) + n);// 生成随机数// document鼠标移动事件let count = 0;let flag = false;$doc.mousemove(e => {// 鼠标样式位置moveObj.css({left: e.pageX - moveObj.width() / 2, top: e.pageY - moveObj.height() / 2});// 移动效果const $moveElement = moveElements[count];if(flag && $moveElement) {$moveElement.css({display: 'block', left: e.pageX - $moveElement.width() / 2, top: e.pageY - $moveElement.height() / 2 ,background: colorArray[toFree(0, colorArrayLen)],// background: 'blue'});$moveElement.rotate({duration: 2000, animateTo: defDeg});elemAssocArray[count].rotateDeg = defDeg;elemAssocArray[count].time = timeMs;count++;if (count >= elementsLength)count = 0;flag = false;}});// 元素显示间隔定时器setInterval(() => flag = true, 13);// 消除元素定时器setInterval(() => {elemAssocArray.forEach((item, index) => (item.time < 0) ? moveElements[index].fadeOut(40) : item.time--);}, 1);// 移动元素旋转动画定时器const rotateTime = 1220;// 旋转时间setInterval(() => {moveElements.forEach((item, index) => {if (item.css('display') === 'none') return;elemAssocArray[index].rotateDeg -= 360;item.rotate({duration: rotateTime, animateTo: defDeg + elemAssocArray[index].rotateDeg});});}, rotateTime);});

欢迎提出意见和建议,感谢支持。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。