如何为@media和后代选择器声明相同的样式?

时间:2014-11-12 15:59:13

标签: less mixins less-mixins

我需要为媒体查询下的元素定义相同的样式,并为另一个类定义后代。

LESS 的完美解决方案可能以下[伪代码]:

.foo
{
  color:red;

  .example &,
  @media (min-width:800px)
  {
    color:blue;
  }
}

应该是可取的,可编译成:

.foo {
  color: red;
}
.example .foo {
  color: blue;
}
@media (min-width: 800px) {
  .foo {
    color: blue;
  }
}

这个语法是不正确的,但是,你有什么建议可以解决我的问题吗?

3 个答案:

答案 0 :(得分:1)

不,选择器和@media查询语言实体太不相同(尽管语法类似{}),因此您无法在示例中将逗号与逗号结合起来。

所以要把它弄干(假设共享风格当然有多个属性),你需要一个mixin(或者某种类型),例如:

.foo {
    color: red;
    .somename() {
        color: blue;
    }

    .example &                {.somename}
    @media (min-width: 800px) {.somename}
}

另请参阅Passing Rulesets to Mixins示例(如果您需要更通用的解决方案)。

答案 1 :(得分:1)

感谢 @ seven-phases-max 建议,我终于找到了使用 Detached Ruleset 的可能解决方案:

@screen-xs: 480px;
@screen-sm: 769px;
@screen-md: 992px;
@screen-lg: 1200px;

.MEDIAQUERY(@only-media, @min-max, @size, @RULES) 
{
  @screen-width:~"@{screen-@{size}}";

  @mediaQuery: ~"screen and (@{min-max}-width: @{screen-width})";

  @media @mediaQuery { @RULES(); }

  & when (@only-media = false) {
    .@{size} &       { @RULES(); }  
  }
}

.foo_media-and-class
{
  color:red;

  .MEDIAQUERY(@only-media:false, @min-max:max, @size:md,
    { 
        color:blue;
    }
  );

  .MEDIAQUERY(@only-media:false,  @min-max:min, @size:lg,
    { 
        color:yellow;
    }
  );
}

.foo_only-media
{
  color:red;

  .MEDIAQUERY(@only-media:true,  @min-max:max, @size:md,
    { 
        color:blue;
    }
  );

  .MEDIAQUERY(@only-media:true,  @min-max:min, @size:lg,
    { 
        color:yellow;
    }
  );
}

此解决方案超越并提供其他选项:

  • 可以为媒体查询设置屏幕宽度的自定义值,
  • 传递媒体查询中使用的属性值MIN/MAX(尝试传递“max”而不是“min”调用.MEDIAQUERY mixin)
  • 通过@only-media布尔值切换生成简单媒体查询或媒体查询+后代选择器。

答案 2 :(得分:0)

我认为你的逗号可能会导致错误。

.foo {
   color:red;
   .example & {
   color:blue;
     @media (min-width:800px) {
      color:blue;
     }
   }
}

这是输出以下内容的正确语法:

.foo {
  color: red;
}
.example .foo {
  color:blue;
}
 @media (min-width:800px) {
  .example .foo {
    color:blue;
   }
}