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做一些事情的旧方法相比,我们可以使用媒体查询执行更多检查。

  • 11
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaScript 可以通过使用媒体查询来更改和应用特定的DOM更改或任意的JavaScript代码。这种方法可以通过在window对象上公开一个简单而轻量级的JavaScript API来实现,称为"responseto"。 除了这种常见的方法之外,还有另一种使用媒体查询的方式是在JavaScript中直接使用媒体查询。这种方法可以通过在JavaScript代码中编写媒体查询来实现。 尽管JavaScript媒体查询不像CSS媒体查询那样流行,但它们提供了灵活性和许多优势,使其成为某些用例的更好选择。使用JavaScript媒体查询可以根据不同的条件来更改代码的执行逻辑,从而实现更高度的自定义和控制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [respondto:一个简单的 JavaScript API,用于根据定义的媒体查询条件应用(和取消应用)DOM 更改](https://download.csdn.net/download/weixin_42130889/19418313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [如何在 JavaScript 中使用媒体查询](https://blog.csdn.net/weixin_42232156/article/details/129937656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [JavaScript 媒体查询](https://blog.csdn.net/weixin_46267040/article/details/125369790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zayyo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值