首页 > 编程语言 >JavaScript(07): 实例3---Google Eye

JavaScript(07): 实例3---Google Eye

时间:2023-06-20 13:03:11浏览次数:43  
标签:body Google Eye 07 top myEyes pupil var left


下面的例子源于Google Eye(如下图所示的效果),通过这个例子可以好好体会一下JavaScript的面向对象编程。

JavaScript(07): 实例3---Google Eye_javascript

<!DOCTYPE html>
<html>
	<head>
		<title>Google Eye</title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<style>
			#l_pupil, #r_pupil {
				position: relative; /* the position of pupil is relative to its container eye*/
				width: 15px;
				height: 15px;
				left: 52px;
				top: 52px;
			}
		</style>
	</head>

	<body>
	<table cellpadding="0" cellspacing="0" border="0" align="center" style="margin-top:20px;" >
		<tr>
			<td background="eye-r.gif">
				<div style="width:117px;height:117px;">
					<img src="pupil.gif" id="l_pupil" />
				</div>
			</td>
			<td background="eye-y.gif">
				<div style="width:117px;height:117px;">
					<img src="pupil.gif" id="r_pupil" />
				</div>
			</td>
		</tr>
	</table>
	<script type="text/javascript">
		var myEyes = { 
			EyeRadius: 55,		/* radius of eye */
			PupilRadius: 7,		/* radius of pupil */
			MAX_DISTANCE: 38,	/* to control the pupil not out of eye */
			body: document.documentElement || document.body /* browser compatible */
		};

		myEyes.STATCK = [];	// array to store two pupils
		myEyes.$ = function(id) { 
			return document.getElementById(id); 
		};    
		myEyes.getMousePosition = function(e) {
			return {
				left: e.clientX + myEyes.body.scrollLeft, 
				top: e.clientY + myEyes.body.scrollTop 
			};
		};
		myEyes.getObjectPosition = function(elem) {
			var rect = elem.getBoundingClientRect();
			return {
				left: rect.left + myEyes.body.scrollLeft, top: rect.top + myEyes.body.scrollTop 
			};
		}
		myEyes.init = function() {
			myEyes.STATCK = [
				myEyes.$('l_pupil'), 
				myEyes.$('r_pupil')
			];
			document.onmousemove = function(e) { 
				myEyes.mouseMove(e || window.event);
			}
		};
		myEyes.mouseMove = function(e) {
			for(var i = 0, len = myEyes.STATCK.length; i < len; i++) {
				var pupil = myEyes.STATCK[i];
				var dx = myEyes.getMousePosition(e).left - myEyes.getObjectPosition(pupil.parentNode).left - myEyes.PupilRadius;
				var dy = myEyes.getMousePosition(e).top - myEyes.getObjectPosition(pupil.parentNode).top - myEyes.PupilRadius;
				var distance = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
				/* 
					if the distance between mouse pointer and eye is greater than constant
					MAX_DISTANCE, it's a good idea to zoom out the distance by proportion 
				*/
				if(distance > myEyes.MAX_DISTANCE) {
					var scale = myEyes.MAX_DISTANCE / distance;
					dx *= scale; 
					dy *= scale;
				}
				pupil.style.left = parseInt(dx + myEyes.EyeRadius - myEyes.PupilRadius) + 'px';
				pupil.style.top = parseInt(dy + myEyes.EyeRadius - myEyes.PupilRadius) + 'px';
			}
		};

		myEyes.init();
	</script>
	</body>
</html>


如果你看懂了,那么你的JavaScript应该很不错的:)代码中对对象表达式的使用、方法的动态绑定以及37行短路运算都是亮点……



标签:body,Google,Eye,07,top,myEyes,pupil,var,left
From: https://blog.51cto.com/u_16166070/6521811

