页面元素大小相关(offsetWidth、clientWidth、scrollWidth等)详解笔记

在学习过程中也好,实际开发中也好,总会碰到各种offsetWidth/offsetHeight/offsetLeft/offsetTop和clientWidth/clientHeight还有scrollWidth/scrollHeight/scrollLeft/scrollTop这些属性,不搞清楚还 真有些蒙圈。于是乎,我来自习探索一番。

一、偏移量:(offsetWidth/offsetHeight/offsetLeft/offsetTop)

元素的可见大小由其高度和宽度决定,这包括所有的内边距(padding)、滚动条和边框(border)大小(注意这里面不包括margin喔,因为margin是透明的,一般使用它控制元素之间的间隔)。这是为什么呢,因为吧,可以一试,如果我们给元素添加背景的话,那么背景会被应用 于由内容和内边距组成的区域,而添加边框(border)会在内边距(padding)的区域外边加一条线,margin透明,当然不在可见范围内啦。

具体四个属性包括哪些值,书上是这样说的:

但是实际情况 稍有不同(还需高人指点),下面是我测试的结果:

 1 <!DOCTYPE html>
 2 <html lang="zh">
 3 <head>
 4 <meta charset=utf-8>
 5 <title>元素大小相关(offsetTop/clientHeight/scrollTop~)</title>
 6 </head>
 7
 8 <style>
 9   body{
10     margin:0;
11     padding: 0;
12   }
13   #fullDiv {
14     background-color: red;
15     width: 100px;
16     height: 100px;
17     margin-top: 200px;
18     padding-top: 100px;
19     margin-left: 300px;
20     padding-left: 100px;
21     border-top: 50px;
22     border-left: 150px;
23   }
24 </style>
25
26 <body>
27    <div>
28    <div id="fullDiv"></div>
29    </div>
30
31     <script>
32        var div = document.getElementById(‘fullDiv‘);
33        console.log(‘div的offsetHeight为:‘+div.offsetHeight);//chrome/FF/IE10:200px,height+padding;
34        console.log(‘div的offsetWidth为:‘+div.offsetWidth);//chrome/FF/IE10:200px,width+padding
35        console.log(‘div的offsetLeft为:‘+div.offsetLeft);//chrome/FF/IE10:300px,margin(注,若body不加如上样式,则会308px)
36        console.log(‘div的offsetTop为:‘+div.offsetTop);//chrome/FF/IE10:200px,margin
37     </script>
38 </body>
39 </html>

运行结果(chrome、FF、IE10):

Tips:

1.如果要想知道某个元素在页面上的偏移量,将这个元素的offsetLeft和offsetTop与其offsetParent的相同属性相加,如此循环至根元素,就可以得到一个基本准确的值。

2.如果有些div他的offsetParent是<body>的话,那么也可以尝试getElementLeft()和getElementTop()方法,不出意外地话会返回跟offsetLeft和offsetTop相同的值。

3.所有这些偏移量都是只读的,而且每次访问的时候都需要重新计算,要注意性能问题。

二、客户区的大小(clientWidth/clientHeight)

元素的客户区的大小就是指元素内容及其内边距所占空间的大小(滚动条占用的空间不计算在内)。(clientWidth=width+padding(left、right);clientHeight=height+padding(top、bottom))

 1 <!DOCTYPE html>
 2 <html lang="zh">
 3 <head>
 4 <meta charset=utf-8>
 5 <title>元素大小相关(offsetTop/clientHeight/scrollTop~)</title>
 6 </head>
 7
 8 <style>
 9   body{
10     margin:0;
11     padding: 0;
12   }
13   #fullDiv {
14     background-color: red;
15     width: 100px;
16     height: 100px;
17     margin-top: 200px;
18     padding-top: 100px;
19     margin-left: 300px;
20     padding-left: 100px;
21     border-top: 50px;
22     border-left: 150px;
23   }
24 </style>
25
26 <body>
27    <div>
28    <div id="fullDiv"></div>
29    </div>
30
31     <script>
32        var div = document.getElementById(‘fullDiv‘);
33        console.log(‘div的clientHeight为:‘+div.clientHeight);//chrome/FF/IE10:200px,height+padding;
34        console.log(‘div的clientWidth为:‘+div.clientWidth);//chrome/FF/IE10:200px,width+padding
35
36     </script>
37 </body>
38 </html>

运行结果(chrome、ff、ie10):

于是,我们便可以利用clientWidth和clientHeight做一些事了,比如说计算浏览器视口的大小(<html>或<body>元素的大小)。

 1 function getViewPort(){
 2   if(document.compatMode == ‘BackCompat‘){
 3      return {
 4         width:document.body.clientWidth,
 5         height:document.body.clientHeight
 6      };
 7   }else{
 8     return {
 9       width:document.documentElement.clientWidth,
10       height:document.documentElement.clientHeight
11     };
12   }
13 }
14 getViewPort();

Look:

上图中红框框的大小正好就是1349*284.(注,不包括滚动条),截图的时候都能正好看到大小的喔。

And Look:

上面红框框的大小就是894*198.

这样我们就能准确的得到浏览器视口的大小啦。

三、滚动大小(scrollWidth/scrollHeight/scrollLeft/scrollTop)

有些元素,即使没有执行任何代码也会自动的添加滚动条,如<html>,但是另外一些元素,则需要通过css的overflow属性进行设置才能滚动。

