getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。

getBoundingClientRect是DOM元素到浏览器可视范围的距离(不包含文档卷起的部分)。

该函数返回一个Object对象,该对象有6个属性:top,lef,right,bottom,width,height;

这里的top、left和css中的理解很相似,width、height是元素自身的宽高,但是right,bottom和css中的理解有点不一样。right是指元素右边界距窗口最左边的距离,bottom是指元素下边界距窗口最上面的距离。

getBoundingClientRect最先是IE的私有属性,现在已经是一个W3C标准。所以不用担心浏览器兼容问题,不过还是有区别的:IE只返回top,lef,right,bottom四个值,width,height的值需要用right-left,bottom-top算出来。

var ele = document.getElementById("demo").getBoundingClientRect(),
     t = ele.top,
     b = ele.bottom,
     l = ele.left,
     r = ele.right,
     w = ele.width || r - l,
     h = ele.height || b - t;

写了个DEMO,如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>getBoundingClientRect</title>
</head>
<body>
<script>
var $ = function (id) {
return "string" == typeof id ? document.getElementById(id) : id;
}; var Class = {
create: function() {
return function() { this.initialize.apply(this, arguments); }
}
} var Bind = function(object, fun) {
return function() {
return fun.apply(object, arguments);
}
} var BindAsEventListener = function(object, fun) {
return function(event) {
return fun.call(object, (event || window.event));
}
} function addEventHandler(oTarget, sEventType, fnHandler) {
if (oTarget.addEventListener) {
oTarget.addEventListener(sEventType, fnHandler, false);
} else if (oTarget.attachEvent) {
oTarget.attachEvent("on" + sEventType, fnHandler);
} else {
oTarget["on" + sEventType] = fnHandler;
}
}; function removeEventHandler(oTarget, sEventType, fnHandler) {
if (oTarget.removeEventListener) {
oTarget.removeEventListener(sEventType, fnHandler, false);
} else if (oTarget.detachEvent) {
oTarget.detachEvent("on" + sEventType, fnHandler);
} else {
oTarget["on" + sEventType] = null;
}
}; var SimpleDrag = Class.create();
SimpleDrag.prototype = {
initialize: function(drag) {
this.Drag = $(drag);
this.left = $("left");
this.right = $("right");
this.top = $("top");
this.bottom = $("bottom");
this.width = $("width");
this.height = $("height");
this._x = this._y = 0;
this._fM = BindAsEventListener(this, this.Move);
this._fS = Bind(this, this.Stop);
this.Drag.style.position = "absolute";
addEventHandler(this.Drag, "mousedown", BindAsEventListener(this, this.Start));
},
Start: function(oEvent) {
this._x = oEvent.clientX - this.Drag.offsetLeft;
this._y = oEvent.clientY - this.Drag.offsetTop;
addEventHandler(document, "mousemove", this._fM);
addEventHandler(document, "mouseup", this._fS);
},
Move: function(oEvent) {
this.clsSelect();
this.Drag.style.left = oEvent.clientX - this._x + "px";
this.Drag.style.top = oEvent.clientY - this._y + "px";
//获取元素位置代码
this.left.innerHTML = this.Drag.getBoundingClientRect().left;
this.right.innerHTML = this.Drag.getBoundingClientRect().right;
this.top.innerHTML = this.Drag.getBoundingClientRect().top;
this.bottom.innerHTML = this.Drag.getBoundingClientRect().bottom;
this.width.innerHTML = this.Drag.getBoundingClientRect().width||this.Drag.getBoundingClientRect().right-this.Drag.getBoundingClientRect().left;
this.height.innerHTML = this.Drag.getBoundingClientRect().height||this.Drag.getBoundingClientRect().bottom-this.Drag.getBoundingClientRect().top;
},
Stop: function() {
removeEventHandler(document, "mousemove", this._fM);
removeEventHandler(document, "mouseup", this._fS);
},
clsSelect:'getSelection' in window ? function () {
window.getSelection().removeAllRanges();
} : function () {
try {
document.selection.empty();
} catch (e) {};
}
}; </script>
<table width="300" border="1">
<tr>
<td colspan="2">信息</td>
</tr>
<tr>
<td width="100">left:</td>
<td id="left"></td>
</tr>
<tr>
<td>top:</td>
<td id="top"></td>
</tr>
<tr>
<td>right:</td>
<td id="right"></td>
</tr>
<tr>
<td>bottom:</td>
<td id="bottom"></td>
</tr>
<tr>
<td>width:</td>
<td id="width"></td>
</tr>
<tr>
<td>height:</td>
<td id="height"></td>
</tr>
</table>
<div id="idDrag" style="background:blue; width:50px; height:50px;"></div> <script>
new SimpleDrag("idDrag");
</script> </body>
</html>

