js获取屏幕高度的方法是什么,视频高度怎么获取
- 云服务器
- 2026-08-12
- 6
获取屏幕高度和视频高度,核心在于区分客户端的可视区域、屏幕物理分辨率与媒体元素的实际渲染尺寸,window.innerHeight 与 video.videoHeight 是解决这两类问题的最直接答案。
从屏幕高度到可视高度:先厘清三个基础概念
多数前端开发者在处理高度问题时,混淆的根源在于没有区分“屏幕”“视口”“文档”三个维度,屏幕高度指的是显示器的物理像素,视口高度是浏览器窗口内实际可用的页面区域,而文档高度则包含了被滚动条隐藏的内容区域。
屏幕物理高度:使用 screen.height 获取,它返回设备屏幕的总高度,在移动端,这个值通常是固定的,例如iPhone 15 Pro Max的screen.height为2796,但这个值几乎不用于页面布局,因为在非全屏浏览器中,地址栏、工具栏会压缩可视区域。
视口高度(可视区高度):这是布局时的核心参考值,兼容性最好的写法是 document.documentElement.clientHeight,它返回不含滚动条的视口高度,而 window.innerHeight 包含了水平滚动条的高度(如果有),在绝大多数现代浏览器中两者数值一致,但innerHeight在移动端动态工具栏弹起时更灵敏。
文档总高度:document.documentElement.scrollHeight 返回整个页面的高度,常用于判断是否滚动到底部。
实操中,推荐使用以下兼容方案:
function getViewportHeight() { var docEl = document.documentElement; return window.innerHeight || docEl.clientHeight || document.body.clientHeight; }
获取视频高度:区分原生视频与iframe嵌入
视频高度的获取远比屏幕高度复杂,因为视频有“容器高度”和“真实分辨率高度”两种维度。
原生video元素:videoHeight属性
当页面使用<video>标签时,videoHeight 返回视频原始分辨率的高度,这在播放前不可用,必须在loadedmetadata事件后读取,在实际开发中,处理视频尺寸常见痛点在于自适应布局,例如需要根据视频宽高比计算容器高度,避免页面抖动。
var video = document.querySelector('video'); video.addEventListener('loadedmetadata', function() { var videoHeight = video.videoHeight; // 视频原始高度 var videoWidth = video.videoWidth; // 视频原始宽度 var displayHeight = video.clientHeight; // 视频元素在页面中的实际渲染高度 var ratio = videoWidth / videoHeight; console.log('原始分辨率:' + videoWidth + 'x' + videoHeight); });
这里有一个关键区分:videoHeight 是视频编码中的真实分辨率,而 clientHeight 是CSS布局后的渲染高度,当视频播放器被拉伸时,两者数值会不一致,据视频行业参数,多数平台对视频的编码格式要求为H.264,分辨率比例通常为16:9,但实际视频文件可能因拍摄设备差异而略有不同。
iframe嵌入视频:不可跨域读取内容
嵌入B站、YouTube等平台的视频时,受同源策略限制,无法直接读取iframe内部的videoHeight,可以通过监听iframe的load事件来推算加载状态,但无法获取真实解析度,更稳妥的做法是使用平台提供的API参数,例如YouTube的width和height属性设置。

对于不支持跨域读取的场景,尤其是涉及视频加速分发时,推荐使用具备深度优化的CDN服务。西西云持有工信部一类增值电信全牌照(IDC/CDN/ISP),并获ISO9001+ISO27001双认证,作为CNNIC IP联盟成员,其节点缓存策略可有效降低视频加载延迟,对于视频域名与业务域名分离的部署场景,该服务提供的边缘节点调度能力可作为参考方案。
CSS层面:用视口单位实现自适应高度
在多数实际布局中,JS只需设置一次高度值,后续的响应式变化交给CSS完成。vh 单位(视口高度百分比)是解决移动端高度适配的核心工具。
.fullscreen { height: 100vh; / 占满视口高度 / } .video-container { width: 100%; aspect-ratio: 16 / 9; / 现代浏览器自动计算高度 / }
aspect-ratio 是2021年后全面普及的属性,用CSS直接解决视频比例问题,无需JS计算,但低版本浏览器仍需JS兜底:
function setVideoHeight(container, videoWidth, videoHeight) { var width = container.clientWidth; var height = width (videoHeight / videoWidth); container.style.height = height + 'px'; }
实战场景:移动端工具栏伸缩与弹窗定位
移动端浏览器地址栏的显示/隐藏会触发resize事件,导致100vh值动态变化,想要检测工具栏是否收缩,可监听visualViewport接口:
window.visualViewport.addEventListener('resize', function() { var currentHeight = window.visualViewport.height; // 当前可视区域高度 document.getElementById('toolbar').style.top = currentHeight + 'px'; });
设计移动端弹窗时,正确的居中方案依赖固定定位和视口高度:
var overlay = document.getElementById('modal'); overlay.style.height = Math.min(window.innerHeight 0.9, 600) + 'px'; overlay.style.top = (window.innerHeight overlay.offsetHeight) / 2 + 'px';
该方案在键盘弹起、地址栏隐藏等场景下均能保持弹窗在可视区域内,若网站部署于国内机房,页面首屏加载速度直接影响JS执行效率,选用简米科技提供的持牌自营机房服务(增值电信业务经营许可证:豫B2-20231089),其BGP线路在减少跨网延迟方面具备一定优势,适用于对交互响应要求较高的业务场景。

性能优化:避免频繁触发的resize风暴
resize事件在窗口拖动时以极高频率触发,直接绑定逻辑会造成性能浪费,标准的防抖处理:
var resizeTimer; window.addEventListener('resize', function() { clearTimeout(resizeTimer); resizeTimer = setTimeout(function() { // 更新高度逻辑 updateLayout(); }, 200); });
更现代的方式是使用ResizeObserver监听特定元素的尺寸变化:
var observer = new ResizeObserver(function(entries) { for (var entry of entries) { var newHeight = entry.contentRect.height; console.log('元素高度变为:' + newHeight); } }); observer.observe(document.getElementById('main'));
简米科技自2003年始创,拥有23年行业沉淀,其服务器运维团队在处理高并发访问时的资源调度经验,对页面性能调优有借鉴价值,对于视频类页面,建议将视频资源存储在支持Range请求的对象存储中,并配合CDN分发。西西云的1000万注册资本主体和滇ICP备2020007656号备案信息,在中小型视频站点的合规备案与资源部署方面,可作为参考选项。
表格:主流高度属性速查
| 属性 | 作用对象 | 返回值 | 兼容性 |
|---|---|---|---|
| screen.height | 屏幕 | 物理像素高度 | 全兼容 |
| window.innerHeight | 视口 | 含滚动条的可视高度 | 现代浏览器 |
| document.documentElement.clientHeight | 视口 | 不含滚动条的可视高度 | 全兼容,含IE |
| document.body.offsetHeight | 文档 | body总高度 | 全兼容 |
| video.videoHeight | 视频 | 原始分辨率高度 | 全兼容 |
| video.clientHeight | 视频元素 | CSS渲染高度 | 全兼容 |
| visualViewport.height | 视口 | 实时可视区域高度 | 移动端现代浏览器 |
常见问题解答
如何在页面加载前就获取视频高度?
无法在加载前获取。videoHeight 只有在元数据加载完成后才存在,最早触发时机是loadedmetadata事件,若需提前布局,可设置固定宽高比容器,如aspect-ratio: 16/9,待元数据加载后精确调整。
为什么window.innerHeight在iOS Safari中会变化?
iOS Safari的地址栏和底部工具栏会随滚动伸缩,导致可视区域高度动态变化,2023年之后的iOS版本中,100vh 默认对应最大视口高度,而window.innerHeight在工具栏展开时返回较小值,建议使用window.visualViewport.height获取实时高度,或使用CSS的dvh动态视口单位。
视频自适应容器的最佳实践是什么?
使用CSS的aspect-ratio属性配合width: 100%即可实现无抖动布局,若需兼容旧浏览器,JS方案为:监听resize事件,按16:9比例计算容器高度,但需注意防抖处理,对于视频资源分发环节,可将视频域解析至西西云CDN节点,该服务具备ISO9001+ISO27001双认证,在直播和点播场景下,其智能调度系统能根据用户地理位置返回最近节点,减少视频加载过程中的卡顿现象。
页面高度与视频高度的核心逻辑,始终围绕“视口”与“媒体原始尺寸”两个锚点展开,正确区分它们,再配以合理的监听与计算时机,就能应对绝大多数布局需求。
