J*aScript 实时监测与获取浏览器窗口尺寸教程


JavaScript 实时监测与获取浏览器窗口尺寸教程

本文详细介绍了如何使用 j*ascript 动态获取浏览器窗口的实时宽度和高度,并响应窗口大小变化。内容涵盖了原生 j*ascript 的事件监听机制,以及在 react 应用中通过自定义 hook 实现的封装方法,旨在帮助开发者构建高效、响应式的用户界面。

在现代 Web 开发中,构建响应式布局是不可或缺的一部分。虽然 CSS 媒体查询能处理大多数响应式需求,但在某些场景下,我们需要通过 J*aScript 动态获取并响应浏览器窗口的尺寸变化,例如根据窗口大小调整组件行为、执行复杂的布局计算或触发特定的动画。

实时获取浏览器窗口尺寸的核心方法

J*aScript 提供了 window.innerWidth 和 window.innerHeight 属性,用于获取浏览器视口(viewport)的当前宽度和高度(不包括浏览器工具栏和滚动条)。要实现“持续返回”尺寸,关键在于监听 window 对象的 resize 事件。

1. 使用 window.innerWidth 和 window.innerHeight

这两个属性是获取当前视口尺寸最直接的方式。

  • window.innerWidth: 返回浏览器窗口的内部宽度,以像素计。
  • window.innerHeight: 返回浏览器窗口的内部高度,以像素计。

这些值会在窗口大小发生变化时实时更新。

2. 监听 resize 事件

为了在窗口尺寸改变时执行特定操作,我们需要为 window 对象添加一个 resize 事件监听器。

/**
 * 处理窗口尺寸变化的函数
 */
function handleResize() {
  const newWidth = window.innerWidth;
  const newHeight = window.innerHeight;

  // 在这里执行你需要根据新尺寸进行的操作
  // 例如,更新 DOM 元素的内容或调整布局
  document.getElementById("app").innerHTML = `
    当前窗口宽度: ${newWidth}px, 
    当前窗口高度: ${newHeight}px
  `;
  console.log(`窗口尺寸更新: 宽度 ${newWidth}px, 高度 ${newHeight}px`);
}

// 注册 resize 事件监听器
window.addEventListener("resize", handleResize);

// 页面加载时立即调用一次,以获取初始尺寸
handleResize();

代码解析:

  1. handleResize() 函数: 这是一个回调函数,当 window 的 resize 事件被触发时,它将被执行。在此函数内部,我们获取当前的 window.innerWidth 和 window.innerHeight,并可以根据这些值更新 UI 或执行其他逻辑。
  2. window.addEventListener("resize", handleResize): 这行代码将 handleResize 函数注册为 window 对象 resize 事件的监听器。每当用户调整浏览器窗口大小时,handleResize 函数就会被调用。
  3. handleResize() (初始调用): 在页面加载完成后,我们通常需要立即调用一次 handleResize 函数,以确保在没有任何 resize 事件发生之前,页面就能正确显示或使用初始的窗口尺寸。

在 React 应用中封装窗口尺寸监听

在 React 等现代前端框架中,为了更好地管理状态和副作用,通常会将这种逻辑封装成自定义 Hook。以下是一个 useWindowSize Hook 的示例,它能在 React 组件中方便地获取和响应窗口尺寸。

import { useEffect, useState } from 'react';

/**
 * 一个自定义 React Hook,用于实时获取和提供浏览器窗口的尺寸。
 * @returns {{width: number | undefined, height: number | undefined}} 包含窗口宽度和高度的对象。
 */
export function useWindowSize() {
  // 使用 useState 存储窗口尺寸,初始值为 undefined
  const [windowSize, setWindowSize] = useState({
    width: undefined,
    height: undefined
  });

  useEffect(() => {
    // 定义处理 resize 事件的回调函数
    function handleResize() {
      // 更新状态
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight
      });
    }

    // 注册 resize 事件监听器
    window.addEventListener('resize', handleResize);

    // 组件挂载时立即调用一次,获取初始尺寸
    handleResize();

    // 返回一个清理函数,在组件卸载时移除事件监听器
    return () => window.removeEventListener('resize', handleResize);
  }, []); // 空依赖数组表示此 effect 只在组件挂载和卸载时运行一次

  return windowSize;
}

