浅析offsetLeft,Left,clientLeft之间的区别


Posted in Javascript onNovember 30, 2013

浅析offsetLeft,Left,clientLeft之间的区别

假设 obj 为某个 HTML 控件

obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算上侧位置,整型,单位像素。

obj.offsetLeft 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置,整型,单位像素。

obj.offsetWidth 指 obj 控件自身的绝对宽度,不包括因 overflow 而未显示的部分,也就是其实际占据的宽度,整型,单位像素。

obj.offsetHeight 指 obj 控件自身的绝对高度,不包括因 overflow 而未显示的部分,也就是其实际占据的高度,整型,单位像素。

我们对前面提到的 offsetParent 作个说明。

offsetParent 获取定义对象 offsetTop 和 offsetLeft 属性的容器对象的引用。offsetTop 与 offsetParent 很复杂,不同浏览器有不同解释,浮动一下解释又不同了,所以我们一般只要理解通过二者可以获得控件在浏览器中的绝对位置即可。

以上属性在 FireFox 中也有效。

另外:我们这里所说的是指 HTML 控件的属性值,并不是 document.body,document.body 的值在不同浏览器中有不同解释(实际上大多数环境是由于对 document.body 解释不同造成的,并不是由于对 offset 解释不同造成的)

我们知道 offsetTop 可以获得 HTML 元素距离上方或外层元素的位置,style.top 也是可以的,二者的区别是:

一、offsetTop 返回的是数字,而 style.top 返回的是字符串,除了数字外还带有单位:px。

二、offsetTop 只读,而 style.top 可读写。

三、如果没有给 HTML 元素指定过 top 样式,则 style.top 返回的是空字符串。

offsetLeft 与 style.left、offsetWidth 与 style.width、offsetHeight 与 style.height 也是同样道理。

clientHeight
大家对 clientHeight 都没有什么异议,都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,一般是最后一个工具条以下到状态栏以上的这个区域,与页面内容无关。

offsetHeight
IE、Opera 认为 offsetHeight = clientHeight + 滚动条 + 边框。
NS、FF 认为 offsetHeight 是网页内容实际高度,可以小于 clientHeight。

scrollHeight
IE、Opera 认为 scrollHeight 是网页内容实际高度,可以小于 clientHeight。
NS、FF 认为 scrollHeight 是网页内容高度,不过最小值是 clientHeight。

简单地说
clientHeight 就是透过浏览器看内容的这个区域高度。
NS、FF 认为 offsetHeight 和 scrollHeight 都是网页内容高度,只不过当网页内容高度小于等于 clientHeight 时,scrollHeight 的值是 clientHeight,而 offsetHeight 可以小于 clientHeight。
IE、Opera 认为 offsetHeight 是可视区域 clientHeight 滚动条加边框。scrollHeight 则是网页内容实际高度。

同理
clientWidth、offsetWidth 和 scrollWidth 的解释与上面相同,只是把高度换成宽度即可。

说明
以上基于 DTD HTML 4.01 Transitional,如果是 DTD XHTML 1.0 Transitional 则意义又会不同,在 XHTML 中这三个值都是同一个值,都表示内容的实际高度。新版本的浏览器大多支持根据页面指定的 DOCTYPE 来启用不同的解释器

scrollTop 是“卷”起来的高度值,示例:

<div style="width:100px;height:100px;background-color:#FF0000;overflow:hidden;" id="p">
<div style="width:50px;height:300px;background-color:#0000FF;" id="t">如果为 p 设置了 scrollTop,这些内容可能不会完全显示。</div>
</div>
<script type="text/javascript">
var p = document.getElementById("p");
p.scrollTop = 10;
</script>

由于为外层元素 p 设置了 scrollTop,所以内层元素会向上卷,这卷起来的部分就是 scrollTop。

scrollLeft 也是类似道理。

我们已经知道 offsetHeight 是自身元素的宽度,而 scrollHeight 是内部元素的绝对宽度,包含内部元素的隐藏的部分。上述中 p 的 scrollHeight 为 300,而 p 的 offsetHeight 为 100。

scrollWidth 也是类似道理。

IE 和 FireFox 全面支持,而 Netscape 8 和 Opera 7.6 不支持 scrollTop、scrollLeft(document.body.scrollTop、document.body.scrollLeft 除外)。

1.clientHeight, clientWidth:
这两个属性大体上显示了元素内容的象素高度和宽度.理论上说这些测量不考虑任何通过样式表加入
元素中的页边距,边框等.

2.clientLeft,clientTop:
这两个返回的是元素周围边框的厚度,如果不指定一个边框或者不定位改元素,他的值就是0.

3.scrollLeft,scrollTop:
如果元素是可以滚动的,可以通过这俩个属性得到元素在水平和垂直方向上滚动了多远,单位是象素.
对于不可以滚动的元素,这些值总是0.

