javascript中offset、client、scroll的属性总结


Posted in Javascript onAugust 13, 2015

HTML元素有几个offset、client、scroll开头的属性,总是让人摸不着头脑。在书中看到记下来,分享给需要的小伙伴。主要是以下几个属性:

第一组:offsetWidth,offsetHeight,offsetLeft,offsetTop,offsetParent

   第二组:clientWidth,clientHeight,clientLeft,clientTop

第三组:scrollWidth,scrollHeight,scrollLeft,scrollTop

详细定义如下:

1.1 HTML元素的offsetWidth,offsetHeight以CSS像素返回它的屏幕尺寸,包含元素的边框和内边距,不包含外边距。

1.2 offsetLeft和offsetTop属性返回元素的X和Y坐标。通常,它们返回值即是文档坐标。但对于已定位元素的后代元素和一些其他元素(如表格单元),这些属性返回的坐标是相对于祖先元素的而非文档。

1.3 offsetParent属性指定offsetLeft,offsetTop相对的父元素。如果offsetParent为null,后两者的返回值则为文档坐标。因此一般来说,用offsetLeft和offsetTop来计算元素e的位置需要一个循环:

//计算元素的文档坐标
function getElementPosition(e){
  var x=0,y=0;
  while(e !=null){
    x +=e.offsetLeft;
    y +=e.offsetTop;
    e=e.offsetParent; 
  }
  return {x:x, y:y} ;  
}

该方法计算的位置也不总是正确的,推荐使用内置的getBoundingClientRect()方法。

2.1 clientWidth和clientHeight类似于offsetWidth和offsetHeight属性,不同的是它们不包含边框大小,只包含内容和内边距。同时,如果浏览器在内边距和边框之间添加了滚动条,clientWidth和clientHeight的返回值也不包含滚动条。注意,对于类型<i>,<code>和<span>这些内联元素,clientWidth和clientHeight总是返回0。

2.2 clientLeft和clientTop返回元素的内边距的外边缘和它的边框的外边缘之间的水平距离和垂直距离,通常这些值就等于左边和上边的边框宽度。但是如果元素有滚动条,并且浏览器将这些滚动条旋转在左侧或顶部,他们就还包含了滚动条的宽度。对于内联元素,它们总是为0。通常clientLeft和clientTop用处不大。

3.1 scrollWidth和scollHeight是元素的内容区域加上它的内边距再加上任何溢出内容的尺寸。当内容正好和内容区域匹配而没有溢出时,这些属性与clientWidth和clientHeight是相等的。但当溢出时,它们就包含溢出的内容,返回值比clientWidth和clientHeight要大。

3.2 scrollLeft和scrollTop指定元素的滚动条的位置。注意,scrollLeft和scrollTop是可写的,通过设置它们来让元素中的内容滚动(HTML元素并没有类似Window对象的scrollTo()方法)。

obj.offset[WidthHeightTopLeft]  取控件相对于父控的位置
event.offset[XY] 取鼠标相在触发事件的控件中的坐标
event.screen[XY] 鼠标相对于屏幕坐标
event.client[XY] 鼠标相对于网页坐标在在
obj.scroll[WidthHeightTopLeft] 获取对象滚动的大小
obj.client[WidthHeightTopLeft] 获取对象可见区域的大小

