您知道如何在 CSS 预处理器中扩展内容吗?(如果不知道,可以 在这里了解。)Sass 可以做到。LESS 可以做到。Stylus 可以做到。虽然这是一个需要谨慎使用的功能(参见 这里 和 这里),但我发现它在某些情况下非常有用。
在芝加哥最近的一次 CodePen 聚会上,我听到 Sam Allan 做了一个关于 LESS 能够 执行 (reference)
导入 的简短演示,我以前从未见过。
它们看起来像这样
/* Normal import */
@import "colors-or-whatever.less";
/* Reference import */
@import (reference) "less-for-reference.less";
正常的导入会获取该文件的内容并将其转储到请求它的文件中。非常有用。文件连接是预处理器的至关重要的功能。(reference)
导入不会这样做。事实上,它根本不会将任何内容放入请求它的文件中。该文件中的代码现在可以使用了,可以通过调用其中的 mixin 或扩展其中的选择器来使用。
这是一个非常强大的概念。这意味着您可以导入整个库,但仅使用您需要的部分。
您是否曾经想使用 CSS 框架或库,但又觉得它太庞大了?
例如,一堆您认为永远不会用到的代码。包含整个库似乎有点过头,更不用说不利于性能了。您可以自己将其分解,但这会破坏升级路径。
使用 (reference)
导入,您可以导入任何您想要的内容,然后仅扩展您想要的部分。这可能有点奇怪,但您可以导入一堆库并挑选和选择部分,只获得您需要的输出。
示例
假设您非常喜欢 Pure CSS。Mattia Migliorini 有一个 LESS 版本的移植。它充满了好的东西,但它有 33 KB,也许您不需要所有这些。
在其中,有一个 .pure-button
类,它是 Pure CSS 对按钮的处理方式。如果您想使用它,您可以这样做
@import (reference) "https://s3-us-west-2.amazonaws.com/s.cdpn.io/18728/pure.less";
.my-button {
&:extend(.pure-button all);
}
而且,看,我可以将我的版本命名为任何我想要的名字。而且,如果和何时库更新,我只需更新它即可。假设名称没有改变,我就可以获得更改。
(您在上面看到的 all
关键字表示“也扩展其所有嵌套内容”,这完全是可选的,这是 LESS 扩展可以做的另一件很棒的事情。)
这是该演示
查看 Chris Coyier 在 CodePen 上的笔 GpjzOj(@chriscoyier)。
更多
再次感谢 Sam Allan 向我展示这一点。他还有更多关于这个主题的演示。其中一些他称之为“语义重新映射”,因为他使用了在他看来比原始库使用的更具语义意义的选择器。
查看 dehuszar 在 CodePen 上的笔 语义重新映射 - 框架蜈蚣示例(@dehuszar)。
太棒了!这个技巧将极大地帮助减少我的主 CSS 文件的整体大小。
哇哦,太棒了!
很棒的文章。我以前从未使用过带引用的导入,现在我看到了它的用处。
(抱歉我的英语)
看起来人们已经和 SASS 谈论这件事有一段时间了 https://github.com/sass/sass/issues/1094
看到 LESS 和 SASS 争夺开发者关注度很有趣。我以为 LESS 在功能方面落后于 SASS(而且可以说 SASS 项目更多),但在这种情况下,LESS 做到了 SASS 还没有做到的事情。
如果有一个具有合理默认值的 UI 框架,不需要进行语义重新映射就好了……
在早期探索这个简单技巧的所有可能性时,我也这么认为,但我实际上认为让您的框架使用视觉和实用程序类来描述您正在实现的内容具有很大的价值。它们往往不具有语义性。但有了这个技巧,使用 BEM、SuitCSS 或 ACSS 来定义您的组件并将其映射回更框架化的类就很容易了。
我在这里详细介绍了更多内容 这里。
糟糕。链接错误。请尝试 这个 链接。
太棒了。自从我们使用 LESS 作为我们的预处理器以来,CSS 膨胀已成为我们的一个难题。这绝对会有所帮助。
喜欢这个想法。希望在下一个 Sass 版本中看到类似的东西。写得很好,Chris,一如既往!
Stylus 不能做到这一点吗?至少它的插件可以。据我所知,Stylus 插件只是 .styl 文件,您可以导入并调用您需要的任何函数。
嗨,Chris。这很好 :)
无论如何,也可以将多个导入选项一起使用。
除了是引用之外,library.css 中的类现在可以作为 LESS mixin 重用。
嘿,Chris!感谢你的推荐,非常感谢。
我应该很快就会有一篇关于 Sass/Stylus/PostCSS 版本策略的后续文章。
这真的很棒。我对框架中的网格也有这种感觉。我想使用 bootstrap 并说,这里有一个我想要的行为(col-xs-6 col-md-4 col-lg-3)。我总是以这种确切的组合使用它。我想将其称为 .box 或其他任何名称。不要给我整个网格。只要给我这个行为。太棒了!
上面提到的后续文章仍在撰写中,但我推迟了它,以便我可以发布 PostCSS Reference,它将上面详细介绍的概念带到了 postcss 世界。