JavaScript骚操作媒体查询攻略

背景

一讲到媒体查询,大家首先想到的可能都是都是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.rhkb.cn/news/395356.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】多种控件实现“hello world“

使用编辑框的方式实现"hello wordl" 使用编辑框实现"hello world"的方式有俩种&#xff1a; 单行编辑框&#xff1a;LineEdit多行编辑框&#xff1a;TextEdit 图形化界面 纯代码方式 代码展示&#xff1a; #include "widget.h" #include &qu…

Python实战:基础语法

一、求解列表中的最大元素 import random#定义函数 def get_max(lst):x lst[0] #x存储的是元素的最大值#遍历操作for i in range(1,len(lst)):if lst[i] > x:x lst[i] #对最大值进行重新赋值return x#调用函数 lst [random.randint(1,100) for item in range(10)] print…

YARN 调度器的配置与使用

YARN 调度器的配置与使用 一、启动公平调度器1.1 配置 yarn-site.xml创建 fail-scheduler.xml 文件 二、同步配置文件三、重启启动 YARN 集群四、提交作业五、运行结果 一、启动公平调度器 公平调度器的使用由属性yarn.resourcemanager.scheduler.class的设置所决定。YARN默认…

mybatis-plus雪花算法

苞米豆mybatis-plus已实现雪花算法&#xff0c;若项目中使用雪花算法生成自增主键&#xff0c;可直接引用相关jar实现其工具类&#xff0c;若不想再单独引用jar也可将其Sequence类直接复制到自己项目中定义为工具类使用 官方文档&#xff1a;https://baomidou.com/ Git地址&am…

C++ | Leetcode C++题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; class Solution { public:int minPatches(vector<int>& nums, int n) {int patches 0;long long x 1;int length nums.size(), index 0;while (x < n) {if (index < length && nums[index] < x) {x nums[i…

基于python的百度迁徙迁入、迁出数据分析(七)

参考&#xff1a;【Python】基于Python的百度迁徙2——迁徙规模指数&#xff08;附代码&#xff09;-CSDN博客 记录于2024年8月&#xff0c;这篇是获取百度迁徙指数&#xff0c;之前我们都在讨论不同城市的迁徙比例关系&#xff0c;这篇我们来获取百度迁徙指数这个数据&#x…

职场要懂“3不急”,否则走不远

在职场中&#xff0c;我们经常会遇到各种各样的人和事&#xff0c;有的同事能够得到领导的重视和喜爱&#xff0c;有的则始终处于“不温不火”的状态&#xff0c;这其中到底是什么原因导致的呢&#xff1f; 其实&#xff0c;很大一部分原因是因为在工作中犯了一些“急于表现”…

Vue - progressive-image 渐进式图片加载(Vue2)

Vue - progressive-image 渐进式图片加载&#xff08;Vue2&#xff09; 在追求高分辨率图片的网页中&#xff0c;其图片加载速度影响着用户的体验&#xff0c;特别在低网速加载慢的情况下&#xff0c;简单的图片加载图标无法满足用户需求&#xff0c;progressive-image实现了渐…

硬盘文件数据销毁|文件销毁|硬盘销毁|数据销毁|中国成就的伟大与数据安全在新时代国家安全中的关键作用

在当今世界&#xff0c;中国的发展成就举世瞩目&#xff0c;但令人惊讶的是&#xff0c;大多数人可能并未充分意识到其伟大之处。与此同时&#xff0c;数据安全作为国家安全的重要组成部分&#xff0c;其重要性在新时代愈发凸显。 二、中国取得的伟大成就 中国在经济领域的崛起…

mp4视频声音小怎么增强放大?全网视频声音增强放大的方法汇总

在观看或编辑MP4视频时&#xff0c;声音作为传递情感、信息和氛围的关键元素&#xff0c;其质量往往直接决定了观众的沉浸感和内容的表达效果。然而&#xff0c;不少时候&#xff0c;我们可能会遇到视频声音过小的情况&#xff0c;这可能是由于录制时环境噪音干扰、设备收音不佳…

学懂C++ (二十一):高级教程——深入C++多线程开发详解

C多线程开发详解 多线程编程是现代应用程序开发中不可或缺的一部分。C11引入了对多线程的支持&#xff0c;使得程序员能够更方便地利用多核处理器&#xff0c;提高程序的性能和响应能力。本文将全面而深入地探讨C的多线程相关概念&#xff0c;包括线程的创建与管理、互斥量…

Android Fragment:详解,结合真实开发场景Navigation

目录 1&#xff09;Fragment是什么 2&#xff09;Fragment的应用场景 3&#xff09;为什么使用Fragment? 4&#xff09;Fragment如何使用 5&#xff09;Fragment的生命周期 6&#xff09;Android开发&#xff0c;建议是多个activity&#xff0c;还是activity结合fragment&…

免费【2024】springboot 二手图书交易系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

Llama 3.1用了1.6万个英伟达H100 GPU,耗费......

目录 Llama 3.1发布简介 Llama 3.1模型规模与训练 大模型企业发展面临的问题与困境 算力和能耗算力方面 数据和资金方面 技术和人才方面 Llama 3.1发布简介 当地时间 2024年 7月 23号&#xff0c;Meta 公司发布了迄今为止最强大的开源 AI 模型 Llama 3.1。该模型不仅规模…

Java二十三种设计模式-享元模式(12/23)

享元模式&#xff1a;高效管理大量对象的设计模式 引言 在软件开发中&#xff0c;有时需要处理大量相似或重复的对象&#xff0c;这可能导致内存使用效率低下和性能问题。享元模式提供了一种解决方案&#xff0c;通过共享对象的共同部分来减少内存占用。 基础知识&#xff0c…

谷粒商城实战笔记-145-性能压测-性能监控-jvisualvm使用-解决插件不能安装

文章目录 jvisualvm的作用安装查看gc相关信息的插件解决jvisualvm不能正常安装插件的问题1&#xff0c;查看java版本2&#xff0c;打开网址3&#xff0c;修改jvisualvm的设置 jvisualvm的作用 JVisualVM是一个集成在Java Development Kit (JDK) 中的多功能工具&#xff0c;它提…

LLMOps — 使用 BentoML 为 Llama-3 模型提供服务

使用 BentoML 和 Runpod 快速设置 LLM API 经常看到数据科学家对 LLM 的开发感兴趣&#xff0c;包括模型架构、训练技术或数据收集。然而&#xff0c;我注意到&#xff0c;很多时候&#xff0c;除了理论方面&#xff0c;许多人在以用户实际使用的方式提供这些模型时遇到了问题…

【C++】—— 类与对象(三)

【C】—— 类与对象&#xff08;三&#xff09; 4、拷贝构造函数4.1、初识拷贝构造4.1.1、为什么要传引用4.1.2、引用尽量加上 const 4.2、深入拷贝构造4.2.1、为什么要自己实现拷贝构造4.2.2、传值返回先调用拷贝构造的原因4.2.3、躺赢的 MyQueue4.2.4、传值返回与引用返回 4.…

世界500强排行榜公布 中国互联网企业表现突出

在2024年8月5日&#xff0c;《财富》杂志公布了最新的全球500强企业排行榜。 这些公司的总营收接近41万亿美元&#xff0c;占到了全球GDP的三分之一&#xff0c;其净利润同比增长2.3%&#xff0c;总计约2.97万亿美元。 中国有133家公司入选这一榜单&#xff0c;以11万亿美元的…

SpringMVC学习笔记---带你快速入门和复习

一、初识SpringMVC 1.1、什么是SpringMVC 1.1.1、什么是MVC MVC是一种软件架构模式&#xff08;是一种软件架构设计思想&#xff0c;不止Java开发中用到&#xff0c;其它语言也需要用到&#xff09;&#xff0c;它将应用分为三块&#xff1a; M&#xff1a;Model&#xff0…