引用一个类/混合而不完全导入LESS文件

49

我正在使用适用于WordPress的Roots主题:https://github.com/retlehs/roots/

该主题已经附带了预编译的bootstrap.css,并建议使用app.css进行任何自定义。由于我没有通过HTML或JavaScript添加类到按钮的选项,因此我想使用LESS源代码引用CSS类,例如,我想给提交按钮应用Bootstrap按钮样式:

input#submit{
.btn;
.btn-primary;
}

如果我使用 @import 'bootstrap.less';,它会将整个bootstrap css添加到app.css中。我该如何只使用bootstrap.less作为编译的参考呢?


如果我使用 @import 'bootstrap.less';,它会将整个bootstrap css添加到app.css中。我应该如何仅将bootstrap.less用作编译的参考?

所以,您想在app.css中仅引用您使用的类吗? - Tomas Ramirez Sarduy
我认为这是不可能的。请参考这个链接:https://dev59.com/tG855IYBdhLWcg3w-JMr#4060413 - user1761123
@user1761123:你直接回答的那个答案只适用于纯CSS。使用LESS,你可以将现有类的代码混合到另一个选择器中,就像FLX所做的那样。问题不在于这个功能,而是不想将所有bootstrap.less代码导入到使用“input#submit”代码的最终样式表中。 - ScottS
@Ayyash:这样做会导致所有的引导代码都出现在最终的样式表中。想象一下,FLX只想在最终的样式表中使用input#submit选择器(我相信他还有其他代码,但这说明了问题的要点)。他想使用bootstrap的代码来构建该选择器的属性,但他不希望所有其他的bootstrap代码成为他最终CSS样式表的一部分。 - ScottS
1
那么,为什么不删除其他不需要的导入并保留混合和函数呢?如果您打算再次使用相同的类,则需要它,将其复制到输出中是LESS背后的整个想法。 - Ayyash
显示剩余2条评论
4个回答

55

你所提出的核心问题是:

"我如何只将bootstrap.less作为编译的参考?"

从 LESS 版本 1.5 开始

对于 LESS 1.5,现在可以纯粹地将文件作为参考导入。像这样:

@import (reference) 'bootstrap.less';

该文件不会输出任何CSS代码,但所有内容都可以用作mixin。

#bootstrapRef() {
  @import: 'bootstrap.less':
}

input#submit{
  #bootstrapRef > .btn;
  #bootstrapRef > .btn-primary;
}
通过将命名空间作为mixin(在名称后添加括号),它仍将导入文件(我不知道有没有办法在不导入的情况下从外部访问它),但是它不应将实际的引导代码编译到您的最终CSS文件输出中。这种技术应该允许您通过命名空间调用#bootstrapRef > 来访问引导的类,mixin等,从而使您能够在自己定义的类中使用它们。我尚未完全测试此方法是否存在任何错误,从理论上讲它应该可以正常工作。

很遗憾,这些建议都没有解决问题。我为自己设置了一个简单的导入测试,但是没有一个导入场景能够起作用。请在这里查看结果:http://pastebin.com/VnLJcQ77 - FLX
@FLX:除了检查上面的@符号的注意事项之外,您的“SCENARIO 2:IMPORT FROM FILE WITH EXTERNAL BUNDLE”(第2方案2)应该已经可以工作了。我不确定的是,@import是否可以像我上面展示的那样嵌套在目标文件的命名空间块中。当然,缺失的@将会影响两者。 - ScottS
@FLX:如果您只使用选择器#bootStrapRef(注意:没有括号,因此是选择器而不是mixin),那么您的编译器是否正确通过@import嵌套bootstrap.less?换句话说,是尝试将代码导入到mixin而不仅仅是选择器失败了吗?我意识到将其命名为选择器而不是mixin并不能解决您的问题(它仍然会使您拥有包含所有bootstrap代码的css文件),但我正在尝试确定对于您来说,问题纯粹是尝试导入到mixin还是不导入。确保将严格导入设置为false。 - ScottS
这个不起作用,.btn是一个类而不是函数/混合,这意味着你会得到“NameError:#bootstrapRef > .btn未定义”。 - Declan Cook
@DeclanCook:感谢您的反馈。问题不在于.btn是一个类(我可以很好地在命名空间中引用类,因为类也可以与LESS一起“混合”),而是我无法确认导入是否正常运行。当命名空间是一个mixin时,您得到的错误告诉我它没有导入到命名空间中。您使用的编译器是什么? - ScottS
显示剩余16条评论

