元素的客户区

元素的客户区大小,指的是元素内容及其内边距所占据的空间大小。

相关属性如下:

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

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

案例代码如下:

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
} .parent {
width: 500px;
height: 500px;
margin: 100px auto;
background-color: red;
border: 10px solid #000;
overflow: hidden;
} .child {
width: 300px;
height: 300px;
border: 10px solid #000;
padding: 10px;
margin: 50px 90px;
background-color: green; }
</style>
</head> <body>
<div class="parent">
<div class="child"></div>
</div>
<script>
var child = document.querySelector('.child');
var html = '';
html += 'clientHeight=' + child.clientHeight + "<br>";
html += 'clientWidth=' + child.clientWidth + "<br>";
child.innerHTML = html; </script>
</body> </html>

结果如下:

我们不难发现一个现象元素的offsetwidth=元素的clientWidth+左右边框长度,offsetTop同理。

因为元素的offsetWidth = 元素的宽+左右内边距宽度+左右边框宽度

即使在怪异盒模型下也成立:

代码如下:

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
} .parent {
width: 500px;
height: 500px;
margin: 100px auto;
background-color: red;
border: 10px solid #000;
overflow: hidden;
} .child {
width: 300px;
height: 300px;
border: 10px solid #000;
padding: 10px;
margin: 50px 90px;
background-color: green;
/*注意这里*/
box-sizing: border-box; }
</style>
</head> <body>
<div class="parent">
<div class="child"></div>
</div>
<script>
var child = document.querySelector('.child');
var html = '';
html += 'clientHeight=' + child.clientHeight + "<br>";
html += 'clientWidth=' + child.clientWidth + "<br>";
html += "offsetWidth=" + child.offsetWidth + "<br>";
html += "offsetHeight=" + child.offsetHeight + "<br>";
child.innerHTML = html; </script>
</body> </html>

结果如下:

现给出一个确定浏览器窗口大小的函数:

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head> <body> <script>
function getViewport() {
if (document.compatMode === 'BackCompat') {
return {
width: document.body.clientWidth,
height: document.body.clientHeight
}
}
else {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
}
}
console.log(getViewport());
</script>
</body> </html>

结果如下:

这里检查document.compatMode属性,判断浏览器是否运行在混杂模式。

在这里我们改写一下该函数:

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head> <body> <script>
function getViewport() {
if (document.compatMode === 'BackCompat') {
getViewport = function () {
return {
width: document.body.clientWidth,
height: document.body.clientHeight
}
}
}
else {
getViewport = function () {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
}
}
return getViewport();
}
console.log(getViewport());
</script>
</body> </html>

改造之后我们同样能获取对应的结果,改写之后,我们在调用getViewport的时候,就不会进行判断了。我们知道程序中没有if判断的代码往往比有if判断的代码运行的时候,性能会高一点。

我们在改造一下:

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head> <body> <script> var getViewport = (function () {
if (document.compatMode === 'BackCompat') {
return function () {
return {
width: document.body.clientWidth,
height: document.body.clientHeight
}
}
}
else {
return function () {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
}
}
})();
console.log(getViewport());
</script>
</body> </html>

现在这个函数达到了改造一的效果,优化了性能。

其实这两次改造都提升了代码的性能,我们把这种技巧叫做惰性载入函数。

改造一在第一次运行的时候会消耗一下性能,改造二最开始的时候会消耗一下性能,至于采用那种方式进行优化,取决于具体需求。

举个例子:假如这个方法我是一定要使用的,那么可以使用第二种改造,假如这个方法我不一定会使用到,那么可以使用第一种改造。

关于元素客户区大小的知识点差不多就是这样子,如有错误,请告知一下,好及时修改。顺便扯了一下js的高级技巧,我觉得只要能从一个知识点联想到另一个知识点就是好事。

一文看懂js中元素的客户区大小(clientWidth,clientHeight)的更多相关文章

  1. 一文看懂js中元素的滚动大小(scrollWidth,scrollHeight,scrollTop,scrollLeft)

    滚动大小(scroll dimension) 滚动大小指的是包含滚动内容元素的大小. 以下是与元素滚动内容大小相关的属性: 1. scrollWidth:在没有滚动条的情况下,元素内容的总宽度. 2. ...

  2. 一文看懂js中元素偏移量(offsetLeft,offsetTop,offsetWidth,offsetHeight)

    偏移量(offset dimension) 偏移量:包括元素在屏幕上占用的所有可见空间,元素的可见大小有其高度,宽度决定,包括所有内边距,滚动条和边框大小(注意,不包括外边距). 以下4个属性可以获取 ...

  3. 一文看懂js中的clientX,clientY,pageX,pageY,screenX,screenY

    一. 客户区坐标位置(clientX,clientY) 鼠标事件都是在浏览器视口中的特定位置发生的.这个位置信息保存在事件对象的clientX和clientY属性中,所有浏览器都支持这两个属性. 我们 ...

  4. 一文搞懂 js 中的各种 for 循环的不同之处

    一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...

  5. 一文看懂JS继承

    继承是OOP中大家最喜欢谈论的内容之一,一般来说,继承都两种方式:接口继承和实现继承而JavaScript中没有接口继承需要的方法,因此只能依靠实现继承.在讲继承的实现之前,我们首先来回顾一下什么是继 ...

  6. 一文读懂JS中的原型和原型链(图解)

    讲原型的时候,我们应该先要记住以下几个要点,这几个要点是理解原型的关键: 1.所有的引用类型(数组.函数.对象)可以自由扩展属性(除null以外). 2.所有的引用类型都有一个’_ _ proto_ ...

  7. 一文搞懂js中的typeof用法

    基础 typeof 运算符是 javascript 的基础知识点,尽管它存在一定的局限性(见下文),但在前端js的实际编码过程中,仍然是使用比较多的类型判断方式. 因此,掌握该运算符的特点,对于写出好 ...

  8. 【转帖】一文看懂docker容器技术架构及其中的各个模块

    一文看懂docker容器技术架构及其中的各个模块 原创 波波说运维 2019-09-29 00:01:00 https://www.toutiao.com/a6740234030798602763/ ...

  9. 让你彻底搞懂JS中复杂运算符==

    让你彻底搞懂JS中复杂运算符== 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一. 在仔细阅读了ECMA ...

随机推荐

  1. 洛谷-P3796-【模板】AC自动机(加强版)

    题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,在fail边的基础上再加一个last边, ...

  2. python将当前时间加上7天

    datetime.datetime.now() + datetime.timedelta(days = 7)).strftime("%Y-%m-%d"

  3. 网络安全与CTF在线学习资源网站

    http://www.sec-wiki.com/skill/ 安全技能(里面渗透逆向编程都有介绍) http://blog.knownsec.com/Knownsec_RD_Checklist/ 知道 ...

  4. 【个人笔记】ximo早期发的脱壳教程——手脱UPX壳

    [个人笔记]ximo早期发的脱壳教程--手脱UPX壳   壳分为两种:压缩壳和加密壳,UPX是一种很简单的压缩壳.   手脱UPX壳: 工具:ExeinfoPE.OD 对象:rmvbfix 方法1:单 ...

  5. 吴裕雄--天生自然python学习笔记:python 用pygame模块加载图片

    加载图片 使用几何绘图无法画出精细的图形,所以我们可以把现成的图片加载到 Pygam e 中直接使用 . 加载图片的语法为 : 图片加载后通常会用 convert 方法加以处理, 以增加显示速度,语法 ...

  6. 系统学习Javaweb8----JavaScript4(结束)

    学习内容: 1.DOM对象 1.2DOM对象--元素对象常见属性 2.JS事件 2.1JS事件--入门案例 2.2JS事件--驱动机制 2.3常见JS事件--点击事件 2.4常见JS事件--点击事件 ...

  7. IP命令介绍

    ip指令可以显示或操作路由.网络设备.设置路由策略和通道 1.语法 ip [选项]  Object  COMMAND [help] Object对象可以是: link  网络设备.addr 设备的协议 ...

  8. git的命令操作指南

    Git图形化界面我用的还可以,但是命令就不太会了,索性和大家一起学习下Git命令的用法...一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. fetch ...

  9. djangp-filter的使用

    目录 Filter定义 Filter定义 定义如下Filter类 class BookFilter(django_filters.FilterSet): name = django_filters.C ...

  10. Exchange Online 权限管理

    在Exchange管理中心,通过权限管理可为管理员.普通用户以及Outlook Web App分别制定不同的权限和策略,以满足精细化分工或差异化角色的需要. 一.管理角色组 组织管理者使用角色组来向管 ...