JS中关于位置和尺寸的api
HTMLElement.offsetParent
由于offsetTop 和 offsetLeft 都是相对于 offsetParent 内边距边界的,故offsetParent的意义十分重大。offsetParent的机制与css中包含块的概念十分类似但并不完全一致,其不一致有时候是由于浏览器的不同而导致的,例如:当元素为固定定位时(fixed),chrome浏览器的 offsetParent 值为 Null,而火狐的则为 body 元素。总结规律如下:
- 规则(当html和body之间的margin被清除时):
本身定位为fixed 本身定位非fiexd offsetParent 火狐 非火狐 父级无定位 父级有定位 body null body 有定位的父级 - 尽管本身定位为fixed时,非火狐浏览器为null,body.offsetTop 和 body.offsetLeft的值仍然为0(即默认值为0)。因此,当html和body之间的margin值被清除时,就可以视为 offsetLeft 和 offsetTop 也是参照于 body 的。
HTMLElement.offsetLeft
offsetLeft 是一个只读属性,返回当前元素左上角相对于 offsetParent 节点的左边界偏移的像素值。
HTMLElement.offsetTop
offsetTop 为只读属性,它返回当前元素相对于其 offsetParent 元素的顶部的距离。
获取元素在页面中的位置
1.获取绝对位置 --- 原生实现
- while循环叠加offsetParent的offsetTop和offsetLeft计算出元素的绝对位置,元素的 boder 和 margin 会影响这个函数的取值。不推荐使用
function getPointAb(node){
//while循环叠加offsetParent的offsetTop和offsetLeft
var x =;
var y = ;
while(node){
x+=node.offsetLeft;
y+=node.offsetTop;
node = node.offsetParent;
} return {x:x,y:y};
}
2.获取滚动条滚动的距离
L = document.documentElement.scrollLeft||document.body.scrollLeft;
T = document.documentElement.scrollTop||document.body.scrollTop;
3.获取相对位置 --- 原生实现
- 在while循环叠加取得绝对位置的基础上,减去滚动条滚动的距离。没有办法兼容border和margin
//boder margin会影响这个函数的取值
function getPointRe(node){
//while循环叠加offsetParent的offsetTop和offsetLeft
var x =0;
var y = 0;
while(node){
x+=node.offsetLeft;
y+=node.offsetTop; node = node.offsetParent;
} var L = document.documentElement.scrollLeft||document.body.scrollLeft;
var T = document.documentElement.scrollTop||document.body.scrollTop;
return {x:x-L,y:y-T};
}
4.Element.getBoundingClientRect() --- 兼容性好
- 返回值:对象
- width:border-box的宽
- height:border-box的高
- top:元素border-box的左上角的相对位置纵坐标
- left:元素border-box的左上角的相对位置横坐标
- bottom:元素border-box的右下角的相对位置的纵坐标
- right:元素border-box的右下角的相对位置的横坐标
获取元素尺寸
1.offsetWidth & offsetHeight
- 该属性是一个只读属性,返回一个元素的尺寸(宽度or高度)
- 其返回值为元素可视区域(padding box)的大小加上边框的大小,即 padding box(可视区域) + border
- 此属性会返回一个四舍五入的小数,若想得到更精确的值,可以使用 getBoundingClientRect() 方法
- 返回值 = 边框(border) + 内边距(padding) + 相应方向滚动条(scrollbar) + CSS设置的宽度(width)或高度(height)的值。
2.clientWidth & clientHeight
- 该属性表示元素的内部宽度,单位值为像素
- 此属性会返回一个四舍五入的小数
- 其返回值为元素可视区域(padding box)的大小
- 注意:当用此属性获取根标签的大小时,无论根标签有没有margin,都会无视margin返回屏幕视口的尺寸(即 document.documentElement.clentWidth 返回该设备屏幕分辨率)
tips:在ie10及ie10以下,根标签的clientWidth和offsetWidth,统一被指定为视口的宽度。
JS中关于位置和尺寸的api的更多相关文章
- 在Angular.js中的H5页面调用Web api时跨域问题处理
/// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...
- js中的位置属性
原生js中位置信息 clientLeft,clientTop:表示内容区域的左上角相对于整个元素左上角的位置(包括边框),实测,clientLeft=左侧边框的宽度,clientTop=顶部边框的宽度 ...
- Dom关于位置和尺寸的api
parentNode 直接父级//和offsetParent不同 inner2.parentNode <!DOCTYPE html> <html id="html&q ...
- 原生JS中获取位置的方案总结
获取鼠标当前位置 clientY.clientX: 鼠标当前位置 相对于 浏览器可视区域顶部.浏览器可视区域左部 的位置: pageY.pageX: 鼠标当前位置 相对于 文档顶部.文档左部的位置: ...
- IOS中调整UI控件位置和尺寸
1.frame(修改位置和尺寸):以父控件左上角为坐标原点,在其父控件中的位置和尺寸. //frame属性中的坐标点不能直接修改 CGRect tempFrame = self.v.frame; // ...
- jQuery UI =>jquery-ui.js中sortable方法拖拽对象位置偏移问题
今天要处理sortable方法处理的对象,拖拽的时候,位置偏移的问题. 按理应该是鼠标在哪,对象就跟着在哪的 百度了一下问题,http://blog.csdn.net/samed/article/de ...
- 前端JavaScript(3)-关于DOM操作的相关案例,JS中的面向对象、定时器、BOM、位置信息
小例子: 京东购物车 京东购物车效果: 实现原理: 用2个盒子,就可以完整效果. 先让上面的小盒子向下移动1px,此时就出现了压盖效果.小盒子设置z-index压盖大盒子,将小盒子的下边框去掉,就可以 ...
- js中尺寸类样式
js中尺寸类样式 一:鼠标尺寸类样式 都要事件对象的配合 Tip:注意与浏览器及元素尺寸分开,鼠标类尺寸样式都是X,Y,浏览器及元素的各项尺寸时Height,Width 1:检测相对于浏览器的位置:e ...
- js中的各种宽高以及位置总结
在javascript中操作dom节点让其运动的时候,常常会涉及到各种宽高以及位置坐标等概念,如果不能很好地理解这些属性所代表的意义,就不能理解js的运动原理,同时,由于这些属性概念较多,加上浏览器之 ...
随机推荐
- 一个for循环写出9*9乘法表
public class ClassTest03 { public static void main(String[] args) { for(int i=1,j=1;j<=9;j++){ if ...
- 汇编_指令_LEA和MOV的区别
就是目标地址传送指令: 将一个近地址指针写入到指定的寄存器.格式: LEA reg16,mem16 其中reg16必须是一个16位通用寄存器,mem16必须是一个存储器,执行这个指令后,就将mem16 ...
- mysql分区表之二:MySQL的表的四种分区类型介绍
一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...
- [Java][Web]利用 referer 防盗链
String referer = request.getHeader("referer"); if(referer == null || !referer.startsWith(& ...
- 一次hadoop集群机器加内存的运维过程
由于前期的集群规划问题,导致当前Hadoop集群中的硬件并没有完全利用起来.当前机器的内存CPU比例为2G:1core,但一般的MapReduce任务(数据量处理比较大,逻辑较复杂)的MR两端都需要将 ...
- IBM AIX创建lv
#lsvg 查看当前有哪些vgrootvgvgdb02vgdb01datavg#lslv maindb_index 查看maindb_index这个lv 位于哪个vg上,新的lv也要与之相同.LOGI ...
- Word域介绍文章
https://www.cnblogs.com/ahuo/archive/2007/05/04/735520.html pageref 书签名 :返回书签所在页码 styleref 标题 1 在当前位 ...
- 1.celery概述
1. 问题抛出 我们在做网站后端程序开发时,会碰到这样的需求:用户需要在我们的网站填写注册信息,我们发给用户一封注册激活邮件到用户邮箱,如果由于各种原因,这封邮件发送所需时间较长,那么客户端将会等待很 ...
- Easyui Datagrid 的Combobox 如何动态修改下拉选项,以及值的转换
我是先将下拉选项的值通过datagrid的url查出来了,在每一行的row中 //项目结果选项卡的列表 $('#project_table').datagrid({ width : ...
- Python基础补充(二) 多核CPU上python多线程并行的一个假象【转】
在python上开启多个线程,由于GIL的存在,每个单独线程都会在竞争到GIL后才运行,这样就干预OS内部的进程(线程)调度,结果在多核CPU上: python的多线程实际是串行执行的,并不会同一时间 ...