通过 javascript 检测媒体查询并应用适当的数据状态

Detecting media queries via javascript and apply appropriate data-state

我需要javascript #help.

我有一个对象 (#objID) 具有三种不同的数据状态 (A B & C) (https://www.dropbox.com/s/zn19k87eu2hp8ow/data-states.jpg?dl=0)...每个状态都包含一些 css 来描述它的外观..

我想使用 javascript 检测媒体查询更改并将适当的数据状态添加到 #objID。

(即。 如果屏幕小于 320 像素,则将 [data-state="A"] 添加到 #objID

或者如果屏幕在 320px 和 728px 之间,则切换到 [data-state="B"]

或者如果屏幕大于 1024px 则切换到 [data-state="C"]

) 类似这个概念..http://zerosixthree.se/detecting-media-queries-with-javascript/

但我不确定如何实施。 请帮忙。谢谢

您需要 onresize 活动

window.onresize = function(event) {
    //...
};

屏幕有两个维度,widthheight,而你描述的是一维比较,这并没有给我们足够的信息来说明你想要实现什么。无论如何,您可以在 onresize 事件中使用 window.innerWidthwindow.innerHeight

为了简化你可以这样做:

window.matchMedia("(max-width: 320px)").addListener(function() {
    // Change the value of `data-state`
});

window.matchMedia("(min-width: 321px) and (max-width: 728px)").addListener(function() {
    // Change the value of `data-state`
});

但是您需要确保浏览器支持 window.matchMedia 并处理维护状态等,以了解您何时从一个断点越过另一个断点并确定哪个处于活动状态,因为两者都会在您退出时触发并输入断点。

至于在 window.onresize 上执行此操作,这不是一种非常有效的方法,如果您这样做,则必须 throttle/debounce。使用 matchMedia 只会在断点更改时触发,而不是在不断调整大小时触发。它还可以让您的 CSS 媒体断点与您的 JS 保持同步。

This is a Polyfill for browsers which do not support it as mentioned and this guide 也可能对您有所帮助。

然而:

I have an object(#objID) with three different data state (A B & C). Each state contain some css to describe the look of it..

听起来好像您想更改应用于基于 data-state 属性的元素的 CSS 样式,您要根据断点更改它?

如果我错了请纠正我,但为什么你不能只使用媒体查询来更改应用于它的 CSS?

@media only screen and (max-width: 320px) {
    /* State A */
   .css-selector {
        color: red;
   }
}

@media only screen and (min-width: 321px) and (max-width: 728px) {
    /* State B */
   .css-selector {
        color: green;
   }
}

@media only screen and (min-width: 728px) {
   /* State C */
   .css-selector {
        color: blue;
   }
}