《JavaScript高级程序设计》中讲述了通过JS如何控制页面中元素的大小,其中涉及到三对属性:偏移量,客户区大小,滚动大小。以前自己经常看到这三对属性,但是具体不是很清楚,容易混淆。所以想写篇文章记录一下自己的学习收获,让自己理解的更加深刻,同时也请各位前辈帮忙指正一下自己理解错误的地方。

首先元素在屏幕上的可见大小由元素的宽度,高度决定,包括所有内边距,滚动条和边框大小(不包括外边距)

1.偏移量

偏移量中包括如下四个属性:

1.offsetHeight:元素在垂直方向上占用的空间大小,以像素计,包括元素的高度,(可见的)水平滚动条的高度,上边框高度和下边框高度

2.offsetWidth:元素在水平方向上占用的空间大小,以像素计,包括元素的宽度,(可见的)垂直滚动条的宽度,左边框宽度和右边框宽度

3.offsetLeft:元素的左外边框至包含元素的左内边框之间的像素距离

4.offsetTop:元素的上外边框至包含元素的上内边框之间的像素距离

下图形象的展示了上述四个属性表示的大小和距离

注意点:偏移量属性都是只读的,而且每次访问都需要重新计算,所以尽量避免重复访问这些属性,如果需要重复访问,可以将某个属性保存在局部变量中,以提高性能

2.客户区大小

客户区大小指的是元素内容和其内边距占据的空间大小。有关客户区大小的属性有如下两个:

1.clientWidth:元素内容区宽度加上左右内边距宽度

2.clientHeight:元素内容区高度加上上下内边距高度

下图展示了上述的属性:

注意点:1.clientWidth(clientHeight)与offsetWidth(offsetHeight)的区别是不包括边框和滚动条

    2.客户区大小与偏移量一样也是只读的,每次访问也需要重新计算

3.滚动大小

1.scrollHeight:在没有滚动条的情况下,元素内容的总高度

2.scrollWidth:在没有滚动条的情况下,元素内容的总宽度

3.scrollLeft:被隐藏在内容区域左侧的像素数,通过设置这个属性可以改变元素的滚动位置

4.scrollTop:被隐藏在内容区上方的像素数,通过设置这个属性可以改变元素的滚动位置

下图展示了这些属性:

注意点:1.通常认为<html>元素是在Web浏览器的视口中滚动的元素(IE6之前版本运行在混杂模式下是<body>元素),所以带有垂直滚动条的页面总高度是document.documentElement.scrollHeight。

2.偏移量,客户区大小和滚动大小返回的值只是一个数值,不带有单位,与style属性的width/height属性不同。

3.在确定文档的总高度时(包括基于视口的最小高度时),必须取得scrollWidth/clientWidth和scrollHeight/clientHeight中的最大值,才能保证在跨浏览器的环境下得到精确的结果

在本节中涉及到的一些代码片段

1.获取某个元素相对于页面根元素的偏移量

//获取元素的左偏移量
function getElementLeft(element) {
var actualLeft=element.offsetLeft;
var current=element.offsetParent;
while(current!==null){
actualLeft+=current.offsetLeft;
current=current.offsetParent;
}
return actualLeft;
}

  

        //获取元素的上偏移量
function getElementLeft(element) {
var actualTop=element.offsetTop;
var current=element.offsetParent;
while(current!==null){
actualLeft+=current.offsetTop;
current=current.offsetParent;
}
return actualTop;
}

2.获取浏览器视口大小

//获取浏览器视口大小
function getViewport(){
if (document.compatMode=="BackCompat") {
return {
width:document.body.clientWidth,
height:document.body.clienrHeight
};
}else{
return{
width:document.documentElement.clientWidth,
height:document.documentElement.clienrHeight
};
}
}

  

3.取得scrollWidth/clientWidth和scrollHeight/clientHeight中的最大值

//取得scrollWidth/clientWidth和scrollHeight/clientHeight中的最大值
var docHeight=Math.max(document.documentElement.scrollHeight,document.documentElement.clientHeight);
var docWidth=Math.max(document.documentElement.scrollWidth,document.documentElement.clientWidth);

  

4.重置元素的滚动位置

     //重置元素的滚动位置
function scrollToTop(element){
if (element.scrollTop!=0) {
element.scrollTop=0;
}
}

  

JS高程12.2.3元素大小的学习笔记的更多相关文章

  1. 《JS高程》基本类型和引用类型的值学习笔记

    ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 创建方式类似:创建一个变量并为其赋值. (1)基本类型值和引用类型值比较 基本类型值 引用类型值 简单的数据段 可能由 ...

  2. js中窗口大小和单个元素大小的计算

    1. 窗口的大小即浏览器的大小: window.innerWidth, window.innerHeight, window.outerHeight, window.outerWidth 在IE9+, ...

  3. js高级程序设计(第三版)学习笔记(第一版)

    ecma:欧洲计算机制造商协会iso/iec:国际标准化和国际电工委员会 dom级别(10*)文档对象模型1:DOM核心(映射基于xml文档)与dom html(在dom核心基础上)2:对鼠标,事件, ...

  4. Docker学习总结(12)——非常详细的 Docker 学习笔记

    一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...

  5. React学习笔记 - 元素渲染

    React Learn Note 3 React学习笔记(三) 标签(空格分隔): React JavaScript 二.元素渲染 元素是构成react应用的最小单位. 元素是普通的对象. 元素是构成 ...

  6. js 元素大小缩放实例

    元素大小缩放是一套连贯事件,按下鼠标不放,拖动鼠标 然后松开. 按下鼠标事件 当按下鼠标时,记录元素大小.鼠标按下的位置.状态位. 拖动鼠标事件 当鼠标拖动时,计算元素调用后的大小. 元素调整后大小 ...

  7. 吃透Javascript数组操作的正确姿势—再读《Js高程》

    Javascript中关于数组对象的操作方法比较多也比较杂,正好再次捡起<Javascript高级程序设计>来读,把它们一一总结梳理了一下: 方法类别 方法名称 方法描述 参数 返回值 备 ...

  8. dojo/dom-geometry元素大小

    在进入源码分析前,我们先来点基础知识.下面这张图画的是元素的盒式模型,这个没有兼容性问题,有问题的是元素的宽高怎么算.以宽度为例,ff中 元素宽度=content宽度,而在ie中 元素宽度=conte ...

  9. jquery插件之拖拽改变元素大小

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的拖拽改变元素大小的效果,您可以根据自己的实际需求来设置被 ...

随机推荐

  1. 线性表->链式存储->双向链表

    文字描述 之前的链表(单链表.循环链表)的链式存储结构中只有一个指示直接后继的指针域.由此,从某个结点出发只能顺指针往后寻查其他结点.若要寻查结点的直接前驱,则需从表头指针出发.即单链表中,NextE ...

  2. oracle单字段拆分成多行

    已上图为例 先以逗号分隔拆分 拆分函数: CREATE OR REPLACE FUNCTION SPLIT(P_STRING VARCHAR2, P_SEP VARCHAR2 := ',') RETU ...

  3. vs code代码对齐快捷键

    vscode缩进快捷键: 选中文本: Ctrl  +  [      和   Ctrl  +  ]     实现文本的向左移动或者向右移动: vscode代码对齐快捷键: 选中文本: Shift  + ...

  4. (转)手工释放linux内存——/proc/sys/vm/drop_cache

    linux的内存查看: [root@localhost 0.1.0]# free -m                   total       used       free     shared ...

  5. 60道Python面试题&答案精选!找工作前必看

    需要Word/ PDF版本的同学可以在实验楼微信公众号回复关键词"面试题"获取. 1. Python 的特点和优点是什么? 答案:略. 2. 什么是lambda函数?它有什么好处? ...

  6. JAVA时间Date工具类

    package com.common.util; import java.text.DateFormat; import java.text.ParseException; import java.t ...

  7. python列表排重:列表排重并计算字符出现的次数

    a=[,,,,,,,,,,,] dictc={} for i in range(len(a)): dictc[a[i]]=a.count(a[i]) for key in dictc: print k ...

  8. 个人常用的移动端浅灰底index.html

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. IDEA开发工具的学习

    1.设置jdk的版本 ,快捷键:ctrl + shirt +alt + s 打开项目的设置,选择Project 进行 jdk版本的设置. 2.鼠标移到项目上,右键,Show in Explorer 定 ...

  10. 60.Vue:将px转化为rem,适配移动端

    1.下载lib-flexible 我使用的是vue-cli+webpack,所以是通过npm来安装的 npm i lib-flexible --save 2.引入lib-flexible 在main. ...