useWindowSize Hook 的使用示例:

import React from 'react';
import { useWindowSize } from './useWindowSize'; // 假设 useWindowSize 在同一文件或路径下

function MyResponsiveComponent() {
  const { width, height } = useWindowSize();

  if (width === undefined || height === undefined) {
    return <div>正在获取窗口尺寸...</div>;
  }

  return (
    <div>
      <h1>我的响应式组件</h1>
      <p>当前窗口宽度: {width}px</p>
      <p>当前窗口高度: {height}px</p>
      {width < 768 ? (
        <p>这是一个小屏幕设备。</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/1115">
                            <img src="https://img.php.cn/upload/ai_manual/001/246/273/68b6d8f7c530c315.png" alt="即梦AI">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/1115">即梦AI</a>
                            <p>一站式AI创作平台,免费AI图片和视频生成。</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="即梦AI">
                                <span>16094</span>
                            </div>
                        </div>
                        <a href="/ai/1115" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="即梦AI">
                        </a>
                    </div>
                
      ) : (
        <p>这是一个大屏幕设备。</p>
      )}
    </div>
  );
}

export default MyResponsiveComponent;

代码解析:

  1. useState: 用于在组件中存储和更新 windowSize 状态。初始值设为 undefined,表示尺寸尚未获取。
  2. useEffect: 用于处理副作用,即事件监听器的注册和清理。
    • handleResize: 与原生 JS 示例中的函数类似,它获取当前窗口尺寸并更新 windowSize 状态。
    • window.addEventListener('resize', handleResize): 注册事件监听器。
    • handleResize(): 在 useEffect 首次执行时调用一次,确保组件挂载时即有正确的尺寸。
    • return () => window.removeEventListener('resize', handleResize): 这是 useEffect 的清理机制。当组件卸载时,此函数会被调用,从而移除事件监听器,防止内存泄漏。
    • [] (空依赖数组): 确保 useEffect 中的副作用函数只在组件挂载时执行一次,并在组件卸载时清理一次。

最佳实践与注意事项

在实际应用中,处理 resize 事件时需要考虑一些性能和用户体验方面的最佳实践。

1. 性能优化:防抖 (Debouncing) 与节流 (Throttling)

resize 事件在用户拖动窗口时会频繁触发,这可能导致 handleResize 函数被反复调用,如果函数内部执行了复杂的 DOM 操作或计算,可能会引起性能问题。

  • 防抖 (Debouncing): 在事件停止触发后的一段时间内才执行回调函数。例如,用户拖动窗口时,每次 resize 事件都会重置一个计时器,只有当停止拖动(即在指定时间内没有新的 resize 事件触发)后,回调函数才会被执行。这适用于只需要在尺寸最终确定时执行一次操作的场景。
  • 节流 (Throttling): 在一段时间内只执行一次回调函数。例如,每 200 毫秒最多执行一次 handleResize。这适用于需要持续响应但又不想过于频繁的场景。

可以使用 Lodash 等库提供的 debounce 或 throttle 函数,或者手动实现。

防抖示例:

function debounce(func, delay) {
  let timeout;
  return function(...args) {
    const context = this;
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(context, args), delay);
  };
}

const debouncedHandleResize = debounce(handleResize, 200); // 200毫秒防抖

window.addEventListener("resize", debouncedHandleResize);
handleResize(); // 首次调用仍然需要

2. 初始尺寸获取的重要性

无论是原生 J*aScript 还是 React Hook,都应该在组件加载或脚本执行时立即调用一次处理函数,以确保在任何 resize 事件发生之前,应用程序就已经获取并使用了正确的窗口尺寸。

