一文理清JS中获取盒子宽高各方法的差异

前言

这段时间在研究一个反爬产品,环境检测用到了很多个盒子宽高取值方法,如window.outerWidthwindow.screen.availWidth,各个方法取值结果不大相同,在此记录下遇到的方法。

各宽方法区别

这里就讲解下各宽度方法的区别,同样可以使用与高度方法的理解
宽度方法:outerWidthwidthinnerWidthoffsetWidthscrollWidthclientWidthavailWidth

以盒子取值区别

一般来说盒子会有widthoffsetWidthscrollWidthclientWidth这四个宽取值方法

width

  • 定义:CSS属性,用于设置元素的宽度。
  • 取值:取决于CSS样式中的设置,可以是像素值(px)、百分比(%)、视口单位(vw)、em、rem等。
  • 特点:这是元素宽度的“设定值”,实际渲染时可能受其他CSS属性(如padding、border、margin)影响。

offsetWidth

  • 定义:JavaScript属性,表示元素的布局宽度,即元素在页面上占用的宽度。
  • 取值:等于元素的CSS宽度加上左右内边距(padding)和左右边框(border)的宽度(如果存在滚动条且可见,则也包含滚动条的宽度)。
  • 特点:这是一个“实际占用宽度”的值,包括了元素内容区、内边距和边框的宽度。

scrollWidth

  • 定义:JavaScript属性,表示元素内容的总宽度。
  • 取值:如果元素内容没有溢出,则scrollWidth等于clientWidth或offsetWidth(取决于是否有边框和内边距);如果内容溢出,则scrollWidth等于内容实际占用的宽度。
  • 特点:这个值用于确定元素内容的总宽度,即使部分内容不可见(因为溢出)。

clientWidth

  • 定义:JavaScript属性,表示元素内容区加上左右内边距的宽度。
  • 取值:等于元素的CSS内容宽度加上左右内边距的宽度(不包括边框和滚动条的宽度)。
  • 特点:这个值反映了元素可见内容的宽度,不考虑边框和滚动条。

具象展示

如下图,我们设置了一个width=56的按钮,其边框(border)=3、内边距(padding)=6和外边距(margin)=5,那么它的各宽方法取值结果如下

width:56
offsetWidth:74(width + padding(6*2)+ border(3*2))
scrollWidth:68(width + padding(6*2))
clientWidth:68(width + padding(6*2))

在这里插入图片描述

一般取值结果大小关系

在大多数情况下(不考虑滚动条和边框对内边距和内容区的影响,且内容没有溢出):

  • offsetWidthclientWidth:因为offsetWidth包括了边框的宽度(如果有的话),而clientWidth不包括。
  • scrollWidth = offsetWidth(或clientWidth,取决于是否有边框和内边距导致的内容溢出):在没有内容溢出的情况下,scrollWidth等于元素的布局宽度或可见内容宽度。
  • width(CSS设定值)与offsetWidthclientWidth的关系取决于具体的CSS样式和元素布局。如果CSS样式中只设置了width,没有padding和border,那么width可能等于clientWidth(但不等于offsetWidth,因为offsetWidth还包括了边框)。如果设置了padding和border,则这些值之间会有差异。

需要注意的是,当元素内容溢出时,scrollWidth的值会大于clientWidth和offsetWidth(如果滚动条可见且包含在offsetWidth中,则可能等于offsetWidth)。此外,不同浏览器对边框、内边距和滚动条的处理可能有所不同,因此在实际开发中需要注意这些差异。

以屏幕取值区别

这种取值在反爬检测中比较常见,下面列出我遇到的检测点进行讲解:

  1. window.screen.availWidthwindow.screen.availHeight
  2. window.screen.widthwindow.screen.availHeight
  3. window.innerWidthwindow.innerHeight
  4. document.body.clientWidthdocument.body.clientHeight
  5. window.outerWidthwindow.outerHeight

window.screen.width

  • 取值方式:这个属性返回用户屏幕的整个宽度(以像素为单位),包括所有系统级元素,如任务栏、窗口边框等。
  • 结果大小:通常大于或等于window.screen.availWidth,因为它包括了屏幕上的所有区域。

window.screen.availWidth

  • 取值方式:这个属性返回用户屏幕的可用宽度(以像素为单位),即屏幕宽度减去系统级元素(如任务栏、窗口边框)所占用的空间。
  • 结果大小:通常小于或等于window.screen.width,因为availWidth考虑了屏幕上的不可用区域。

window.innerWidth

  • 取值方式:这个属性返回浏览器视口(viewport)的内部宽度(以像素为单位),即浏览器窗口的可见内容区域宽度,不包括浏览器的边框、滚动条、书签栏等。
  • 结果大小:可能小于window.screen.availWidth(因为浏览器窗口可能不是全屏的,或者因为存在浏览器边框、书签栏等),并且可能大于或小于document.body.clientWidth(取决于页面的布局和滚动情况)。

window.outerWidth

  • 取值方式:这个属性返回整个浏览器窗口的宽度(以像素为单位),包括窗口的边框、标题栏、滚动条等所有组成部分。
  • 结果大小:通常大于window.innerWidth,因为它包括了浏览器窗口的所有外部元素。

document.body.clientWidth

  • 取值方式:这个属性返回HTML文档主体(body)的宽度(以像素为单位),即文档内容区域的宽度,不包括滚动条的宽度(如果存在的话)。注意,这个值可能会受到CSS样式(如边距、填充、边框等)的影响。
  • 结果大小:可能小于或等于window.innerWidth(因为页面内容可能设置了边距、填充或因为内容宽度本身小于视口宽度),也可能大于window.innerWidth(如果页面内容超出了视口并产生了水平滚动条,但滚动条本身不计入clientWidth)。

具象展示

我的屏幕大小宽度是2560,下图是在开发者工具不影响宽度时它们的取值结果
在这里插入图片描述

当把开发者工具置于向右时它们的取值结果
在这里插入图片描述

当把开发者工具置于向下同时缩小浏览器窗口时它们的取值结果
在这里插入图片描述

通过上面的对比可以知道,一般情况下window.screen.widthwindow.screen.availWidth跟屏幕的大小有关,不会受到浏览器界面状态影响;而window.outerWidthwindow.innerWidthdocument.body.clientWidth则跟浏览器界面大小有关, 会受到浏览器界面状态影响。而这个值差就很容易被检测到,毕竟调试时一般会影响浏览器界面状态。

一般取值结果大小关系

  • window.screen.width >= window.screen.availWidth(屏幕的整个宽度通常大于或等于可用宽度)
  • window.outerWidth >= window.innerWidth(浏览器窗口的外部宽度通常大于或等于内部宽度)
  • window.screen.availWidthwindow.innerWidth 之间没有固定的关系,因为浏览器窗口可能不是全屏的,也可能受到操作系统设置、浏览器布局等因素的影响。
  • window.innerWidthdocument.body.clientWidth 之间也没有固定的关系,因为页面的布局和CSS样式会影响document.body.clientWidth的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/500220.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqoop将MySQL数据导入hive

使用脚本加载数据 MySQL有一张表 hive创建一张相同的表 编写脚本同步数据 [rootmaster sqoop]# vim stu.sh#!/bin/bash SQOOP/usr/local/soft/sqoop-1.4.6/bin/sqoop $SQOOP import --connect jdbc:mysql://192.168.67.100:3306/sqoop \--username root \--password 123456 \-…

Docker Compose编排

什么是 Docker Compose? Docker Compose 是 Docker 官方推出的开源项目,用于快速编排和管理多个 Docker 容器的应用程序。它允许用户通过一个 YAML 格式的配置文件 docker-compose.yml 来定义和运行多个相关联的应用容器,从而实现对容器的统一管理和编…

[羊城杯 2024]hiden

一顿解压之后发现有两个文件: 尝试了Rot47解密,得到一个看起来挺像一回事的解码结果: 再将得到的解码结果试试Rot13解密,成功得到正确的解码结果: import wave with open(flag.txt, rb) as f:txt_data f.read()file_l…

LeetCode - 初级算法 数组(只出现一次的数字)

只出现一次的数字 这篇文章讨论如何找到一个数组中只出现一次的数字,确保算法的时间复杂度为线性,且只使用常量额外空间。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个非空整数数组 nums,除了某个元素只出现一次以外,其余每个元素均出现两…

【谷歌开发者月刊】十二月精彩资讯回顾,探索科技新可能

我们在今年的尾声中回顾本月精彩,开发者们借助创新技术为用户打造温暖的应用体验,展现技术与实用的结合。欢迎您查阅本期月刊,掌握最新动态。 本月看点 精彩看点多多,请上下滑动阅览 01DevFest 北京站和上海站圆满举办&#xff0c…

LinuxC高级day4

作业: 1.思维导图 2.终端输入一个C源文件名(.c结尾)判断文件是否有内容,如果没有内容删除文件,如果有内容编译并执行改文件。 3.终端输入两个文件名,判断哪个文件的时间戳更新

数据中台与数据治理服务方案[50页PPT]

本文概述了数据中台与数据治理服务方案的核心要点。数据中台作为政务服务数据化的核心,通过整合各部门业务系统数据,进行建模与加工,以新数据驱动政府管理效率提升与政务服务能力增强。数据治理则聚焦于解决整体架构问题,确保数据…

MAC环境安装(卸载)软件

MAC环境安装(卸载)软件 jdknode安装node,并实现不同版本的切换背景 卸载node从node官网下载pkg安装的node卸载用 homebrew 安装的node如果你感觉删的不够干净,可以再细分删除验证删除结果 jdk 1.下载jdk 先去官网下载自己需要的版…

时间序列预测算法---LSTM

文章目录 一、前言1.1、深度学习时间序列一般是几维数据?每个维度的名字是什么?通常代表什么含义?1.2、为什么机器学习/深度学习算法无法处理时间序列数据?1.3、RNN(循环神经网络)处理时间序列数据的思路?1.4、RNN存在哪些问题?…

LinuxC高级day2

1.在家目录下创建目录文件,dir a.dir下创建dir1和dir2 b.把当前目录下的所有文件拷贝到dir1中, c.把当前目录下的所有脚本文件拷贝到dir2中 d.把dir2打包并压缩为dir2.tar.xz e.再把dir2.tar.xz移动到dir1中 f.解压dir1中的压缩包 g.使用tree工具&#x…

14. 日常算法

1. 面试题 02.04. 分割链表 题目来源 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 class Solution { public:ListNo…

ubuntu 如何使用vrf

在Ubuntu或其他Linux系统中,您使用ip命令和sysctl命令配置的网络和内核参数通常是临时的,这意味着在系统重启后这些配置会丢失。为了将这些配置持久化,您需要采取一些额外的步骤。 对于ip命令配置的网络接口和路由,您可以将这些配…

SpringMVC进阶(自定义拦截器以及异常处理)

文章目录 1.自定义拦截器 1.基本介绍 1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门 1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径 1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器 1.执…

Mac电脑python多版本环境安装与切换

我当前是python3.9.6环境,需要使用3.9.8环境,通过brew安装3.9.8版本,然后通过pyenv切换环境 步骤 1: 安装 pyenv brew install pyenv brew install pyenv-virtualenv 步骤 2: 安装 Python 3.9.8(使用 pyenv 安装指定版本的 Pyth…

【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块

目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…

基于服务器部署的综合视频安防系统的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。国产化人工智能“…

12.31【Linux】shell脚本【运行方式,修改环境变量,数组】思维导图 内附练习

1.思维导图 2练习: 1.尝试将下列指令放到脚本中运行 在家目录下创建目录文件dir1,把/etc/passwd拷贝到dir1中,把/etc/group拷贝到dir1中并重命名为grp.txt,使用tree指令,显示dir1目录的文件树,把dir1&am…

win11 vs2022 opencv 4.10 camshift示例程序运行

记录win11 vs2022 opencv 4.10下 camshift等示例程序的单步debug启动方式,方便了解源码。 debug版本编译通过,但运行时报出大量日志信息(部分dll加载FAILED后会自动找兼容dll)。但也能继续运行,效果如下 release版本可以直接运行&#xff0…

赛博周刊·2024年度工具精选(图片资源类)

1、EmojiSpark emoji表情包查找工具。 2、fluentui-emoji 微软开源的Fluent Emoji表情包。 3、开源Emoji库 一个开源的emoji库,目前拥有4000个emoji表情。 4、中国表情包大合集博物馆 一个专门收集中国表情包的项目,已收录5712张表情包,并…

通过Cephadm工具搭建Ceph分布式存储以及通过文件系统形式进行挂载的步骤

1、什么是Ceph Ceph是一种开源、分布式存储系统,旨在提供卓越的性能、可靠性和可伸缩性。它是为了解决大规模数据存储问题而设计的,使得用户可以在无需特定硬件支持的前提下,通过普通的硬件设备来部署和管理存储解决方案。Ceph的灵活性和设计…