<!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=gb2312" />
<title>无标题文档</title>
<style type="text/css">
<!--
div{
font-family: "宋体";
font-size: 12px;
color: #000000;
}
#div1{
position:absolute;
background-color:#f0f0f0;
width:200px;
height:200px;
left:20px;
top:0px;
z-index:1;
}
#div2{
background-color:#cfc0cf;
width:200px;
height:210px;
position:absolute;
left:261px;
top:347px;
z-index:100;
}
#div3{
background-color:#abbfbf;
width:200px;
height:200px;
position:absolute;
left:20px;
top:247px;
z-index:100;
}
#div4{
background-color:#cfcfcf;
width:200px;
height:200px;
position:absolute;
left:461px;
top:147px;
z-index:100;
}
-->
</style>
</head>
<body>
<div id='div1' >offset 控件相对于父窗体的位置</div>
<script>
function offset(ids){
ids.innerHTML="offsetLeft ="+ids.offsetLeft+"<BR>";
ids.innerHTML+="offsetWidth ="+ids.offsetWidth+"<BR>";
ids.innerHTML+="offsetHeight ="+ids.offsetHeight+"<BR>";
ids.innerHTML+="offsetTop ="+ids.offsetTop+"<BR>";
ids.innerHTML+="event.offset 鼠标相对于控件的位置<BR>";
ids.innerHTML+="offsetX ="+event.offsetX+"<BR>";
ids.innerHTML+="offsetY ="+event.offsetY+"<BR>";
}
function screen(ids){
ids.innerHTML="scrollWidth ="+ids.scrollWidth+"<BR>";
ids.innerHTML+="scrollHeight ="+ids.scrollHeight+"<BR>";
ids.innerHTML+="scrollTop ="+ids.scrollTop+"<BR>";
ids.innerHTML+="scrollLeft ="+ids.scrollLeft+"<BR>";
}
function client(ids){
ids.innerHTML="clientWidth ="+ids.clientWidth+"<BR>";
ids.innerHTML+="clientHeight ="+ids.clientHeight+"<BR>";
ids.innerHTML+="clientTop ="+ids.clientTop+"<BR>";
ids.innerHTML+="clientLeft ="+ids.clientLeft+"<BR>";
}
function eventc(ids){
ids.innerHTML="鼠标相对于屏幕坐标<BR>event.screenX="+event.screenX+"<BR>";
ids.innerHTML+="event.screenY ="+event.screenY+"<BR>";
ids.innerHTML+="鼠标相对于网页坐标event.clientX="+event.clientX+"<BR>";
ids.innerHTML+="event.clientY ="+event.clientY+"<BR>";
}
</script>
</body>
</html>

各浏览器都有这些属性,有些值可能不一样。

自己写代码,对比一下结果,就明白了。

Javascript 相关文章推荐
js实现图片轮换效果代码
Apr 16 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
Feb 13 Javascript
谈谈对offsetleft兼容性的理解
Nov 11 Javascript
javascript中Date format(js日期格式化)方法小结
Dec 17 Javascript
JavaScript易错知识点整理
Dec 05 Javascript
Javascript 实现匿名递归的实例代码
May 25 Javascript
es6学习之解构时应该注意的点
Aug 29 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
深入浅析Vue中的Prop
Jun 10 Javascript
一次微信小程序内地图的使用实战记录
Sep 09 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 Javascript
详解小程序横屏方案对比
Jun 28 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
Aug 13 #Javascript
asp.net中oracle 存储过程(图文)
Aug 12 #Javascript
JavaScript的jQuery库插件的简要开发指南
Aug 12 #Javascript
JavaScript中的call方法和apply方法使用对比
Aug 12 #Javascript
详细解读JavaScript的跨浏览器事件处理
Aug 12 #Javascript
基于jQuery实现动态数字展示效果
Aug 12 #Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
Aug 12 #Javascript
You might like
两个php日期控制类实例
2014/12/09 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
JS trim去空格的最佳实践
2011/10/30 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
原生JS实现图片左右轮播
2016/12/30 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
JS实现动态添加DOM节点和事件的方法示例
2017/04/28 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
vue项目关闭eslint校验
2018/03/21 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
python递归函数绘制分形树的方法
2018/06/22 Python
python中实现控制小数点位数的方法
2019/01/24 Python
Python自动抢红包教程详解
2019/06/11 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
python中如何使用insert函数
2020/01/09 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
学习十八大报告感言
2014/02/28 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
升学宴家长答谢词
2015/09/29 职场文书
初二物理教学反思
2016/02/19 职场文书
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript