【问题标题】:Is there any way to store data in a media query condition?有没有办法在媒体查询条件下存储数据?
【发布时间】:2023-11-19 09:48:01
【问题描述】:

我有一种情况需要排除媒体查询,除非它们与一个或多个特定元素匹配。

有没有办法在媒体查询中指定将被查询忽略但可检索的数据?

var rules = document.styleSheets[0]["cssRules"] || document.styleSheets[0]["rules"];
var numberOfRules = rules!=null ? rules.length : 0;

// loop through rules and hide media queries except selected
for (var i=0;i<numberOfRules;i++) {
  var rule = rules[i];

  if (rule.media!=null) {
      console.log(rule.conditionText);
  }
}
@media (min-width: 500px) {
  .hideOnMobile {
    display: none !important;
  }
}

我想做这样的事情:

@media (min-width: 500px) or (device: myElementName) {
  .hideOnMobile {
    display: none !important;
  }
}

我查看了属性页面,但似乎没有任何可用的东西。

https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries

【问题讨论】:

  • 我不认为我理解你所说的“匹配元素”是什么意思 - 你能再解释一下吗?
  • @AHaworth 假设我在一个页面上有 100 个媒体查询,其他人可能会添加更多。我想忽略所有这些,除了我做的那些。所以我想专门给它们贴上标签。例如,
  • 听起来像XY problem。我的意思是,当你需要做的是将数据与一个元素相关联,然后由媒体查询中的 CSS 读取时,你要求将数据存储在媒体查询中。
  • 媒体查询匹配,嗯,媒体,而不是元素。一旦媒体匹配,后续规则匹配元素……如果你想“禁用媒体查询”,不要包含定义它们的 CSS 代码。
  • @HereticMonkey 我可以通过向媒体查询提供更多信息来避免一些特定的问题。我已经关联了样式规则。当其他开发人员问他们自己的问题时,问题就出现了。这就是这个问题的由来。

标签: html css media-queries


【解决方案1】:

我不知道如何仅通过查看媒体查询“行”来做到这一点,而不会打扰某些验证器,因为,afaik,例如,您不能随意使用 css 变量。

但您可以在媒体查询的设置中使用 CSS 变量。这似乎有点hacky,但它有效。这个 sn-p 在媒体查询的设置中查找“oneofmine”字符串,如果它不存在(目前)只是告诉你摆脱这个规则。 [我不知道你会用什么方法来摆脱这个规则]。

var rules = document.styleSheets[0]["cssRules"] || document.styleSheets[0]["rules"];
var numberOfRules = rules != null ? rules.length : 0;

// loop through rules and hide media queries except selected
for (var i = 0; i < numberOfRules; i++) {
  var rule = rules[i];

  if ((rule.media != null) && (rule.cssText.match('oneofmine')) == null) {
    //hide this rule
    console.log('You should hide this rule: ' + rule.cssText);
  }
}
body {
  width: 100vw;
  height: 100vh;
  background: yellow;
}

@media (min-width: 1024px) {
  body {
    --oneofmine: 1;
    background: blue;
  }
}

@media (min-width: 1024px) {
  body {
    background: red !important;
  }
}

【讨论】:

  • 那个匹配是 RegExp 匹配而不是 Style Rule 匹配正确吗?
  • 我只是使用了JS匹配功能是的。我想不转换子字符串有点懒,但系统会为你做[链接]developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 所以这个问题的答案是“不,你不能在媒体查询选择器中指定数据,但这里有一个替代方案。”但这暂时适用于我的情况。
  • 好吧,据我所知这是对的 - 如果有人能告诉我们我们可以在媒体选择器中执行此操作会很好 - 但我很高兴你现在有一个解决方法。跨度>
【解决方案2】:

媒体查询 sintax 在此链接中进行了描述: https://developer.mozilla.org/en-US/docs/Web/CSS/@media#formal_syntax

“用一个竖线分隔两个或多个实体,|,意味着所有实体都是独占选项:必须存在这些选项中的一个。这通常用于分隔可能的关键字列表。”

您可以使用 window.matchMedia() 函数来确定文档是否与 JavaScript 中的媒体查询字符串匹配,也可以直接使用 .media.mediaText 设置规则

如果您需要一组用于媒体查询的开发人员标识符,那么媒体查询的 sintax 中是否指定了 ident 字段:developer.mozilla.org/en-US/docs/Web/CSS/ident

【讨论】: