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的更多相关文章

  1. 在Angular.js中的H5页面调用Web api时跨域问题处理

    /// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...

  2. js中的位置属性

    原生js中位置信息 clientLeft,clientTop:表示内容区域的左上角相对于整个元素左上角的位置(包括边框),实测,clientLeft=左侧边框的宽度,clientTop=顶部边框的宽度 ...

  3. Dom关于位置和尺寸的api

    parentNode    直接父级//和offsetParent不同 inner2.parentNode <!DOCTYPE html> <html id="html&q ...

  4. 原生JS中获取位置的方案总结

    获取鼠标当前位置 clientY.clientX: 鼠标当前位置 相对于 浏览器可视区域顶部.浏览器可视区域左部 的位置: pageY.pageX: 鼠标当前位置 相对于 文档顶部.文档左部的位置: ...

  5. IOS中调整UI控件位置和尺寸

    1.frame(修改位置和尺寸):以父控件左上角为坐标原点,在其父控件中的位置和尺寸. //frame属性中的坐标点不能直接修改 CGRect tempFrame = self.v.frame; // ...

  6. jQuery UI =>jquery-ui.js中sortable方法拖拽对象位置偏移问题

    今天要处理sortable方法处理的对象,拖拽的时候,位置偏移的问题. 按理应该是鼠标在哪,对象就跟着在哪的 百度了一下问题,http://blog.csdn.net/samed/article/de ...

  7. 前端JavaScript(3)-关于DOM操作的相关案例,JS中的面向对象、定时器、BOM、位置信息

    小例子: 京东购物车 京东购物车效果: 实现原理: 用2个盒子,就可以完整效果. 先让上面的小盒子向下移动1px,此时就出现了压盖效果.小盒子设置z-index压盖大盒子,将小盒子的下边框去掉,就可以 ...

  8. js中尺寸类样式

    js中尺寸类样式 一:鼠标尺寸类样式 都要事件对象的配合 Tip:注意与浏览器及元素尺寸分开,鼠标类尺寸样式都是X,Y,浏览器及元素的各项尺寸时Height,Width 1:检测相对于浏览器的位置:e ...

  9. js中的各种宽高以及位置总结

    在javascript中操作dom节点让其运动的时候,常常会涉及到各种宽高以及位置坐标等概念,如果不能很好地理解这些属性所代表的意义,就不能理解js的运动原理,同时,由于这些属性概念较多,加上浏览器之 ...

随机推荐

  1. bzoj2184: 任意图的匹配

    Description 每天都要考,每天都要讲,大家注意力都集中不起来了,每天听解题报告时都有人交头接耳(也包括我,呵呵).这样做大大的影响的学习效率(可能吧).于是,有些好奇心重的同学就开始研究,怎 ...

  2. Java虚拟机(一)之开篇

    写此类文章的初始动机:被同事问道 jvm 是做什么时,竟然茫然以对: 按照惯例,从 what/where/how 等开篇,即: 一. JVM 的目的是什么? 二. JVM 是什么时候被以何总形式被安装 ...

  3. SQL 函数:树结构指定父节点遍历所有的子节点

    CREATE function [dbo].[Get_DepChildren] ( @ID int ) , ),PID ), Name )) as begin --declare @ID Int -- ...

  4. EasyUI treegrid 删除一条或多条记录

    function del_dg() { $.messager.defaults = { ok: "是", cancel: "否" }; var node = $ ...

  5. docker监控的一点想法

    目前项目内部署了docker,于是涉及到关于监控的事情,参考一些经典实例以及一些自己的想法,总结一下思路. 1.关于监控的内容 监控宿主机本身 监控宿主机本身还是比较简单的,同其他服务器监控类似,对c ...

  6. 分析iOS Crash文件:符号化iOS Crash文件的3种方法

    转自:http://www.cocoachina.com/industry/20140514/8418.html 转自wufawei的博客 当你的应用提交到App Store或者各个渠道之后,请问你多 ...

  7. 十七 能停止的线程 暴力停止 和 interrupt/return方法

    1:stop: 使用stop() 停止的线程则是非常暴力的. stop() 已经废弃了,因为: 1 如果强制停止则有可能使得一些清理工作得不到完成. 2 对锁定的对象进行了“解锁”,导致数据得不到同步 ...

  8. OD 实验(十六) - 从对话框入手对程序的逆向

    对话框: 对话框从类型上分为两类:modal 对话框和 modeless 对话框,就是模态对话框和非模态对话框,也有叫成模式和非模式 模态对话框不允许用户在不同窗口间进行切换,非模态对话框允许用户在不 ...

  9. Python Twisted系列教程22:结束

    作者:dave@http://krondo.com/part-22-the-end/  译者: Cheng Luo 你可以从”第一部分 Twist理论基础“开始阅读:也可以从”Twisted 入门!“ ...

  10. django之设置分页

    分页 Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据, ...