JavaScript骚操作媒体查询攻略

news2024/9/23 15:29:57

背景

一讲到媒体查询,大家首先想到的可能都是都是CSS中@media,这也没错,这确实是最常见的媒体查询方式,但是我们今天要讲的不是它,而是大家很少接触到的window.matchMedia()window.resize

最近在做项目的时候拿到一个需求,是要在窗口变化时去根据不同的窗口大小去发送不同的请求,拿到需求的时候我脑袋一蒙,媒体查询不都是在css里面吗,但是网络请求在JavaScript里面啊,难道要在css里去发送网络请求?这当然是不可能的啦。当即我就去MDN查询API了,让我查到了window.matchMedia()window.innerWidthwindow.innerHeight

window.matchMedia()用法

Window 的 matchMedia() 方法可以帮助我们在JavaScript中创建媒体查询对象,它可以帮助我们检查当前视口是否匹配指定的媒体查询条件。

方法接受一个参数,即表示媒体查询的字符串,这个字符串遵循CSS中媒体查询的语法规则。

方法返回一个新的 MediaQueryList对象,表示指定的媒体查询 (en-US)字符串解析后的结果。返回的 MediaQueryList 可被用于判定 Document 是否匹配媒体查询,或者监控一个 document 来判定它匹配了或者停止匹配了此媒体查询。

语法

const mediaQueryList = window.matchMedia(mediaQueryString);

参数

  • mediaQueryString:表示媒体查询条件的字符串。它包含一个或多个媒体特性和条件,用来定义在何种视口条件下匹配媒体查询。这个字符串类似于在CSS中使用的媒体查询。

返回值

window.matchMedia() 返回一个对象,通常是一个 MediaQueryList 对象,该对象包含了媒体查询条件的信息。MediaQueryList 对象具有以下属性和方法:

  1. matches 属性:一个布尔值,表示当前视口是否匹配指定的媒体查询条件。如果匹配,它将返回 true,否则返回 false。这是一个只读属性,用于立即检查匹配状态。

  2. media 属性:包含原始的媒体查询字符串,即传递给 window.matchMedia() 的参数。它用于表示媒体查询的条件。

  3. addListener(callback) 方法:用于添加一个事件监听器,当媒体查询条件的匹配状态发生变化时,将触发指定的回调函数。

  4. removeListener(callback) 方法:用于从 MediaQueryList 对象上移除特定的事件监听器。

MediaQueryList 对象的主要用途是检查当前视口的媒体查询条件是否匹配,并在条件变化时监听事件以执行相应的操作。

下面我们来用代码演示一下window.matchMedia()如何使用

matches 属性

// 定义媒体查询条件
const mediaQueryString = "(max-width: 600px)";

// 创建媒体查询对象
const mediaQueryList = window.matchMedia(mediaQueryString);

// 检查当前视口是否匹配媒体查询条件
if (mediaQueryList.matches) {
    console.log("视口宽度小于等于600px");
} else {
    console.log("视口宽度大于600px");
}

addListener(callback) 方法removeListener(callback) 方法

// 添加事件监听器来监听媒体查询条件的变化
function handleMediaQueryChange(event) {
    if (event.matches) {
        console.log("视口宽度小于等于600px");
    } else {
        console.log("视口宽度大于600px");
    }
}

// 添加事件监听器
mediaQueryList.addListener(handleMediaQueryChange);

// 移除事件监听器
setTimeout(() => {
    mediaQueryList.removeListener(handleMediaQueryChange);
    console.log("事件监听器已移除");
}, 5000);

动画.gif

点击右上角的查看详情,即可查看源代码

jcode

window.innerWidthwindow.innerHeight

window.innerWidthwindow.innerHeight是 JavaScript 中用于获取当前视口的宽度和高度的属性。

  1. window.innerWidth

    • 用法:window.innerWidth 是一个只读属性,用于获取当前视口的宽度,单位为像素。
    • 返回值:window.innerWidth 返回一个整数,表示当前视口的宽度。

    代码示例:

function widthChangeCallback() {
  if(window.innerWidth > 599) {
    show.innerHTML = `<div class="large">我比599px大</div>`;
  } else {
    show.innerHTML = `<div class="small">我比599px小</div>`;
  }
}
window.addEventListener('resize', widthChangeCallback);
widthChangeCallback();

  1. window.innerHeight

    • 用法:window.innerHeight 是一个只读属性,用于获取当前视口的高度,单位为像素。
    • 返回值:window.innerHeight 返回一个整数,表示当前视口的高度。

    代码示例:

    // 获取当前视口高度
    const viewportHeight = window.innerHeight;
    
    if (viewportHeight <= 400) {
        console.log("视口高度小于等于400px");
    } else {
        console.log("视口高度大于400px");
    }
    

动画.gif

点击右上角的查看详情,即可查看源代码

jcode

性能对比

既然两种方案都能实现,所以我们很自然地想知道它们中的哪一个能提供更好的性能,以及我们应该在什么时候使用这些解决方案中的每一个。

每当窗口大小发生变化时,widthChangeCallback()函数都会被调用,通过大小变化事件侦听器触发。这种方式适用于每个实例都需要响应窗口大小变化的情况,例如画布的更新。

但是,在某些特定情况下,只有当宽度或高度达到特定的阈值时,才需要执行某些操作。举个例子,就像我们前面提到的文本更新。在这种情况下,使用matchMedia()将能够提供更佳的性能,因为它只在媒体查询条件实际更改时触发回调函数,避免了不必要的计算。

动画.gif

点击右上角的查看详情,即可查看源代码

jcode

从上面我们可以看出两者的回调执行次数差异巨大,所以我们在开发过程中应当根据业务的实际需求去选择使用哪一个API。

总结

我们了解到,借助该matchMedia()方法,我们在 CSS 中经常使用的媒体查询现在也可以在 JavaScript 中使用。并且使用matchMedia()可以为我们提供更好的性能,而不是在window 上添加事件侦听器resize。与依赖于window做一些事情的旧方法相比,我们可以使用媒体查询执行更多检查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL笔记-基础篇(一):查询

博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 MySQL是一种广泛使用的关系型数据库管理系统&#xff0c;它基于结构化查询语言&#xff08;SQL&#xff09;来管理和操作数据。下面将依次探讨MySQL查询的各个方面&#xff0c;确保理解扎实&#xff0c;能够在实…

“阳光高考爬虫项目揭秘:增量爬虫与断点续抓的Python实战“

阳光高考项目 项目要求 爬取各大高校基本信息和招生简章&#xff08;招生简章要求存储为pdf格式并且入库&#xff09; 数据库表设计 idtask_urlstatus&#xff1a;0(未抓取)&#xff0c;1(抓取中)&#xff0c;2(抓取完毕)&#xff0c;3(错误)&#xff0c;4(更新中)&#xff…

C语言小练习(叁)

个人练习&#xff1a; 编程题&#xff1a; 1.编写一个函数&#xff0c;通过输入球的半径&#xff0c;返回球的体积&#xff1b; #include <stdio.h> #define pi 3.14 //计算球体积的函数 double v_ball(double r) {return 4.0 / 3.0 * pi * r * r * r; }int main() {d…

InfluxDB Studio 下载,时序数据库Windows图形界面操作

下载地址&#xff1a; https://github.com/CymaticLabs/InfluxDBStudio/releases解压缩后&#xff0c;双击 InfluxDBStudio.exe 运行。 参考 windows下 influxDB 操作工具 InfluxDBStudio 吐槽 现在 CSDN 太恶心了&#xff0c;动不动就让订阅或者积分下载资源。诚然&#…

【Python学习-UI界面】pyqt5页面布局

1、布局分类 序号类别描述1QBoxLayout可将小部件垂直或水平排列。它的派生类有QVBoxLayout&#xff08;用于垂直排列小部件&#xff09;和QHBoxLayout&#xff08;用于水平排列小部件&#xff09;。2QGridLayout对象呈现为行和列排列的单元格网格。该类包含addWidget()方法&am…

艾迈斯欧司朗推出突破性8通道915nm SMT脉冲激光器,开创激光雷达应用新时代

8通道915nm SMT脉冲激光器可增强自动驾驶汽车的远距离激光雷达系统&#xff1b;经过AEC-Q102认证的8通道QFN封装&#xff0c;具有高性能和高效率&#xff0c;采用艾迈斯欧司朗专有的波长稳定技术&#xff1b;基于20多年的脉冲激光器技术经验。 中国 上海&#xff0c;2024年8月8…

JAVA开发学习-day21

JAVA开发学习-day21 1. 删除表单数据 根据ElementUI的官方组件指南&#xff0c;为表单每列的数据添加删除按钮 <el-table :data"tableData" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…

那些你应该掌握的linux命令

一、路径授权 要给 a 用户 b 路径的所有操作权限,可以使用以下命令&#xff1a; sudo chown -R a:a /b sudo chmod -R 770 /b1.sudo chown -R a:a /b chown 命令用于更改文件或目录的所有者和所属组。-R 选项表示递归地应用于目录及其内部的所有文件和子目录。a:a 表示将所有…

24/8/8算法笔记 条件筛选决策树根节点