3. 事件监听器的清理

在原生 J*aScript 中,如果页面跳转或元素被移除,需要手动调用 window.removeEventListener()。在 React useEffect 中,通过返回一个清理函数,可以确保在组件卸载时自动移除监听器,避免内存泄漏。

4. 与 CSS Media Queries 的结合

对于大多数基于断点的响应式布局调整,CSS Media Queries 仍然是首选方案,因为它更具声明性且性能更优。J*aScript 应该用于处理那些 CSS 无法直接实现或需要动态计算的响应式行为。

总结

通过 window.innerWidth、window.innerHeight 和 window.addEventListener('resize', ...),我们可以有效地在 J*aScript 中获取并响应浏览器窗口的尺寸变化。在原生 JS 环境中,需要手动管理事件监听器的注册和清理;而在 React 等框架中,通过自定义 Hook 可以更优雅地封装这一逻辑,实现状态管理和生命周期控制。同时,为了优化性能和用户体验,合理运用防抖和节流技术是至关重要的。

以上就是J*aScript 实时监测与获取浏览器窗口尺寸教程的详细内容,更多请关注其它相关文章!


# 这是一个  # 安徽优化关键词排名系统  # 济南企业品牌网站建设  # 增城网站排名推广优化  # 南京怎么优化企业网站  # 优质网站建设具备哪些  # 西藏seo入门的好方法  # 章丘网站建设斯文  # 小蓄科技一站式网站推广  # 如何运营淘宝店铺seo  # 宁河公司网站建设  # 加载  # 适用于  # 首次  # 拖动  # 时间内  # css  # 移除  # 防抖  # 自定义  # 回调  # 工具  # 回调函数  # app  # 浏览器  # windows  # 前端  # js  # html  # java  # javascript  # react 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条  睡觉时心跳快是什么原因 夜间心悸如何应对  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  《全民k歌》网页版最新登录入口一览  如何在mysql中使用索引提示_mysql索引提示优化方法  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  Go App Engine 项目结构与包管理深度指南  铁路12306官网入口 铁路12306中国铁路官网登录首页  iSpring三分屏制作教程  windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化  Python测试中模块导入路径解析的最佳实践  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  sf漫画官网登录入口直达_sf漫画官方正版网址  《下一站江湖2》心法融合技巧  在Spring Boot Thymeleaf中利用布尔属性实现容器的条件显示  C++二维数组动态分配方法_C++指针与数组内存布局  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  C++ virtual析构函数作用_C++基类虚析构函数防止内存泄漏  FullCalendar自定义按钮样式定制指南  喜茶GO更换登录账号方法  如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战  《微信》视频号原创声明开启方法  VBA Outlook邮件自动化:高效集成Excel数据与列标题的策略  餐馆菜篮选购指南  实现可重用自定义Python Range类  mysql中如何分析索引使用情况_mysql索引使用分析方法  《杖剑传说》食谱大全  解决异步Python机器人中同步操作的阻塞问题  秋风萧瑟洪波涌起中的萧瑟指的是什么  《深林》冬季章节图文攻略  word页码灰色不能用如何解决  知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法  mysql中如何配置字符集和排序规则_mysql字符集排序配置  《环球网校》设置报考省市方法  微信客户端怎么查看二维码_微信客户端个人二维码查看方法  163邮箱登录入口官网 163.com邮箱登录入口  京东物流快递破损了怎么办_京东快递破损理赔流程  ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程  Linux如何开发轻量级数据服务模块_Linux服务化设计  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  Python高效统计字典嵌套列表值在目标列表中的出现次数  优酷官网登录入口电脑版 优酷官网网址入口  TikTok网页版入口快速访问 TikTok官网账号登录方法  繁花漫画使用教程  汽水音乐车机版 汽水音乐车机版官方入口  《漫蛙manwa2》防走失网页版链接2025  风神瞳获取全攻略  创建快捷方式启动系统保护  多多买菜门店端app订单查看方法 

 2025-10-25

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.