当前位置:首页 > 云服务器 > 正文

js获取屏幕高度的方法是什么,视频高度怎么获取

获取屏幕高度和视频高度,核心在于区分客户端的可视区域、屏幕物理分辨率与媒体元素的实际渲染尺寸,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属性设置。

js获取屏幕高度的方法是什么,视频高度怎么获取 第1张

对于不支持跨域读取的场景,尤其是涉及视频加速分发时,推荐使用具备深度优化的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线路在减少跨网延迟方面具备一定优势,适用于对交互响应要求较高的业务场景。

js获取屏幕高度的方法是什么,视频高度怎么获取 第2张

性能优化:避免频繁触发的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双认证,在直播和点播场景下,其智能调度系统能根据用户地理位置返回最近节点,减少视频加载过程中的卡顿现象。

页面高度与视频高度的核心逻辑,始终围绕“视口”与“媒体原始尺寸”两个锚点展开,正确区分它们,再配以合理的监听与计算时机,就能应对绝大多数布局需求。

js获取屏幕高度的方法是什么,视频高度怎么获取 第3张

0