相关文章

  • 20230407 11.1. 散列表
    引入概念已知的几种查找方法:查找方法时间复杂度顺序查找O(N)二分查找(静态查找)\(O(log_2N)\)二叉搜索树O(h)h为二叉查找树的高度平衡二叉树\(O(log_2N)\)【问题】如何快速搜索到需要的关键词?如果关键词不方便比较怎么办?查找的本质:已知对象找位置......
  • PAT_Advanced Level_1078 Hashing (25分)(C++_Hush_平方探测法)
    Thetaskofthisproblemissimple:insertasequenceofdistinctpositiveintegersintoahashtable,andoutputthepositionsoftheinputnumbers.ThehashfunctionisdefinedtobeH(key)=key%TSizewhereTSizeisthemaximumsizeofthehashtable.Qu......
  • TensorFlow07 神经网络-自定义网络
    ▪keras.Sequential▪keras.layers.Layer▪keras.Model1keras.Sequential这样就完成了五层的神经网络的一个搭建,然后我们在activation中也可以指定每一层的激活函数2model.trainable_variables▪model.trainable_variables▪model.call()model.trainable_variabl......
  • 【资料分享】全志科技T507-H评估板规格书(4核ARM Cortex-A53,主频1.416GHz)
    1评估板简介创龙科技TLT507-EVM是一款基于全志科技T507-H处理器设计的4核ARMCortex-A53国产工业评估板,主频高达1.416GHz,由核心板和评估底板组成。核心板CPU、ROM、RAM、电源、晶振等所有器件均采用国产工业级方案,国产化率100%。同时,评估底板大部分元器件亦采用国产工业级方案。......
  • 全志科技T507-H工业核心板规格书(4核ARM Cortex-A53,主频1.416GHz)
    1核心板简介创龙科技SOM-TLT507是一款基于全志科技T507-H处理器设计的4核ARMCortex-A53全国产工业核心板,主频高达1.416GHz。核心板CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案,国产化率100%。核心板通过邮票孔连接方式引出MIPICSI、HDMIOUT、RGBDISPLAY、LV......
  • 单例模式-07
    概述单例模式(SingletonPattern)又称单件模式、单态模式。确保一个类只能有一个实例,同时保证该类的实例只能在类内部创建,提供给整个系统使用。优点:节约系统资源,提高系统性能。缺点:扩展困难,一定程度上违反了“单一职责原则”。classSingleton{privatestaticSingleton......
  • React - 07 类组件的渲染逻辑
    1.ES6类的知识ES6类的继承2.创建类组件创建类组件创建一个构造函数(类)+要求必须继承React.Component/PureComponent这个类+我们习惯于使用ES6中的class创建类「因为方便」+必须给当前类设置一个render的方法「放在其原型上」:在render方法中,返回需要渲染的......
  • 07. centos使用yum方式安装redis
    一、在CentOS和RedHat系统中,首先添加EPEL仓库,然后更新yum源:sudoyuminstallepel-releasesudoyumupdate(可不更新)二、然后安装Redis数据库:sudoyum-yinstallredis安装好后启动Redis服务即可:sudosystemctlstartredis这里同样可以使用redis-cli进入Redis命令行......
  • v072冒险岛sf开发周记(一)
      上周末的时候看到tx代理了冒险岛手游,但是又还没上线,便回忆起自己从前玩冒险岛的时光。那时候和邻居哥哥们,和同学一起玩,只有冒险家职业,消磨了很多的时光,也认识了一些友善的网络好友,虽然打怪升级真的很慢,也没有好装备很菜,但是和朋友们一起玩的时候还是很快乐的,一起刷刷刷。也......
  • 学习《操作系统导论》07
    分段根据前面介绍到的基址+界限寄存器对的方式,虽然很好的解决了地址转换的问题,但是可以看到,它也带来了一个问题:内存浪费。根据前面介绍到的那种内存分配处理方式,堆和栈之间会有大量的空闲空间,而前面的介绍中,这些空间都会被一次性装入内存中,那在程序运行的初期,就会有大量没有被使......