getBoundingClientRect获取元素在页面上的位置的更多相关文章

  1. js 获取元素在页面上的偏移量的最佳方式

    使用js制作效果时,我们常常要获取某个元素在页面上的偏移量(例如tip提示框功能).而获取偏移量可以直接获取相对于document的偏移量,也可以获取相对与视口的偏移量(viewpoint)加上页面滚 ...

  2. javascript: Element.getBoundingClientRect() 获取元素在网页上的坐标位置

    来自:https://blog.csdn.net/weixin_42895400/article/details/81811095?utm_source=blogxgwz1 Element.getBo ...

  3. 关于js获取元素在屏幕中的位置的方法

    针对我们获取元素在页面中的位置的问题,我们还是用老师一峰老师的方法来解决吧 下面上HTML代码 <div class="left_footer"> <p data ...

  4. 我的前端工具集(八)获得html元素在页面中的位置

    我的前端工具集(八)获得html元素在页面中的位置   liuyuhang原创,未经允许禁止转载 目录 我的前端工具集 有时候需要用点击等操作,来获取某元素在页面中的位置,然后在该位置添加某些操作 如 ...

  5. jquery获取元素到页面顶部距离

    jquery获取元素到页面顶部距离的语句为: $(selector).offset().top

  6. getBoundingClientRect方法获取元素在页面中的相对位置

    获取元素位置可以用 offset 或 getBoundingClientRect,使用 offset 因为兼容性不好,比较麻烦,offset获取位置会形成"回溯".而 getBou ...

  7. 获取元素在页面中位置 getBoundingClientRect()

    DOM 原生方法getBoundingClientRect()获取元素相对视口位置 DOMRect 对象包含了一组用于描述边框的只读属性--left.top.right和bottom,单位为像素.除了 ...

  8. javascript getBoundingClientRect()获取元素四个边相对于窗口或文档的位置

    Element.getBoundingClientRect()返回元素的大小及相对于窗口的位置 语法: rectObject=object.getBoundingClientRect(); 返回值是一 ...

  9. jQuery检查某个元素在页面上是否存在

    用jQuery检查某个元素在网页上是否存在时,应该根据获取元素的长度来判断,代码如下: if($("#tt").length > 0) { //元素存在时执行的代码 } 具体 ...

随机推荐

  1. day02 进制之间的转换and计算机编码叙述

    一. 进制的转好技巧  二进制:0 1 八进制:0 1 2 3 4 5 6 7 十进制:0 1 2 3 4 5 6 7 8 9 十六进制:0 1 2 3 4 5 6  7 8 9 A B C D E ...

  2. Dart 语法

    Dart 语法 说明 var 类似于JavaScript中的var:最大的不同是Dart中var变量一旦赋值,类型便会确定,则不能再改变其类型 Object Object 是dart所有对象的根基类, ...

  3. webpack-dev-server --inline --progress --config build/webpack.dev.conf.js

    vue 项目 npm run dev 运行时报错: npm ERR! xxx@1.0.0 dev: `webpack-dev-server --inline --progress --config b ...

  4. AMQP close-reason, initiated by Peer, code=406

    错误: AMQPclose-reason, initiated by Peer, code=406, text="PRECONDITION_FAILED -inequivalent arg ...

  5. 工控随笔_03_西门子_Step7项目打开后CPU显示问号解决方法

    我们在利用西门子的S7-300/400 PLC的编程软件Step7的时候会出现下面如图所示的问题. 在打开项目的时候,我们会在Simatic Manager里面看到CPU以及一些其他一些组件显示问号. ...

  6. HP880G3 安装RHEL6.5

    ###关于读不到网卡驱动的问题 HP 880G3 在安装系统的时候会提示acpi错误 需要按F9  选择 lency开头走U盘安装系统  进入安装界面按tab 输入 acpi=off 这样就可以安装了 ...

  7. Python【每日一问】07

    问:请解释使用 *args 和 **kwargs 的含义 答: *args:可变参数,表示将实参中按照位置传值,多余的值都给 args,多余的实参被打包成 tuple(元组),然后传递给函数调用 # ...

  8. RN-环境配置

    良好的开端是成功的一半,这是window平台安装步骤 首先配置JDK1.8  配置JAVA_HOME环境变量 然后安装Android Studio3.2 然后安装react-native-cli np ...

  9. vue 组件自定义v-model

    参考资料:vue官网在vue 中使用v-model双向绑定 <input v-model="something"> 其实是语法糖 <input :value=&q ...

  10. 闪动效果的实现 (jquery方式和css方式)以及 keyframes和opacity 与ie等各浏览器兼容问题

    opacity 是CSS3中:设置元素的不透明度的属性(支持ie8以上) opacity: value|inherit;value用于规定不透明度.从 0.0 (完全透明)到 1.0(完全不透明). ...