javascript怎样检测屏幕尺寸_如何获取设备的宽度和高度?

发布时间 - 2026-01-05 00:00:00    点击率:
最常用且可靠的方式是用 window.innerWidth 和 window.innerHeight 获取视口尺寸,它们返回浏览器可视区域宽高(不含滚动条),响应式强、实时更新;screen.width 和 screen.height 则返回设备物理屏幕逻辑像素尺寸,不随横竖屏自动变化;推荐布局适配用 innerWidth + resize 事件(需防抖),断点判断优先用 matchMedia,调试硬件才用 screen。

window.innerWidthwindow.innerHeight 获取视口尺寸

这是最常用、最可靠的方式,返回的是当前浏览器窗口的可视区域(不含滚动条)宽高,单位为像素。它响应式强,页面缩放或窗口拖拽时会实时变化。

注意:不是设备物理屏幕尺寸,而是用户当前看到的“窗口”大小。移动端横竖屏切换时也会立即更新。

  • window.innerWidth 包含垂直滚动条宽度(Chrome/Firefox),Safari 则不包含 —— 如果需要精确布局,建议用 document.documentElement.clientWidth 替代(它始终排除滚动条)
  • 在 iframe 中,获取的是该 iframe 的视口尺寸,不是顶层窗口
  • 服务端渲染(SSR)环境无 window 对象,直接访问会报 ReferenceError: window is not defined
console.log(window.innerWidth);  // 例如:375(iPhone 竖屏)
console.log(window.innerHeight); // 例如:667

screen.widthscreen.height 获取设备屏幕原始分辨率

这两个属性返回的是设备物理屏幕的完整像素尺寸,和浏览器窗口无关。但要注意:它们不随横竖屏旋转而自动更新(iOS Safari 尤其明显),且受系统缩放、DPR 影响,数值未必等于 CSS 像素。

  • screen.width / screen.height 是只读的,不可写
  • 在桌面端基本稳定;但在移动端,某些 Android 浏览器可能返回缩放后的值,iOS Safari 在横屏时仍返回竖屏数值(如 iPhone 13 始终报 414×896)
  • 想获取真实物理像素?需结合 window.devicePixelRatio:例如 screen.width * window.devicePixelRatio 是近似物理宽度(但仍有平台差异)
console.log(screen.width);   // 例如:414(逻辑像素,非物理)
console.log(screen.height);  // 例如:896
console.log(window.devicePixelRatio); // 例如:3(iPhone 13)

监听窗口尺寸变化:用 resize 事件而非轮询

不要用 setInterval 定期查 innerWidth —— 开销大且不精准。浏览器原生 resize 事件更高效,但触发频繁,需防抖。

  • 移动端键盘弹出、地址栏收起都会触发 resize,不一定代表用户真的拖动了窗口
  • 首次加载时事件不会触发,记得手动调用一次初始化逻辑
  • 使用 addEventListener 绑定,避免覆盖已有监听器;销毁时用 removeEventListener(需保留函数引用)
function handleResize() {
  console.log('视口变为:', window.innerWidth, 'x', window.innerHeight);
}
window.addEventListener('resize', handleResize);
// 初始化
handleResize();

响应式判断别只看数字:优先用 matchMedia 做媒体查询检测

硬编码 if (width > 768) 容易失效 —— 比如 iPad Pro 横屏时 innerWidth 可能达 1024,但实际是移动体验。CSS 媒体查询才是语义化标准。

  • matchMedia('(max-width: 768px)') 返回 MediaQueryList 对象,.matches 属性即当前是否匹配
  • 支持监听变化:mediaQuery.addListener(handler)(旧 API)或 mediaQuery.addEventListener('change', handler)(新 API)
  • 比手动读取 innerWidth 更健壮:它和 CSS 渲染引擎同步,不受 JS 执行时机影响
const mobileQuery = window.matchMedia('(max-width: 768px)');
console.log(mobileQuery.matches); // true 或 false
mobileQuery.addEventListener('change', e => {
  console.log('断点状态变更:', e.matches);
});

设备像素比、缩放、iframe 嵌套、SSR 环境、键盘弹出……这些因素会让“屏幕尺寸”变成一个上下文敏感的值。没有银弹,得根据具体场景选 API:布局适配用 innerWidth + resize,设计断点用 matchMedia,调试硬件能力才碰 screen


# css  # javascript  # java  # android  # js  # 编码  # 浏览器  # iphone  # ipad  # safari 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  JavaScript模板引擎Template.js使用详解  使用Dockerfile构建java web环境  如何破解联通资金短缺导致的基站建设难题?  Laravel如何记录自定义日志?(Log频道配置)  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  HTML 中动态设置元素 name 属性的正确语法详解  中国移动官方网站首页入口 中国移动官网网页登录  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何自定义建站之星模板颜色并下载新样式?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  怎样使用JSON进行数据交换_它有什么限制  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  如何实现javascript表单验证_正则表达式有哪些实用技巧  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  利用JavaScript实现拖拽改变元素大小  如何续费美橙建站之星域名及服务?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何生成URL和重定向?(路由助手函数)  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  php json中文编码为null的解决办法  如何在橙子建站上传落地页?操作指南详解  lovemo网页版地址 lovemo官网手机登录  如何在云主机快速搭建网站站点?  Mybatis 中的insertOrUpdate操作  如何在云主机上快速搭建网站?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何快速配置高效服务器建站软件?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  Python文本处理实践_日志清洗解析【指导】  微信小程序 配置文件详细介绍  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  js实现获取鼠标当前的位置  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  网站图片在线制作软件,怎么在图片上做链接?  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何打造高效商业网站?建站目的决定转化率