4.scrollHeight,scrollWidth:
不管有多少对象在页面上可见,他们得到的是整体.

5.style.left:
定位元素与包含它的矩形左边界的偏移量

6.style.pixelLeft:
返回定位元素左边界偏移量的整数像素值.因为属性的非像素值返回的是包含单位的字符串,例如,30px. 利用这个属性可以单独处理以像素为单位的数值.

7.style:posLetf:
返回定位元素左边界偏移量的数量值,不管相应的样式表元素指定什么单位.因为属性的非位置值返回的是包含单位的字符串,例如,1.2em  

top,pixelTop,posTOp这几个类比就行了.

LEFT:   为从左向右移的位置,即挂件距离屏幕左边缘的距离;

clientLeft   返回对象的offsetLeft属性值和到当前窗口左边的真实值之间的距离

offsetLeft   返回对象相对于父级对象的布局或坐标的left值,就是以父级对象左上角为坐标原点,向右和向下为X、Y轴正方向的x坐标

pixelLeft   设置或返回对象相对于窗口左边的位置

scrollWidth 是对象的实际内容的宽,不包边线宽度,会随对象中内容的多少改变(内容多了可能会改变对象的实际宽度)。

clientWidth 是对象可见的宽度,不包滚动条等边线,会随窗口的显示大小改变。

offsetWidth 是对象的可见宽度,包滚动条等边线,会随窗口的显示大小改变。

IE6.0、FF1.06+:
clientWidth = width + padding
clientHeight = height + padding
offsetWidth = width + padding + border
offsetHeight = height + padding + border
IE5.0/5.5:
clientWidth = width - border
clientHeight = height - border
offsetWidth = width
offsetHeight = height
(需要提一下:CSS中的margin属性,与clientWidth、offsetWidth、clientHeight、offsetHeight均无关)

offsetwidth:是元素相对父元素的偏移宽度。等于border+padding+width
clientwidth:是元素的可见宽度。等于padding+width
scrollwidth:是元素的宽度且包括滚动部分。
offsetLeft:Html元素相对于自己的offsetParent元素的位置
scrollLeft:返回和设置当前横向滚动务的坐标值

<input type="button" value="点一下" onclick="move()"> 
<div id="d" style="background-color:#ff9966; position:absolute; left:170px; top:100px;width:300;height:300;overflow:scroll" 
onclick="alert('offsetLeft:'+this.offsetLeft)"> 
<div style="height:600;width:600" onclick="alert('offsetLeft:'+this.offsetLeft)"></div> 
</div> 
<script language="javascript"> 
function move() 
{ 
var d=document.getElementById("d") 
a=eval(20) 
d.scrollLeft+=a 
} 
</script>

保存为网页,运行一下,点按钮,滚动条移动
点击div,先弹出b相对于a的位置,再弹出a相对于窗口的位置
Javascript 相关文章推荐
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 Javascript
关于this和self的使用说明
Aug 01 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
Sep 15 Javascript
深入学习JavaScript对象
Oct 13 Javascript
浅析AngularJS Filter用法
Dec 28 Javascript
jQuery实现图像旋转动画效果
May 29 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
Sep 13 Javascript
Js动态设置rem来实现移动端字体的自适应代码
Oct 14 Javascript
Javascript 实现计算器时间功能详解及实例(二)
Jan 08 Javascript
AngularJS中下拉框的基本用法示例
Oct 11 Javascript
javascript-hashchange事件和历史状态管理实例分析
Apr 18 Javascript
微信小程序自定义底部弹出框功能
Nov 18 Javascript
jQuery之过滤元素操作小结
Nov 30 #Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
Nov 30 #Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
Nov 30 #Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
Nov 29 #Javascript
jquery限定文本框只能输入数字即整数和小数
Nov 29 #Javascript
js中事件的处理与浏览器对象示例介绍
Nov 29 #Javascript
js实现的折叠导航示例
Nov 29 #Javascript
You might like
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
php 高效率写法 推荐
2010/02/21 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
jquery实现从数组移除指定的值
2015/06/24 Javascript
Jquery判断form表单数据是否变化
2016/03/30 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
Python中的元类编程入门指引
2015/04/15 Python
python实现文件快照加密保护的方法
2015/06/30 Python
一份python入门应该看的学习资料
2018/04/11 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
用Python实现读写锁的示例代码
2018/11/05 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
建筑工程技术应届生自荐信
2013/09/27 职场文书
室内设计自我鉴定
2013/10/15 职场文书
行政专员的岗位职责
2014/03/10 职场文书
2014中考励志标语
2014/06/05 职场文书
公司委托书怎么写
2014/08/02 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
个人租房协议书
2014/11/28 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
2015年科协工作总结
2015/05/19 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书
创业计划书之网吧
2019/10/10 职场文书
Python 实现定积分与二重定积分的操作
2021/05/26 Python
浅谈Python数学建模之整数规划
2021/06/23 Python
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript