JS: innerWidth/Heigt、outerWidth/Height、offsetWidth/Height、clientWidth/Height、scrollWidth/Height

理解JavaScript中的窗口与元素尺寸属性
本文详细解析了JavaScript中获取屏幕、浏览器以及元素宽高的一系列属性,包括screen.width/height、window.outerWidth/Height、window.innerWidth/Height、document.documentElement.clientWidth/Height等,并探讨了它们在不同浏览器和模式下的兼容性问题。
部署运行你感兴趣的模型镜像

目录

  1. document.compatMode: 获取浏览器当前的渲染模式
  2. window.screen.width: 获取屏幕的水平宽度
  3. window.screen.height: 获取屏幕的垂直高度
  4. window.screen.availWidth: 获取屏幕的水平可用宽度
  5. window.screen.availHeight: 获取屏幕的水平可用高度
  6. window.outerWidth: 获取浏览器窗口实际宽度
  7. window.outerHeight: 获取浏览器窗口实际高度
  8. window.innerWidth: 获取浏览器可视区的宽度+纵向滚动条的宽度
  9. window.innerHeight: 获取浏览器可视区的高度+横向滚动条的高度
  10. document.documentElement.clientWidth: 获取浏览器可视区的宽度
  11. document.documentElement.clientHeight: 获取浏览器可视区的高度
  12. document.documentElement.offsetWidth: 获取文档根元素本身的实际宽度
  13. document.documentElement.offsetHeight: 获取文档根元素本身的实际高度
  14. document.documentElement.scrollWidth: 获取文档根元素的实际内容宽度
  15. document.documentElement.scrollHeight: 获取文档根元素的实际内容高度
  16. document.body.clientWidth: 获取body元素的内边距区域宽度
  17. document.body.clientHeight: 获取body元素的内边距区域高度
  18. document.body.offsetWidth: 获取body元素本身的实际宽度
  19. document.body.offsetHeight: 获取body元素本身的实际高度
  20. document.body.scrollWidth: 获取body元素的实际内容宽度
  21. document.body.scrollHeight: 获取body元素的实际内容高度
  22. element.clientWidth: 获取元素的内边距区域宽度
  23. element.clientHeight: 获取元素的内边距区域高度
  24. element.offsetWidth: 获取元素本身的实际宽度
  25. element.offsetHeight: 获取元素本身的实际高度
  26. element.scrollWidth: 获取元素的实际内容宽度
  27. element.scrollHeight: 获取元素的实际内容高度

标准模式(CSS1Compat)

一、获取屏幕宽高

注意:受系统分辨率设置的影响

1. 获取屏幕的实际宽高

**所有浏览器都兼容**
window.screen.width: 获取屏幕的水平宽度
window.screen.height: 获取屏幕的垂直高度

2. 获取屏幕的可用宽高

**所有浏览器都兼容**
window.screen.availWidth: 获取屏幕的水平可用宽度(任务栏的宽度除外)
window.screen.availHeight: 获取屏幕的垂直可用高度(任务栏的高度除外)

二、获取浏览器宽高
1. 获取浏览器的实际宽高

**IE9以下不支持**
window.outerWidth: 获取浏览器窗口实际宽度
window.outerHeight: 获取浏览器窗口实际高度

2. 浏览器可视区宽高(visualViewport)

视窗:正常情况下眼睛能看到的显示页面的区域(受物体的远近影响)。

*IE9以下为undefined*
window.innerWidth:获取浏览器视窗的宽度(包含纵向滚动条的宽度)
window.innerHeight: 获取浏览器视窗的高度(包含横向滚动条的高度)


*所有浏览器都兼容*
document.documentElement.clinetWidth
获取浏览器视窗的宽度(不包含纵向滚动条的宽度)
document.documentElement.clientHeight
获取浏览器视窗的高度(不包含横向滚动条的高度)


document.documentElement.offsetWidth
获取DOM文档根元素的宽度(box-sizing:content;)
offsetWidth=内容宽度(width)+左右内边距+左右边框宽度
左右内边距: padding-left + padding-right
左右边框宽度: border-left-width + border-right-width

document.documentElement.offsetHeight
获取DOM文档根元素的高度(box-sizing:content;)
offsetHeight=内容高度(height)+上下内边距+上下边框宽度
上下内边距: padding-top+ padding-bottom
上下边框宽度: border-top-width + border-bottom-width

回忆下现实中盒子物体的宽高计算,一开始就定下来了,不受内部元素物体的影响

浏览器兼容性:
  • IE(5,8,9,10)中: offsetWidth=window.innerWidth, offsetHeight=window.innerHeight
  • IE7中: offsetWidth=clientWidth, offsetHeight=clientHeight

document.documentElement.scrollWidth
获取DOM文档页面的实际宽度,即浏览器可视区宽高+超出可视区的其它部分的宽度
【如果没有滚动条就等于根元素的clientWidth】
document.documentElement.scrollHeight
获取DOM文档页面的实际高度,即浏览器可视区高度+超出可视区的其它部分的高度
【如果没有滚动条就等于根元素的clientHeight】
假设:我在盒子中也有一个带滑动滚动条的异度空间不就是可以装下不受盒子大小的物体吗?


document.body.clientWidth
获取body元素的可视区(内边距区域)宽度:width+padding(left+right)
document.body.clientHeight
获取body元素的可视区(内边距区域)高度:width+padding(top+bottom)


document.body.offsetWidth
获取body元素的Border Area(边框区域)宽度:
width+padding(left+right) + border(left-width±right-width)
document.body.offsetHeight
获取body元素的Border Area(边框区域)高度:
width+padding(top+bottom)+border(top-width+bottom-width)


document.body.scrollWidth
获取body元素可视区宽度(左右内边距+内容区宽度)+超出可视区宽度之外的内容宽度
即document.body.clientWidth + 超出的内容宽度(scrollLeft:横向滚动条拖到最右边)
document.body.scrollHeight
获取body元素可视区宽度(上下内边距+内容区高度)+超出可视区宽度之外的内容高度
即document.body.clientHeight+ 超出的内容高度(scrollTop:横向滚动条拖到最下边)


body的后代元素的clientWidth/Height、offsetWidth/Height、scrollWidth/Height与body的效果一样


结论
scroll只有元素本身的内容是否超出本身盒子content-box有关,不超出时与client是一样的。
client、offset与盒子本身(最初)的大小有关,client不包含边框,offset包含边框。都不包含外边距

见图:

在这里插入图片描述
注意:如果页面被放大可视区相应的就会缩小(就相当于页面离的眼睛越近相应的看到的地方就越小,反之离的越远看到的就越大, 移动端浏览桌面端的网页就是这么个原理)

  // 实际ES6中剩余函数参数的功能
  function restArguments(func, startIndex) {
    return function () {
      var length = func.length,
        argLength = arguments.length,
        index = startIndex - length > 0 ? 0 : startIndex,
        i = 0,
        firstArray = [],
        lastArray = []
      for (; i < index; i++) {
        firstArray.push(arguments[i])
      }
      for (i = index; i < argLength; i++) {
        lastArray.push(arguments[i])
      }
      func.apply(this, firstArray.concat([lastArray]))
    }
  }

  // 偏函数
  write = restArguments(write, 0)

  function write(contents) {
    for (var k in contents) {
      document.write('<br/>' + contents[k])
    }
  }

  write(
    // 浏览器当前的渲染模式-混杂模式/标准模式
    'document.compatMode:' + document.compatMode,
    // 屏幕的分辨率水平像素
    'window.screen.width:' + window.screen.width,
    // 屏幕的分辨率垂直像素
    'window.screen.height:' + window.screen.height,
    // 屏幕的分辨率水平方向的可用像素(不包含任务栏的宽度)
    'window.screen.availWidth:' + window.screen.availWidth,
    // 屏幕的分辨率垂直方向的可用像素(不包含任务栏的高度)
    'window.screen.availHeight:' + window.screen.availHeight,

    // 浏览器窗口的宽度
    'window.outerWidth:' + window.outerWidth,
    // 浏览器窗口的高度
    'window.outerHeight:' + window.outerHeight,
    // 窗口文档可视区宽度+纵向滚动条宽度
    'window.innerWidth:' + window.innerWidth,
    // 窗口文档可视区高度+横向滚动条高度
    'window.innerHeight:' + window.innerHeight,

    // 窗口文档可视区宽度
    'document.documentElement.clinetWidth:' + document.documentElement.clientWidth,
    // 窗口文档可视区高度
    'document.documentElement.clientHeight:' + document.documentElement.clientHeight,
    // 文档根元素的实际宽度不包含外边距(左右)
    'document.documentElement.offsetWidth:' + document.documentElement.offsetWidth,
    // 文档根元素的实际高度不包含外边距(上下)
    'document.documentElement.offsetHeight:' + document.documentElement.offsetHeight,
    // 文档页面的实际宽度(受内部元素的影响),内容不溢出时与clientWidth是一样的
    'document.documentElement.scrollWidth:' + document.documentElement.scrollWidth,
    // 文档页面的实际高度(受内部元素的影响),内容不溢出时与clientHeight是一样的
    'document.documentElement.scrollHeight:' + document.documentElement.scrollHeight,
    
    // 文档body元素的内边距区域宽度(content-box + padding-left/right)
    'document.body.clientWidth:' + document.body.clientWidth,
    // 文档body元素的内边距区域高度(content-box + padding-top/bottom)
    'document.body.clientHeight:' + document.body.clientHeight,
    // 文档body元素的实际宽度不包含外边距(左右)
    'document.body.offsetWidth:' + document.body.offsetWidth,
    // 文档body元素的实际高度不包含外边距(上下)
    'document.body.offsetHeight:' + document.body.offsetHeight,
    // 文档body元素的实际内容宽度(受内部元素的影响),内容不溢出时与clientWidth是一样的
    'document.body.scrollWidth:' + document.body.scrollWidth,
    // 文档body元素的实际内容高度(受内部元素的影响),内容不溢出时与clientHeight是一样的
    'document.body.scrollHeight:' + document.body.scrollHeight,

  )

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 将 DTFrameLogin 的固定高度改为响应式布局的方法 为了使 DTFrameLogin 的高度从固定的 300px 改为响应式布局,可以通过动态计算视口大小并将其应用到 DTFrameLogin 的参数中来实现。以下是具体实现方法: #### 1. **动态计算视口高度** 通过 JavaScript 动态获取视口的高度,并根据需要的比例调整容器尺寸。 ```javascript function getResponsiveSize() { const viewportWidth = window.innerWidth || document.documentElement.clientWidth; const viewportHeight = window.innerHeight || document.documentElement.clientHeight; // 根据视口度动态设置二维码容器的大小,例如设置为视口度的 50% const width = Math.min(300, viewportWidth * 0.5); // 最大度为 300px const height = Math.min(300, viewportHeight * 0.5); // 最大高度为 300px return { width, height }; } ``` 此代码片段中,`window.innerWidth` `document.documentElement.clientWidth` 用于获取视口度,而 `window.innerHeight` `document.documentElement.clientHeight` 则用于获取视口高度[^1]。通过将视口度的 50% 作为默认值,并限制最大度为 300px,可以确保在不同设备上显示效果一致。 #### 2. **调用 DTFrameLogin 并传入动态尺寸** 将上述动态计算的结果传递给 DTFrameLogin 的配置对象。 ```javascript const responsiveSize = getResponsiveSize(); window.DTFrameLogin( { id: 'self_defined_element', width: responsiveSize.width, height: responsiveSize.height }, { redirect_uri: encodeURIComponent('http://www.aaaaa.com/a/b/'), client_id: 'dingxxxxxxxxxxxx', scope: 'openid', response_type: 'code', state: 'xxxxxxxxx', prompt: 'consent' }, (loginResult) => { const { redirectUrl, authCode, state } = loginResult; window.location.href = redirectUrl; console.log(authCode); }, (errorMsg) => { alert(`Login Error: ${errorMsg}`); } ); ``` 在此代码中,`getResponsiveSize()` 函数返回的动态高度被赋值给 DTFrameLogin 的配置对象,从而实现了响应式布局[^1]。 #### 3. **监听窗口大小变化** 为了确保在用户调整浏览器窗口大小时二维码容器也能随之调整,可以监听 `resize` 事件并重新调用 `DTFrameLogin`。 ```javascript window.addEventListener('resize', () => { const newResponsiveSize = getResponsiveSize(); const container = document.getElementById('self_defined_element'); if (container) { container.style.width = `${newResponsiveSize.width}px`; container.style.height = `${newResponsiveSize.height}px`; } }); ``` 通过监听 `resize` 事件,可以动态更新二维码容器的高度,确保其始终适应当前视口大小[^1]。 --- ### CSS 响应式布局补充 除了通过 JavaScript 动态调整大小外,还可以结合 CSS 的媒体查询进一步优化样式。 ```css #self_defined_element { width: 50%; /* 默认占父容器度的 50% */ height: auto; /* 高度自适应 */ max-width: 300px; /* 最大度为 300px */ max-height: 300px; /* 最大高度为 300px */ } @media (max-width: 768px) { #self_defined_element { width: 80%; /* 在小屏幕上占父容器度的 80% */ } } ``` 上述 CSS 代码中,使用了 `max-width` `max-height` 属性限制二维码容器的最大尺寸,同时通过媒体查询在小屏幕设备上调整度比例[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值