如何跳过 Stylus 函数中的媒体查询?

How can I skip the media-query in a Stylus function?

我在 Stylus 中有这样一个功能:

fn($margin, $padding)
  width 100%
  margin $margin
  padding $padding
  @media (min-width: 500px)
    width 50%
    float left

在我想使用第二个媒体查询更改函数值之前,它运行良好:

div
  fn(3px, 5px)
  @media (min-width: 700px)
    fn(6px, 25px)

我明白了 css:

div {
  width: 100%;
  margin: 3px;
  padding: 5px;
}
@media (min-width: 500px) {
  div {
    width: 50%;
    float: left;
  }
}
@media (min-width: 700px) {
  div {
    width: 100%;
    margin: 6px;
    padding: 25px;
  }
}
@media (min-width: 700px) and (min-width: 500px) {
  div {
    width: 50%;
    float: left;
  }
}

显然这不是我想要的,因为函数的媒体查询覆盖了新媒体查询的一些属性。

当我从媒体查询调用函数时,是否有任何方法可以跳过函数的那部分?

编辑(展开解释):

例如,用户写入:grid (3, 10px) 并生成具有 10 像素装订线的三列网格。该网格是响应式的,小于 500px 只有一列。同时用户可能想制作自己的断点,例如:

div
   grid(3, 10px)
   @media (min-width: 700px)
     grid(4, 20px)

我想要的是让媒体查询默认保持500px而不需要用户定义它,所以我把它放在了函数中。

你可以这样使用它:

fn($width, $margin, $padding)
  width $width
  margin $margin
  padding $padding
  float: left

@media (min-width: 500px)
  div 
    fn(50%, 3px, 5px)

@media (min-width: 700px)
  div 
    fn(100%, 6px, 25px)

这将导致以下 css:

@media (min-width: 500px) {
  div {
    width: 50%;
    margin: 3px;
    padding: 5px;
    float: left;
  }
}
@media (min-width: 700px) {
  div {
    width: 100%;
    margin: 6px;
    padding: 25px;
    float: left;
  }
}

更清晰的方法是首先定义公共属性,然后像这样使用媒体查询:

fn($width, $margin, $padding)
  width $width
  margin $margin
  padding $padding

div 
  float: left

@media (min-width: 500px)
  div 
    fn(50%, 3px, 5px)

@media (min-width: 700px)
  div 
    fn(100%, 6px, 25px)

根据您的评论进行编辑:

在您提到的情况下,您可以使用这样的混合:

media_queries = {
  small  : "(min-width: 500px)",
  medium  : "(min-width: 700px)"
}

for_breakpoint(breakpoints)
  conditions = ()
  for breakpoint in breakpoints
    push(conditions, media_queries[breakpoint])
  conditions = join(", ", conditions)
  @media conditions
    {block}

fn($width, $margin, $padding)
  width $width
  margin $margin
  padding $padding

div
  float left
  +for_breakpoint(small)
    fn(50%, 3px, 5px)
  +for_breakpoint(medium)
    fn(100%, 6px, 25px)

结果将是:

div {
  float: left;
}
@media (min-width: 500px) {
  div {
    width: 50%;
    margin: 3px;
    padding: 5px;
  }
}
@media (min-width: 700px) {
  div {
    width: 100%;
    margin: 6px;
    padding: 25px;
  }
}

显然,您可以根据需要添加任意数量的断点,甚至不能在断点中包含更多语句,例如 small : "only screen and (min-width: 500px) and (max-width: 700px)",

查看实际效果:Stylus online editor

我找到了解决办法。它不适用于我用于媒体查询的块混合,但使用正常语法的媒体查询可以正常工作。只需要使用 current-media() 函数,如果为空则继续,如果不为空则跳过 de block。很简单:).

触控笔代码:

fn($margin, $padding)
  width 100%
  margin $margin
  padding $padding
  if current-media() is ''
    @media (min-width: 500px)
      width 50%
      float left

div
  fn(3px, 5px)
  @media (min-width: 700px)
    fn(6px, 25px)

CSS 输出:

div {
  width: 100%;
  margin: 3px;
  padding: 5px;
}
@media (min-width: 500px) {
  div {
    width: 50%;
    float: left;
  }
}
@media (min-width: 700px) {
  div {
    width: 100%;
    margin: 6px;
    padding: 25px;
  }
}