说句题外话,虽然博客园嵌入式氛围不行,Web前端氛围还是很好的。我又从 chinaunix 回来了。

<html>
<head>
<script type="text/javascript">
var x;
var y; function $(id){
return document.getElementById(id)
} function mousedown(){
x=event.clientX-$("px").style.pixelLeft;
y=event.clientY-$("px").style.pixelTop;
$("px").style.border="2px solid red";
$("px").onmousemove = mousemove;
} function mouseup(){
$("px").onmousemove = "";
$("px").style.border="";
} function mousemove(){
$("px").style.pixelLeft=event.clientX-x;
$("px").style.pixelTop=event.clientY-y;
} </script>
</head>
<body>
<div id="px" style="position:absolute; left:100px; height:100px; width:100px; background-color:#FF0;"
onmousedown="mousedown()" onmouseup="mouseup()" >
</div>
</body>
</html>

  这是 forevercjl 的一种方法,我试了一下在IE8下正常,但是在最新的Chrome上却无法移动。看了下代码,发现使用了IE特有的 pixel*(如 pixelLeft 等属性),在

w3cschool.cn中我没有找到这个属性具体属于哪个分类,不过在 w3help.org上找到一篇介绍,如下:

BX9024: Firefox 不支持 DOM 元素 style 属性中的 pixel* 属性,并且某些情况下 Webkit 浏览器 pixel* 属性的返回值和 IE 中不同

问题描述

style 属性中以 pixel 字符开头的属性最初是 IE 浏览器私有的,他可能会导致如下兼容问题:
1. Firefox 不支持 style 属性中以 pixel 字符开头的属性;
2. Webkit 内核浏览器以 pixel 字符开头的属性返回值和 IE 中有差异。当值的单位是 "em" 时,Webkit 浏览器返回的值是没有经过 em 单位至 px 单位转换的数字。

造成的影响

使用 HTMLElement.style.pixel* 属性得到相应样式值会导致计算失误或脚本报错。

受影响的浏览器

Firefox Safari Chrome

问题分析

HTMLElement.style.pixel* 属性最初是微软公司为 IE 4.0 以上浏览器制定的特性,他们都是非标准的。

  

  然后,我就一边熟悉 DOM style 属性,一遍查阅w3cschool 发现,在style属性里,关于定位的其实就只有这几个:

属性 描述 IE F O W3C
bottom 设置元素的底边缘距离父元素底边缘的之上或之下的距离 5 1 9 Yes
left 置元素的左边缘距离父元素左边缘的左边或右边的距离 4 1 9 Yes
position 把元素放置在static, relative, absolute 或 fixed 的位置 4 1 9 Yes
right 置元素的右边缘距离父元素右边缘的左边或右边的距离 5 1 9 Yes
top 设置元素的顶边缘距离父元素顶边缘的之上或之下的距离 4 1 9 Yes
zIndex 设置元素的堆叠次序 4 1 9 Yes

然后下面就是只利用上面所有浏览器都支持的 style.left(返回的值包含单位) 和 style.top (返回的值包含单位)改写的。

注意:,该div应该为 绝对定位,且body内只有一个元素,因为 style.top 之类的属性,得到的是相对于父亲的距离,另外 必须给该div 元素的 top 和 left 属性赋值(经过2个星期的JS学习后,回头看时发现这里说的不全面,应该是“必须给该div在style=""中设置top和left才能使用JS的xx.style.top和xx.style.left这种方法访问,否则返回空字符串,详细原因见这篇博文第4部分”,2014年2月25日 21:12:00新增)。

<html>
<head>
<script type="text/javascript">
var x;
var y;
function $(id)
{
return document.getElementById(id)
} function mousedown()
{
x=event.clientX-parseInt($("px").style.left);//style.left返回值类似于:14px,需要parseInt
//alert(x);
y=event.clientY-parseInt($("px").style.top);
//alert(y);
$("px").style.border="2px solid red";
$("px").onmousemove = mousemove;
} function mouseup()
{
$("px").onmousemove = "";
$("px").style.border="";
} function mousemove()
{
$("px").style.left=(event.clientX-x)+"px";//left属性值最好带上明确的px单位
$("px").style.top=(event.clientY-y)+"px";
} </script>
</head> <body>
<div id="px" style="position:absolute; left:100px; top:100px; height:100px; width:100px; background-color:#FF0;"
onmousedown="mousedown()" onmouseup="mouseup()" >
</div>
</body>
</html>

水平所限,有问题还望多多指正啊,不敢误人子弟。

另外也提醒大家看博客文章,莫轻信,实践出真理。

原生JavaScript拖动div兼容多种浏览器的更多相关文章

  1. 真正的让iframe自适应高度 兼容多种浏览器随着窗口大小改变

    今天有朋友问到我关于"iframe自适应高度"的问题,原本以为是很简单的问题,没想到折腾了20分钟才搞定.期间遇到几个问题,要么是高度自适应了,但是当窗口改变时会出现滚动条.也就是 ...

  2. DIV以及图片水平垂直居中兼容多种浏览器

    纯css完美地解决图片以及div垂直水平居中,兼容IE7.0.IE6.0.IE5.5.IE5.0.FF.Opera.Safari具体实现css 如下,感兴趣的朋友可以参考下哈   第一种:全CSS控制 ...

  3. javascript拖动div

    div拖动代码,在用此代码之前,你可能需要将你需要拖动的元素style设置position: absolute; #textareaSavaDiv{ position: absolute; right ...

  4. javascript点击兼容所有浏览器封装

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 简单的鼠标可拖动div 兼容IE/FF

    来源:http://www.cnblogs.com/imwtr/p/4355416.html 作者: 主要思路: 一个div,注册监听onmousedown事件,然后处理获取的对象及其相关值(对象高度 ...

  6. iframe自适应高度(兼容多种浏览器)

    http://jingyan.baidu.com/article/b87fe19eaeb2cf5218356896.html 让iframe自适应高度,下面是实现的源码: <div id=&qu ...

  7. js控制固定div和随屏滚动div兼容多浏览器和纯css控制(来自网络)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. [代码收藏]设为首页和加入收藏的JavaScript代码(兼容多浏览器)

    其实不少非IE内核浏览器都仍不支持通过代码将网页设为主页和加入收藏的功能,因此说是兼容,其实只是一个try,catch后的提醒而已. 加入收藏: /* * author : 2010-12-27 11 ...

  9. window.url.createobjecturl 兼容多种浏览器(IE,google,360,Safari,firefox)

    <script type="text/javascript"> function setImagePreview() { var docObj = document.g ...

随机推荐

  1. Android开发手记(28) Handler和Looper

    Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道.平 ...

  2. c-八进制 转 十进制

    概述 其实x进制转十进制的算法都差不多,不过如果是针对于字符形式,他们却有点不同.使用指针和数组的形式计算,又不同.这里演示将字符型的数组形式的八进制转成十进制: #include <stdio ...

  3. Oracle分区表学习

    (1) 表空间及分区表的概念表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间.分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应 ...

  4. 【转】iOS开发网络篇—发送json数据给服务器以及多值参数

    原文: http://www.cnblogs.com/wendingding/p/3950132.html 一.发送JSON数据给服务器 发送JSON数据给服务器的步骤: (1)一定要使用POST请求 ...

  5. js 模板引擎 - 超级强大

    本来没想写这篇文章,但是网上误导大众的文章太多了,所以今天就抽出半小时时间谈一下我对前端模板引擎的感受吧. 前端模板引擎相信大家都再熟悉不过了,市面上非常多的号称最好.最快.最牛逼的,随便就能找到一大 ...

  6. 【POJ3237】【树链剖分】Tree

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  7. stat 的名字接口

    File::stat - stat 的名字接口 名字为:dev, ino, mode, nlink, uid, gid, rdev, size, atime, mtime, ctime, blksiz ...

  8. MAC——laravel环境

    apache: 目录:etc/apache2 重启:sudo apachectl restart PHP: 把/etc/php.ini.default复制并重命名/ect/php.ini 打开Load ...

  9. 批处理文件的@echo off是什么意思?

    @echo off 关闭回显 @echo on 打开回显 @echo off并不是DOS程序中的, 而是DOS批处理中的. 当年的DOS,所有操作都用键盘命令来完成, 当你每次都要输入相同的命令时, ...

  10. go语言细节

    1 数组与字符串为值类型,切片.映射.通道为值类型,赋值需注意. package main import ( "fmt" ) func main() { //数组 a1 := [] ...