A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王海舟 中级黑马   /  2012-9-4 09:22  /  2116 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王海舟 于 2012-9-4 23:35 编辑

代码功能:一个图片跟随鼠标的移动而移动
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.      <title></title>
  5.      <script type="text/javascript">
  6.          document.onmousemove = function () {
  7.              var x = window.event.clientX;
  8.              var y = window.event.clientY;
  9.              var divFox = document.getElementById("divFox");
  10.              if (!divFox) {
  11.                  return;
  12.              }
  13.              divFox.style.left = x+"px";
  14.              divFox.style.top = y+"px";
  15.          };
  16.      </script>
  17. </head>
  18. <body>
  19. <div id="divFox" style="position:absolute">
  20. <img src="images/pic.jpg"/>

  21. 我是一只小狐狸
  22. </div>
  23. </body>
  24. </html>
复制代码
代码中有两个地方值得仔细研究。
第一个地方:
var x = window.event.clientX;
var y = window.event.clientY;
第二个地方:
divFox.style.left = x+"px";
divFox.style.top = y+"px";

最开始的时候,在第二个地方我是这么写的:
divFox.style.left = x;
divFox.style.top = y;  
结果,网页中的图片不会跟随鼠标的移动而移动。

当遇到问题后,我通过设置断点的方式进行了调试,如下图:

可以知道x和y,即window.event.clientX;window.event.clientY;  它们是Number类型的数据。也就是说获得的鼠标光标位置坐标是Number类型的数据。
divFox.style.left和divFox.style.top,即一个标签对象的横纵坐标是一个string字符串类型的数据。
所以,我尝试在其后面加上一个px字符串,如下代码:
divFox.style.left = x+"px";
divFox.style.top = y+"px";  
结果,网页上的图片终于能够顺利的跟随鼠标的移动而移动了。

divFox.style.left = x+"px";
divFox.style.top = y+"px";   
关于以上代码的详解:
我们知道x是一个Number类型,而px是一个字符串常量。它们两者相加会产生怎么样的结果呢?
根据JavaScript引擎的规则,当+号两边一边是一个数值类型的数据,一边是一个字符串类型的数据的时候,会自动将数值类型的数据转换为字符串类型,再进行字符串连接运算。所以最终结果产生的是一个字符串,将这个字符串数据赋值给divFox.style.left

总结:
通过onmousemove事件侦听到的鼠标光标的坐标是一个Number类型的数据。
而Dom中标签元素的left和top属性则是string字符串类型。
在将光标坐标赋值给left和top属性之前,我们需要先在它后面加上一个"px"字符串常量,以达到将其转换为一个字符串的目的。

前面部分算作是自己的经验分享,现在开始提问:
杨中科老师的视频中代码是:
divFox.style.left = x;
divFox.style.top = y;   
即一开始我的写法,但是老师的程序在网页中能够顺利实现图片跟随鼠标的移动而移动。但是我的却不行。
老师用的是VS2008,我用的是VS2010。
我不清楚是不是这个原因造成了不同的结果?还是有其它原因呢?希望大家帮助解惑。。。。。。

评分

参与人数 1技术分 +3 收起 理由
郑文 + 3

查看全部评分

8 个回复

正序浏览
style对应的本来就是css种的相应值,也就是说style里的值就应该是字符串!只不过部分js解释器会对其进行转换...
回复 使用道具 举报
黑马杨凯 发表于 2012-9-5 21:35
只是做个类比,可能我说的不大清楚

汗,我糊涂了,你说的是属性窗口吧,我去菜单栏里找,难怪没找到。:L
还是对VS不够熟悉呀~
回复 使用道具 举报
本帖最后由 黑马杨凯 于 2012-9-5 21:40 编辑

只是做个类比,可能我说的不大清楚

5JUW_L%0%JW}ARK}(JSO@~I.jpg (31.88 KB, 下载次数: 62)

5JUW_L%0%JW}ARK}(JSO@~I.jpg
回复 使用道具 举报
黑马杨凯 发表于 2012-9-4 22:07
你可以从vs 的属性栏里点击style看定位中的设置,默认单位就是px,  估计IE8和之前的IE因该是可以直接翻译出 ...

您说可以查看style的默认单位,具体应该怎么查看呢?(惭愧,没看明白)
回复 使用道具 举报
黑马杨凯 发表于 2012-9-4 22:07
你可以从vs 的属性栏里点击style看定位中的设置,默认单位就是px,  估计IE8和之前的IE因该是可以直接翻译出 ...

谢谢您的帮助,这个问题算是完美解决了。


最后总结巩固一下:(浏览器兼容性问题举例说明~~~)
鼠标光标的坐标(windows.event.clientX)(windows.event.clientY)是一个Number类型的数据。
而Dom中标签元素的left和top属性则是string字符串类型。


在将光标坐标赋值给left和top属性之前,我们需要先在它后面加上一个"px"字符串常量,以达到将其转换为一个字符串的目的,然后才能将这个字符串赋值给left和top属性。


而由于浏览器的兼容性问题,在IE9之前的IE会自动将获得的光标位置数据后面加上"px",所以程序员在将光标位置数据赋值给left和top属性时不用自己加上"px"。但是在IE9和firefox以及Chrome这些浏览器中,浏览器并不会为我们自动加上"px",程序员必须自己手动加上"px"。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黑马杨凯 于 2012-9-4 22:50 编辑

你可以从vs <img>的属性栏里点击style看定位中的设置,默认单位就是px,  估计IE8和之前的IE因该是可以直接翻译出来,执行的时候直接给加上px

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
       这个问题我也遇到过,刚回顾了下,在设定位置时,如果用IE8或者之前版本是可以不加px的,我用的IE9,也出现这个问题,加上px比较好,像ff和Chrome也需要加px的。IE浏览器类似问题好像不少。。。
回复 使用道具 举报
值得学习!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马