【问题标题】:LESS: Change on-the-fly passed parameter through Mixin callLESS:通过 Mixin 调用即时更改传递的参数
【发布时间】:2014-03-19 10:18:27
【问题描述】:

我有一个在不同样式表中调用的 LESS Mixin(即,每个断点对应一个由媒体查询控制的断点)。在每个样式表中,它使用不同的参数值调用,例如:

  • “mobile.less”:

    .mixin(1);

  • “tablet.less”:

    .mixin(2);

    .....

mixin 被定义(例如)为:

.mixin(@parameter) when (@parameter = 1)
{
    body
    {
      font-style:italic;
    } 

    .......

}

.mixin(@parameter) when (@parameter = 2)
{
    .......
}

我正在开发一个演示网站,因此我希望用户可以即时更改此值,更改使用表单字段作为参数传递的值。

我尝试了以下方法:

less.modifyVars({'@parameter' : <value from form field>});

但只有@parameter是一个“全局”变量,而不是通过调用传递的参数才有效……有没有改变传递参数的方法?

谢谢。

【问题讨论】:

    标签: less mixins


    【解决方案1】:

    原答案

    是的,只需将变量设置在 mixins 的范围之外,但仍然在保护表达式中使用它。比如:

    @parameter: 1;
    
    .mixin() when (@parameter = 1)   {
        body  {
          font-style:italic;
        }   
    }
    
    .mixin() when (@parameter = 2)   {
        body  {
          font-style:normal;
        } 
    }
    
    .mixin();
    

    这会生成1 代码。如果变量设置为2,则会生成2 代码等。

    关于“动态再处理称为 mixins”的讨论

    参考您的评论,据我所知,没有办法直接重新处理 mixin 调用的 局部变量 而不对 mixin 定义本身做一些处理以允许它。因此,在您的示例中,如果“mobile.less”有一个.mixin(1); 调用,您如何根据用户输入将其重新处理为.mixin(4)。如果您没有设置 调用a 变量 开头,则无法“修改”原始中的1 em> 打电话。但是,首先设置变量调用实际上只是我上面给出的答案的更长版本。考虑到这段代码与上面的代码基本相同,只是涉及到更多的编码:

    LESS Mixins 定义

    .mixin(@parameter) when (@parameter = 1)   {
        body  {
          font-style:italic;
        }   
    }
    
    .mixin(@parameter) when (@parameter = 2)   {
        body  {
          font-style:normal;
        } 
    }
    

    在文件中调用它

    //mobile.less
    @parameter: 1;
    .mixin(@parameter);
    
    //tablet.less
    @parameter: 2;
    .mixin(@parameter);
    

    请注意,我们仍在使用“全局”@parameter 变量,该变量只是作为同名的“本地”变量传递给 mixins。所以我们在这里获得的只是更多的代码(添加局部变量)来做同样的事情。

    现在假设您确实是在通过用户输入修改最终输出 css 行为 之后,那么您可以通过以后的调用“覆盖”。 假设所有相同的属性,选择器都是由各种 mixin 调用设置的,只是设置为不同的值。所以让我们假设 .mixin(1) 仍然在“mobile.less”中,你可以设置一个"reset.less" 文件,在用户输入时调用以被 css 级联覆盖。

    添加了 LESS Mixin 定义

    .mixin(@parameter) when (@parameter = 0)   {
        //purposefully empty, used as default for reset.less
    }
    

    当前“mobile.less”等中的通话保持原样。您可以在全局“variables.less”文件中设置全局值@parameter: 0;,然后“reset.less”是这样的:

    //reset.less
    .mixin(@parameter);
    

    默认情况下,“reset.less”不会输出任何内容(使用上面刚刚完成的 mixin 定义)。这个“reset.less”文件被last放在html处理中,以便它遵循任何“mobile.less”样式表等。然后,当用户更改@987654335 @,“reset.less”用新值更新,它确实输出css,凭借css级联,覆盖“mobile.less”等的值。

    【讨论】:

    • 嗨,斯科特,不幸的是,这不是解决方案。正如我所说,我不能在 mixin 调用之外使用变量,因为参数的值在多个调用中是不同的。请看我的示例:默认情况下,根据移动断点使用不同的值调用相同的 mixin。无论如何,我想用“less.modifyVars”方法或类似的方法“oververide”一个默认的传递值
    • @LucaDetomi: 你能不能将“mobile.less` 中的@parameter 设置为1 和“tablet.less` 设置为2 等,这将为该样式表设置它.然后,您将 mixins 放入导入的 mixin.less 文件中,并根据该表中设置的参数值对每个样式表进行正确的“调用”。然后,当动态更改值时,它将针对任何更新的工作表进行更改。我可能仍然缺少您想要实现的确切目标,但如果这些最终都是不同的样式表(如您所说),那么按照我的说明进行设置应该没有问题。
    • 嗨,斯科特,我理解你的观点,也许你是对的。实际上,当我动态更改 @parameter 的值时,我将为所有调用相对 mixin 的样式表更改它……无论如何,也许就足够了,但是……我试过了,“less.modifyVars”没有效果传递参数,但只能按照您的建议使用受保护的 mixins。有什么方法可以改变(所以在运行中重新处理)称为 mixins?
    • @LucaDetomi:我已经更新了我的答案。它可能有帮助,也可能没有帮助,具体取决于您想要实现的目标。
    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2014-08-27
    • 2014-12-22
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多