用LESS覆盖Bootstrap变量


70

我整天都在进行调查,因为我认为花一些时间来学习定制Bootstrap的最佳实践是值得的。

我可以看到有一个友好的页面可用于从http://twitter.github.io/bootstrap/customize.html中有选择地自定义元素,但是我想拥有比这更多的控制权而不接触原始的引导程序源文件。

首先,我基本上想测试一下将网格从12列更改为16列的方法,为此,我创建了自己的变量less文件,并添加了@gridColumns:16;。仅将其导入到此文件中,并在bootstrap.less内部导入此自定义项,如下所示。

// Core variables and mixins
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";
**@import "../custom-variables.less"; //Override variables**

然后,使用WinLess,我编译了bootstrap.less文件,以使用覆盖的变量import调用获取新的bootstrap.css,并将CSS与html文件链接在一起,但是网格不会更改为16列。

谁能指出我做错了吗?


Answers:


43

我在一个类似的项目中工作,我们在“第三方”位置进行了引导,然后仅覆盖mixins.lessvariables.less。我们为此使用的模式添加了三个文件,根本不涉及引导程序(允许您轻松放入替换项):

/style
|- bootstrap-master/
|    |- less/
|    |- js/
|   ...
|- shared/
    |- shared.less
    |- variables.less
    |- mixins.less

mixins文件

/*
 *    /style/shared/mixins.less
 */

@import "../bootstrap-master/less/mixins.less";
// override any mixins (or add any of your third party mixins here)

变量文件,这是您覆盖网格的地方

/*
 *    /style/shared/variables.less
 */

@import "../bootstrap-master/less/variables.less";

@gridColumns: 16; // let's pretend this is your site-specific override

实际导入的文件(或馈送给较少编译器的文件):

/*
 *    /style/shared/shared.less
 */

@import "variables.less";
@import "mixins.less";

@import "../bootstrap-master/less/grid.less";
//and any other bootstrap less files we need here

在我的设置中,如果我这样做,我会得到一个带有一些奇怪的.span15值的css文件(因为我没有更新@gridColumnWidth@gridGutterWidth但是.row-fluid值实际上按照您期望它们的方式工作,因为它们重新计算(直接除法)。

我喜欢这个设置,因为我可以cd进入bootstrap-master并git pull获取新的更新,而不必合并任何特定的kludges(这也使我可以很好地处理实际覆盖的内容)

另一件事是,很明显shared.less仅使用grid.less(而不是所有的引导程序)。这是有意为之的,因为在大多数情况下,您不需要所有的引导程序,只需启动其中的一部分即可。大多数引导程序较少的文件至少很不错,因为它们唯一的硬依赖性是shared.lessmixins.less

如果仍然无法解决问题,则可能是WinLess感到困惑


非常感谢您的见解。我已经尝试过您的解决方案,并且网格更改为16,但是布局不再通过屏幕大小响应。您是否仅编译shared.less并将已编译的CSS链接到主引导CSS以下?谢谢
成城先生

@SeongLee没问题!我相信,为了使新的网格正常工作,需要更新的变量要少得多。仅shared.less被编译,页面直接链接到该文件(或在生产中,其编译输出)。尽管您将必须包括缺少的任何模块,但您永远不必在其他任何地方包括引导程序。如果您愿意,我可以更新答案以使其更清楚。
马科斯(Marcos)

谢谢@Marcos您如何表示我永远不必包括引导程序?如果可以的话,请像您说的那样更新答案以进行澄清。非常感谢!
成李

153

导入原始文件覆盖变量bootstrap.less非常适合我:

@import "less/bootstrap.less";

@body-bg:     red;
@text-color:  green;
@link-color:  blue;

编译上面的LESS源会输出正确定制的Bootstrap CSS代码。

相关信息:http : //lesscss.org/features/#variables-feature-lazy-loading


22
之所以可行,是因为LESS变量是在最后确定的基础上应用于当前范围。查看文档中的示例:lesscss.org/#
variables

3
我从未想过这会起作用。复制来自bootstrap.less的所有导入并交换修改后的variable.less版本的想法是可怕的。但是,正如该答案中所建议的那样,我之后可以设置变量替代(就我而言@icon-font-path)。谢谢!
tremby 2014年

2
用这种方式做事可以防止您对变量所做的更改应用到bootstrap.css,不是吗?更改后,它显然会以少得多的方式覆盖变量,但是更改后的任何内容都不会影响引导程序本身(后编译)...
derekmx271 2015年

1
@ derekmx271否,更改将影响所有内容-请参阅有关默认变量
亚当(Adam)

1
+1我也曾经复制/重命名variables.less,但这好多了。这绝对应该是公认的答案。
Daniel Liuzzi 2015年

1

可以帮助某人的另一个示例:

@import 'bootstrap/bootstrap/variables';

// Prgress bar
@progress-bar-bg: #f5f5f5;
@progress-bar-default-color: @gray-base;

@import 'bootstrap/bootstrap';

-3

一种简单的方法就是使用相同的名称覆盖样式文档中的样式,并将其标记为!important。


覆盖样式使用!important通常是一个可怕的想法,但是覆盖主题样式使用!important甚至更糟。
CervEd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.