4
在LESS中实现这个功能有一点棘手,但可以通过以下方式实现:
#bootstrap() {
    .btn() {
        @import "bootstrap/variables.less";
        @import "bootstrap/mixins.less";
        @import "bootstrap/buttons.less";
    }
}

input#submit{
  #bootstrap > .btn;
}

由于 mixins.less 和 variables.less 中的一些额外类别被声明,导致了一些额外的类别。主要是 .clearfix 类别,然后所有的 .btn 类别都被添加到 input#submit 中。

在此处查看完整输出:

http://pastebin.com/ZBAZZ3kS


所以你没有问题在 #bootstrap() {} .btn(){} 的双重嵌套 mixin 中导入 variables.less 等等?这很有趣。我确信输出不是 OP 所期望的(他不想让 bootstrap 的类嵌套在 input#submit 下,而是具有特定类的特性),但是你能够在 mixin 中使用 @import 是对我来说一个重要的观点。你使用的编译器是什么? - ScottS
问题是OP不希望将_classes_添加到input#submit中,他希望将这些类的_properties_混合到选择器本身中。 - ScottS
你能再运行一个测试吗?尝试在命名空间内定义mixin并调用它:#bootstrap() { .nestedMixin(){ imports here } .nestedMixin(); } 然后 input#submit { #bootstrap > .btn }。如果您可以尝试使用bootstrap.less导入和如果不起作用,则使用您答案中的较小子集的.less文件。我很好奇在命名空间mixin内定义然后调用嵌套mixin是否可以规避问题。 - ScottS
“.btn未定义”,仍在“#bootstrap > .btn”行上,我认为目前不支持。 - Declan Cook
谢谢!这是一个有趣的问题。可惜我们无法完全解决它。 - Declan Cook
显示剩余4条评论

3

我不确定是否有工具可以仅导入外部文件中当前引用的css规则,但是Bootstrap有一个非常有组织的结构,因此请检查您正在寻找的样式是否在 中,这样您就不必导入整个bootstrap.less文件。

此外,请查看此相关问题,其中有一些定制Bootstrap的最佳实践。

编辑:如@PavloMykhalov所建议的那样,也许最好查看buttons.less

注意:这种工具将非常棒。有一天我会开发这样的工具。


在这种情况下,只导入 buttons.less 是有意义的。 - Pavlo

1

我不知道是什么让你相信LESS目前支持这一点,为了实现这一点,选项必须更加明确,它当前只是简单地导入、解析、保存块,并将块执行到输出文本中。

除非没有明确的阻止这个序列,否则它不会有任何不同的行为。

我刚刚在LESS下记录了一个功能请求,不确定以前是否已经请求过,搜索了一下也没有找到,希望我不会因为重复而被打击!

https://github.com/cloudhead/less.js/issues/1169

更新 问题最终被确认为重复问题,已经有一个相关的问题被提出,链接在这里:https://github.com/cloudhead/less.js/issues/622


我不确定我完全理解你关于“停止这个序列”的陈述。这个问题已经解决了在选择器中有一个导入的问题,并且在这个编译器上的当前测试显示命名空间可以是一个mixin(例如,#test() { .mixin {color: red;}} .class {#test > .mixin;}按预期工作)。但我还没有确认这两个是否可以一起使用,主要是因为我无法确认是否允许将导入到mixin中(尽管显然,我怀疑不允许)。 - ScottS
我认为我们第一次都误解了问题,它实际上并不是关于如何在mixin中编写规则的问题,而是关于如何根据您的意愿输出样式到输出CSS中,而不是根据您的CSS导入...所以,问题是:我可以仅导入以使用定义吗?而不必输出整个样式吗?在mixin内部进行导入不会排除样式被输出,对吧? - Ayyash
是的,我的解决方案(如果将“import”导入mixin中可以工作)会保持样式不输出,直到您通过命名空间调用mixin或其中的某些内容。因此,mixin在LESS中,但不会显示在CSS中。我的解决方案的问题是似乎实际上并没有起作用(“import”似乎没有在mixin中被承认),但是没有人在测试中确认任何事情。 - ScottS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接