您可以使用 LESS mixins 创建自定义断点吗?

Posted

技术标签:

【中文标题】您可以使用 LESS mixins 创建自定义断点吗?【英文标题】:Can you create custom breakpoints with LESS mixins? 【发布时间】:2014-02-15 17:19:36 【问题描述】:

大多数时候,我使用带有预设断点的 LESS 变量来进行媒体查询,如下所示:

@s-max : ~"screen and (max-width: 40em)";
@m-max : ~"screen and (max-width: 50em)";
@l-max : ~"screen and (max-width: 60em)";

USAGE

.some-class 
    color: red;

    @media @s-max 
       color: blue;
    

但有时,我希望能够在我的 .less 样式表中引用任意断点,而不必在我单独的 mixin 文件中设置新的预设值。

您可以在 SASS 中执行此操作。 mixin 看起来像这样:

@mixin bp-min($canvas) 

    @media only screen and (min-width:$canvas) @content;


USAGE

@include bp-min(750px) 

//responsive styling for min-width of 750px


在 LESS 中,我想象等效的 mixin 看起来像这样:

.bp-min(@min) 

    @media only screen and (min-width:@min)...

唯一的问题是,LESS 中缺少 @content 参数,它获取了开发人员输入的其余样式。我喜欢 SASS,但我不能在工作中使用它。

有人知道这个问题的基于 LESS 的解决方案吗?

【问题讨论】:

这是我从 LESS 迁移到 SCSS 的原因之一。我搬家的时候没有人支持。 搬家还有其他充分的理由。 我知道,我知道。萨斯是一个美丽的东西。我正在考虑(不是很认真)将我的一些个人项目从它转移到 LESS,这样我就可以不再被提醒我在工作中错过了什么。 【参考方案1】:

使用模式匹配

我相信这可以实现您想要的:

/* generic caller */
.bp-min(@min) 
    @media only screen and (min-width:@min) 
      .bp-min(@min, set);
    


/* define them */
.bp-min(750px, set) 
  test: (@min - 300px);

.bp-min(400px, set) 
  test: (@min - 100px);


/* call them */
.bp-min(750px);
.bp-min(400px);

输出 CSS

@media only screen and (min-width: 750px) 
  test: 450px;

@media only screen and (min-width: 400px) 
  test: 300px;

通过为各种尺寸定义 set 模式 mixin,然后在通用 .bp-min(@min) mixin 中使用该模式,我相信我们在 LESS 中的抽象与在 SCSS 中的抽象相同,但代码略多一些,因为我相信 SCSS 在一个 @include 语句中定义和调用,而这里我们需要两个。

【讨论】:

有趣的方法。它似乎需要与创建另一个预设媒体查询(使用@variable)大致相同的时间/工作量,但我会更多地考虑这个解决方案,看看我是否可以使用它。谢谢! 它的工作量可能不会少很多,但我想说的关键点是,它与您提供的作为您希望实现的示例的 SCSS 版本几乎没有什么不同。唯一的额外是调用启动进程滚动的调用。 我明白你的意思。只是我懒惰的头脑想要一些像 sass 一样快速、简单和无意识的东西……但看起来你可能已经想出了 LESS 中下一个最好的东西。谢谢。【参考方案2】:

(除了上一个答案)或类似的东西:

.bp-min(@canvas) 
    @media only screen and 
        (min-width: @canvas) .content


// usage:

&  .bp-min(900px); .content() 
    color: red;


&  .bp-min(600px); .content() 
    color: blue;


// more usage examples:

.class-green  
    .bp-min(450px); .content() 
        color: green;


&  .bp-min(300px); .content() 

    .class-yellow 
        color: yellow;
    

    .class-aqua 
        color: aqua;
    

如果您喜欢较短的内容,请将 .content 替换为 .-

【讨论】:

我实际上比第一种方法更喜欢这种方法,因为使用都发生在一个地方/选择器中。感谢分享。【参考方案3】:

现在类似于 SASS

从 1.7.0 (2014-02-27) 开始,您现在可以使用 @rules 代替时髦的 @content。

例如:

.breakpoint-small(@rules) 
  @media screen and (min-width: 40em)  @rules(); 


ul 
  width: 100%;
  .breakpoint-small(
    width: 50%;
  );

按预期输出:

ul 
  width: 100%;
  @media screen and (min-width: 40em) 
    width: 50%;
  

区别在于:

函数将@rules 作为参数 调用函数时的附加括号 '.'与“@include”相对的语法

这可以与一个额外的参数结合使用,以提供相当于 sass 的语法:

.breakpoint(@size, @rules) 
  @media screen and (min-width: @size)  @rules(); 


@large: 60em;
ul 
  .breakpoint(@large, 
    width: 50%;
  );

edit:老实说,我更喜欢在less中更简单的方法:

@break-large: ~"screen and (min-width: 60em)";
ul 
  @media @break-large 
    width: 50%;
  

来源:我在家里也使用 sass,而在工作中使用较少

【讨论】:

到目前为止,你的最后一张看起来很棒【参考方案4】:

就我而言,我需要我的变量来引用其他变量,因此其中一些解决方案不起作用。这是我的选择。

@bp-xs: ~"screen and (max-width:"@screen-xs-max~")";
@bp-sm: ~"screen and (max-width:"@screen-sm-max~")";
@bp-md: ~"screen and (max-width:"@screen-md-max~")";
@bp-lg: ~"screen and (max-width:"@screen-lg-max~")";

然后像这样使用它们

@media @bp-sm 
  ...

【讨论】:

以上是关于您可以使用 LESS mixins 创建自定义断点吗?的主要内容,如果未能解决你的问题,请参考以下文章

导入使用mixins的less文件时可以避免重复的css吗?

Less的Mixin

在 LESS CSS 中动态定义一个变量

Less学习笔记 -- Mixins(混合)一

在 Less 中循环使用 mixin 参数

Less的学习内容