首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript媒体查询与CSS媒体查询

JavaScript媒体查询与CSS媒体查询
EN

Stack Overflow用户
提问于 2021-12-26 16:25:59
回答 1查看 657关注 0票数 1

我注意到,JavaScript媒体查询似乎在CSS等效查询之后生效。

我创建了两个示例,演示了我所讲的内容:

第一个例子

HTML:

代码语言:javascript
复制
<div class="foo">
  bar
</div>

CSS:

代码语言:javascript
复制
.foo {
  background-color: orange;
}


@media(max-width: 300px) {
  .foo {
    background-color: blue;
    transform: translateY(100px);
    transition: all 300ms ease-out;
  }
}

jsbin链接是:这里

在这里,当屏幕宽度从更大的东西变成300 or或更少时,就会发生转换。

但是,当创建响应性设计时,这样的转换可能会很烦人。我在试着摆脱他们。下面的Javascript和CSS解决了这个问题,但我不确定它是否可靠。

第二例

HTML

代码语言:javascript
复制
<div class="foo">
  bar
</div>
<button>toggle translateY to 200px</button>

CSS

代码语言:javascript
复制
.transition {
  transition: all 300ms ease-out;
}

.foo {
  background-color: orange;
}


@media(max-width: 300px) {
  .foo {
    background-color: blue;
    transform: translateY(100px);
  }
}

.translateY {
  transform: translateY(200px);
}

JavaScript:

代码语言:javascript
复制
const w = window.matchMedia("(max-width: 300px)");
const div = document.querySelector(".foo");
const button = document.querySelector('button');

function fun(e) {
  if (e.matches) {
     div.classList.add('transition');
  } else {
     div.classList.remove('transition');
  }
}

// for initial screen width change detection
fun(w);

w.addEventListener('change', fun);

button.onclick = function() {
  div.classList.toggle('translateY');
}

jsbin链接是这里

在这里,当屏幕宽度从更大的东西变成300 or或更少时,似乎会发生以下事情:

  1. CSS transform: translateY(100px)是在闪存中呈现的。
  2. transition类由JavaScript添加到div中。

通过单击该按钮,可以确保transition类正常工作。

此示例不会导致任何不必要的转换,因为屏幕大小从更大的东西变成300 or或更少。

因此,似乎在JavaScript等效的媒体查询之前呈现任何CSS媒体查询。我觉得这是件好事。但我不确定,这是否是标准的得到支持的行为?基于这种行为构建逻辑安全吗?

EN

回答 1

Stack Overflow用户

发布于 2021-12-26 16:42:36

这是CSS特异性的一部分

添加到元素(例如,)中的内联样式总是覆盖外部样式表中的任何样式,因此可以认为具有最高的特性。

您发布的javascript代码将添加内联样式(通过元素的style属性),因此具有最高的特异性。(它与js媒体查询无关,只与如何将JS中的样式应用于元素有关)

在所讨论的注释/更新后更新

同样,它取决于何时加载CSS和JS。如果您首先包含CSS文件,因为它是一个呈现阻塞资源,那么它将首先应用。

我不确定,为什么不通过CSS媒体查询应用所有的规则呢?

代码语言:javascript
复制
const div = document.querySelector(".foo");
const button = document.querySelector('button');

button.onclick = function() {
  div.classList.toggle('translateY');
}
代码语言:javascript
复制
.foo {
  background-color: orange;
}

@media(max-width: 300px) {
  .foo {
    background-color: blue;
    transform: translateY(100px);
    transition: all 300ms ease-out;
  }
}

.translateY {
  transform: translateY(200px);
}
代码语言:javascript
复制
<div class="foo">
  bar
</div>
<button>toggle translateY to 200px</button>

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70488028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档