通常认为<html>元素是在web浏览器的视口中滚动的元素(ie6之前版本运行在混杂模式下是<body>元素,这也是上面计算视口大小代码if,else的原因),因此带有垂直滚动条的页面总高度就是document.documentElement.scrollHeight。

但是,书上说:对于不包含滚动条的页面而言,scrollWidth和scrollHeight与clientWidth和clientHeight之间的关系并不是十分清晰。

但是我基于document.documentElement测试这些属性,视口大小是视口大小,文档大小是文档大小,并无特别:(我还是比较相信实践出来的真实情况的,有问题 欢迎大家留言一起学习)

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset=utf-8>
<title>元素大小相关(offsetTop/clientHeight/scrollTop~)</title>
</head> 

<style>
  html,body{
    margin:0;
    padding: 0;
    overflow: hidden;/*不包含滚动条*/
  }
  .div {
    width: 1000px;
    height:1000px;
  }
</style>  

<body>
    <div class="div"> </div>
    <script>
       console.log(‘无滚动条document.documentElement.clientHeight为:‘+document.documentElement.clientHeight);
       console.log(‘无滚动条document.documentElement.clientWidth为:‘+document.documentElement.clientWidth);
       console.log(‘无滚动条document.documentElement.scrollHeight为:‘+document.documentElement.scrollHeight);
       console.log(‘无滚动条document.documentElement.scrollWidth为:‘+document.documentElement.scrollWidth);

    </script>
</body>
</html>

ie10:

chrome:

FF:

Tips:

在确定文档的总高度时,必须取得scrollWidth、clientWidth和scrollHeight、clientHeight中的最大值,这样才能保证在跨浏览器的情况下取得较为准确的结果。

时间: 2024-10-26 10:25:25

页面元素大小相关(offsetWidth、clientWidth、scrollWidth等)详解笔记的相关文章

理解描述页面元素大小的几种方式

我们经常可以看到关于描述页面元素大小的属性,比如:offsetWidth.clientWidth以及scrollWidth等等.但是,要正确区分它们可能就不是一件容易的事情了.本篇博文,我将通过例子细致地向大家介绍这几种描述页面元素大小的属性.阅读目录如下,大家可以根据需要阅读相应的部分: 偏移量 客户区大小 滚动大小 第一部分:偏移量 偏移量,它包括元素在屏幕上占用的所有可见的空间.这里所说的可见的空间是指内容区域.内边距.边框.注意:由于外边距的作用仅仅是为了使不同的元素之间产生一定的距离,

offsetWidth clientWidth scrollWidth 的区别

了解 offsetWidth clientWidth scrollWidth 的区别 最近需要清除区分开元素的width,height及相应的坐标等,当前这篇用来区分offsetWidth clientWidth scrollWidth的区别 各自的概念 假设有一个元素,width有以下几个进行组合 content padding-left padding-right scrollbar 垂直的滚动条宽度(假设有,没有便为0) border-left border-right clientWid

[jQuery编程挑战]003 克隆一个页面元素及其相关事件

挑战: a) 绑定一个点击方法到这个div,点击后此元素会淡出消失 b) 同时克隆一个新的div元素到页面,元素内容是前面div文字内容反向书写(即,sgatbg olleh),同样也具有上面的点击事件绑定,元素淡出消失 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8"/> <title>克隆一个页面元素及其相关元素</titl

[转载]Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一.前言 在前面的几篇博文中我们主要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的理论详解.ngin

jQuery对html元素的取值与赋值实例详解

jQuery对html元素的取值与赋值实例详解 转载  2015-12-18   作者:欢欢   我要评论 这篇文章主要介绍了jQuery对html元素的取值与赋值,较为详细的分析了jQuery针对常见html元素的获取与赋值技巧,非常简单实用,需要的朋友可以参考下 本文实例讲述了jQuery对html元素的取值与赋值方法.分享给大家供大家参考,具体如下: Jquery给基本控件的取值.赋值 TEXTBOX: ? 1 2 3 4 5 var str = $('#txt').val(); $('#

jQuery(五) jQuery操纵DOM元素属性 attr()和removeAtrr()方法使用详解

jQuery操纵DOM元素属性 attr()和removeAtrr()方法使用详解 jQuery中操纵元素属性的方法: attr(): 读或者写匹配元素的属性值. removeAttr(): 从匹配的元素中移除指定的属性. attr()方法 读操作 attr()读操作. 读取的是匹配元素中第一个元素的指定属性值. 格式: .attr(attributeName),返回值类型:String.读取不存在的属性会返回undefined. 注意选择器的选择结果可能是一个集合,这里仅仅获取的是集合中第一个

jQuery操纵DOM元素属性 attr()和removeAtrr()方法使用详解

jQuery操纵DOM元素属性 attr()和removeAtrr()方法使用详解 jQuery中操纵元素属性的方法: attr(): 读或者写匹配元素的属性值. removeAttr(): 从匹配的元素中移除指定的属性. attr()方法 读操作 attr()读操作. 读取的是匹配元素中第一个元素的指定属性值. 格式: .attr(attributeName),返回值类型:String.读取不存在的属性会返回undefined. 注意选择器的选择结果可能是一个集合,这里仅仅获取的是集合中第一个

Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一.前言 在前面的几篇博文中我们主要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的理论详解.ngin

Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS 6.4 x86_64 , Nginx 是版本是最新版的1.4.2,所以实验用到的软件请点击这里下载:http://yunpan.cn/QXIgqMmVmuZrm 一.前言 在前面的几篇博文中我们主要讲解了Nginx作为Web服务器知识点,主要的知识点有nginx的理论详解.ngin