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

news2025/5/13 7:38:13

前言

这段时间在研究一个反爬产品,环境检测用到了很多个盒子宽高取值方法,如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.coloradmin.cn/o/2269566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AWVS安装使用教程

一、AWVS工具介绍及下载 AWVS工具介绍 AWVS(Acunetix Web Vulnerability Scanner)是一款知名的网络漏洞扫描工具,它通过网络爬虫测试你的web站点,检测流行安全漏洞,可以检查SQL注入漏洞,也可以检查跨站脚…

用Python操作字节流中的Excel文档

Python能够轻松地从字节流中加载文件,在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作,并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性,还确保了数据的安全性和完整性,尤其是在网络…

【LeetCode】928、尽量减少恶意软件的传播 II

【LeetCode】928、尽量减少恶意软件的传播 II 文章目录 一、并查集1.1 并查集 二、多语言解法 一、并查集 1.1 并查集 先把普通点, build 并查集遍历每个源头点, 找源头点附近的点所在的集合, 传染该集合拯救节点 3.1 若该节点 所在集合, 从未被感染过, 则开始感染 3.2 若该节…

(NDSS2024)论文阅读——仅低质量的训练数据?用于检测加密恶意网络流量的稳健框架

文章基本信息 作者:Yuqi Qing et al. (清华大学李琦团队) 代码 文章 摘要 存在问题:收集包含足够数量的带有正确标签的加密恶意数据的训练数据集是具有挑战性的,当使用低质量的训练数据训练机器学习模型时&#xff…

如何将CSDN文章 导出为 PDF文件

一、首先,打开我们想要导出为 PDF格式的 CSDN文章,以下图为例。 二、按 F12 调出浏览器调式模式后,选择 控制台 三、在控制台处粘贴代码 代码: (function(){ use strict;var articleBox $("div.article_content"…

YApi接口管理平台本地搭建方法介绍

YApi是一个免费开源的API管理平台,开发人员可用它来管理、调试接口,并且提供了API文档管理和测试功能,具有友好的UI页面,本文介绍Linux环境如何安装部署YApi接口管理平台。 目录 1 环境准备2 安装部署2.1 安装nodejs2.2 安装 Mong…

案例分析-采样率对模拟链路的带宽的影响

目录 问题来源: 情况分析: 总结 问题来源: 在进行模拟带宽调整时,发现设计值 与实测值,不一样,就这一问题,进行详细分析。 情况分析: 在本项目中,采用巴特沃兹四阶滤波器,设计带宽350M,改滤波器设计可以采用fiter solution工具进行设计,实测值仅仅260M,因此针…

Huggingface Trending!可控人物图像生成统一框架Leffa,可精确控制虚拟试穿和姿势转换!

今天给大家介绍一个Huggingface上虚拟试穿的热门项目Leffa,Leffa是一个可控人物图像生成的统一框架,可以精确操纵外观(即虚拟试穿)和姿势(即姿势转换)。从效果看生成效果很不错! 相关链接 论文&…

memcached的基本使用

memcached是一种基于键值对的内存数据库,一般应用于缓存数据,提高数据访问速度,减轻后端数据库压力。 安装 这里以Ubuntu为例,其他系统安装方法请看官方文档。 sudo apt-get update sudo apt-get install memcached启动 memca…

ROS话题通信

1 .理论模型 话题通信实现模型是比较复杂的,该模型如下图所示,该模型中涉及到三个角色: ROS Master (管理者)Talker (发布者)Listener (订阅者) ROS Master 负责保管 Talker 和 Listener 注册的信息,并匹配话题相同的 Talker 与 Listener,…

经验证:将数据从索尼传输到Android的 4 种方法

概括 像Android Galaxy S20 这样的新型Android智能手机很酷,但除了将数据从索尼传输到Android之外。众所周知,旧的索尼手机上存储着大量的文件,因此将数据从旧的索尼手机传输到新的Android手机非常重要。为了解决这个问题,我们做…

VITUREMEIG | AR眼镜 算力增程

根据IDC发布的《2024年第三季度美国AR/VR市场报告》显示,美国市场AR/VR总出货量增长10.3%。其中,成立于2021年的VITURE增长速度令人惊艳,同比暴涨452.6%,成为历史上增长最快的AR/VR品牌。并在美国AR领域占据了超过50%的市场份额&a…

JavaSpring AI与阿里云通义大模型的集成使用Java Data Science Library(JDSL)进行数据处理

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…

git reset --hard(重置到当前提交,所有未提交的更改都会被永久丢弃)

git reset --hard 是一个强大的命令,它会将你的工作目录、暂存区和当前分支的 HEAD 指针重置到指定的提交状态,所有未提交的更改都会被永久丢弃。因此,使用这个命令时需要非常小心。 基本用法 重置到当前提交(丢弃所有未提交的更…

基于单片机智能水产养殖系统设计(论文+源码)

1 系统方案设计 根据系统设计需求,对智能水产养殖系统总体方案展开详细设计。如图2.1所示为系统设计总框架,系统以STM32单片机作为主控制器,通过DS18B20温度传感器、水位传感器、TSW-30浊度传感器、光照传感器实现水产养殖环境中水温、水位、…

基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

Mysql学习笔记之约束

1.简介 MySQL中的约束用于定义表中数据的规则,以确保数据的准确性和完整性。以保证数据表中数据的有效性、正确性和完整性。 2.约束分类 在mysql中约束分类如下: 约束说明关键字主键约束每个表只能有一个主键;主键的值必须唯一&#xff0…

LabVIEW 实现自动对焦的开发

自动对焦(Autofocus, AF)技术是通过分析图像或传感器信号,动态调整焦点位置以实现清晰成像或高精度定位的过程。在LabVIEW中,可以通过集成信号采集、数据处理、控制算法和硬件接口模块,实现多种自动对焦方法&#xff0…

2024年第52周ETF周报

ETF 第52 周 ( 2024-12-23 至 2024-12-29 )周报 核心观点 ETF 业绩表现 股票型ETF周度收益率中位数为1.0731%宽基ETF中,科创创业50涨跌幅中位数为1.5625%,跌幅最小。按板块划分,金融涨跌幅中位数为1.9334%&#xff…

[Qt] 万字详解Qt入门~ Qt Creator | 对象树 | 控件布局

目录 1. Qt Creator 概览 2. 使用 Qt Creator 新建项目 3. 认识 Qt Creator 界面 4. Qt Hello World 程序 1. 使用 “按钮” 实现 2. 使用 “标签” 实现 3. 使用 “编辑框” 实现 5. 项目文件解析 1. 命名空间声明与作用 2. class Widget : public QWidget 6. Qt 编…