筛选决策树的根节点是建立决策树过程中的一个重要步骤&#xff0c;主要原因包括&#xff1a; 减少计算量&#xff1a;选择合适的根节点可以减少树的深度&#xff0c;从而减少模型训练和预测时的计算量。 提高模型性能&#xff1a;选择最佳分裂点可以最大化模型的性能&#xff…

更换低版本jdk8后的idea页面怎么换回来

一、问题阐述 一开始我的idea是下面的界面&#xff1a; 这个页面美观&#xff0c;简洁。后来因为工作需要&#xff0c;从jdk17切换到jdk8的时候&#xff0c;页面变了 这个没有前面的好看&#xff0c;怎么回事&#xff1f; 二、解决方案 1、file——setting 2、搜索ui——New UI…

全新博客X主题/简约WordPress主题模板/主题巴巴/免授权版源码+自适应设计

源码简介&#xff1a; 博客X这款超酷的Wordpress主题&#xff0c;是主题巴巴团队打造的设计杰作。想象一下&#xff0c;你的博客首页能展示那些炫酷的幻灯片置顶文章、还有各种精心策划的专题列表&#xff0c;这些内容模块的设计简直吸睛了&#xff0c;能让来访的用户眼前一亮…

JAVA集中学习第四周学习记录(三)

系列文章目录 第一章 JAVA集中学习第一周学习记录(一) 第二章 JAVA集中学习第一周项目实践 第三章 JAVA集中学习第一周学习记录(二) 第四章 JAVA集中学习第一周课后习题 第五章 JAVA集中学习第二周学习记录(一) 第六章 JAVA集中学习第二周项目实践 第七章 JAVA集中学习第二周学…

SSL VPN综合实验

一、实验目的及拓扑 实验目的&#xff1a;构建企业内网和企业分支站点&#xff0c;其中企业内网通过防火墙实现双机热备并且与企业分支固定站点实现站点到站点IPsec VPN互联&#xff0c;与企业分支移动站点实现SSL VPN互联&#xff0c;企业内网各主机可以实现对分支站点内网的…

可观测性(observability)

一、定义 wiki百科的定义 In software engineering, more specifically in distributed computing, observability is the ability to collect data about programs’ execution, modules’ internal states, and the communication among components.[1][2] To improve obser…

8月最新ChatGPT系统源码SparkAi系统,支持AI换脸+智能体GPTs应用+AI绘画+AI视频+文档分析

一、文章序言 人工智能技术正在快速发展&#xff0c;AI语言模型、AI绘画和AI视频已经在多个领域得到了广泛应用。这些技术不仅在科技创新方面表现出色&#xff0c;还在艺术创作、内容生产和商业应用中展示出巨大的潜力。 SparkAi创作系统是一款基于ChatGPT和Midjourney开发的…

矩阵乘法的结合律的证明

矩阵的乘法在矩阵运算中相较于加法更加复杂&#xff0c;对矩阵乘法的运算律的证明也更复杂&#xff0c;但其中对结合律的证明是最难的&#xff0c;因为它涉及到3个矩阵的相乘。本证明不同于其他一些比较粗浅的用方阵去证明或者用三个含很少元素的简单矩阵做一个例证&#xff0c…

App渗透测试(工具使用)

Python工具 在文件中打开终端&#xff0c;执行如下命令进行装库。 python3 -m pip install -r txt文件 执行如下命令扫描 python3 .py -i apk文件

Docker最佳实践(七):安装MinIO文件服务器

大家好&#xff0c;欢迎各位工友。 Minio是一个开源免费的高性能对象存储服务器&#xff0c;专为大规模数据集和高并发访问而设计。它具有出色的读写性能和低延迟&#xff0c;可以满足对数据速度和效率要求较高的应用场景。本篇呢我们就来演示一下如何在Docker中搭建Minio容器&…

MySQL数据库基础:约束

&#x1f48e;我的主页&#xff1a;MySQL &#x1f48e;1. 约束的概述 约束是作用于表中字段的规则&#xff0c;用于限制存储在表中的数据 目的&#xff1a;保证数据库中数据的正确性&#xff0c;有效性和完整性 &#x1f48e;2. 约束的分类 &#x1f48e;2.1 非空约束 非空…

linux之top

要在 Linux 系统上查看 CPU 使用情况&#xff0c;可以使用top命令&#xff1a; 根据您提供的 top 命令的输出&#xff0c;我们可以看到系统的一些基本信息和当前运行的进程。下面是输出的主要部分的解释&#xff1a; 仅供参考&#xff1a; 系统概述: 时间&#xff1a;当前时间…