【问题标题】:How can I customize Twitter Bootstrap's CSS using LESSCSS variables?如何使用 LESSCSS 变量自定义 Twitter Bootstrap 的 CSS?
【发布时间】:2012-11-28 09:27:52
【问题描述】:

我正在尝试在不更改引导代码的本地副本的情况下自定义 Twitter Bootstrap 的 CSS。* 因此,我将 Twitter Bootstrap 项目克隆到一个文件夹中,并将我的应用程序代码放在它自己的文件夹中:

/html
    /bootstrap
       ...etc...
       /js
       /less
    /MyApp
       ...etc...
       /common_files
          /less
             style.less

在我的“style.less”文件中,我定义了一些 LESS 变量,然后包含引导文件:

/* custom settings that deviate from Bootstrap's default values */
@sansFontFamily: Trebuchet MS, Tahoma, sans-serif, Arial;
@baseFontSize: 11px;
@baseLineHeight: 18px;

/* import bootstrap components from bootstrap-dedicated folder */
@import "../../../bootstrap/less/bootstrap.less";
@import "../../../bootstrap/less/responsive.less";

由于LESSCSS variables are really constants,我很惊讶我的@sansFontFamily 在我将LESS 文件编译成CSS 时没有被选中:lessc style.less > MyApp.css --yui-compress

那么……我错过了什么?为什么我的变量会被 Bootstrap 的 LESS 文件中定义的变量覆盖?

*--我已经检查了“Twitter Bootstrap Customization Best Practices”,但认为利用常量会是更好的方法(如果我可以让它工作的话)。

【问题讨论】:

  • 他们真的不应该!我也是这样做的,它可以工作......它们都设置为!默认,所以它们可以完全以这种方式被覆盖。
  • “!默认”?我找不到那个参考...
  • 尝试先导入你的引导程序,然后声明变量,这样引导程序就会被你的覆盖,而不是相反
  • @PeterVR——成功了。为了额外的功劳,为什么在导入包含后设置变量会将变量集强加到导入的文件中?这是一个 lessc 编译器的事情吗?如果是,那么操作的顺序记录在哪里?
  • 您好,对不起,我的回答来晚了,请检查我的回答

标签: twitter-bootstrap less


【解决方案1】:

正确的做法是先导入引导资产,然后用 LESS 变量定义自定义值。因此,鉴于问题中的目录结构:

如果您使用的是 Bootstrap 2.x 版:

/* import bootstrap components from bootstrap-dedicated folder */
@import "../../../bootstrap/less/bootstrap.less";
@import "../../../bootstrap/less/responsive.less";

/* custom settings that deviate from Bootstrap's default values */
@sansFontFamily: Trebuchet MS, Tahoma, sans-serif, Arial;
@baseFontSize: 11px;
@baseLineHeight: 18px;

如果您使用的是 Bootstrap 3.x 版:

/* import bootstrap components from bootstrap-dedicated folder */
@import "../../../bootstrap/less/bootstrap.less";

/* custom settings that deviate from Bootstrap's default values */
@font-family-sans-serif: Trebuchet MS, Tahoma, sans-serif, Arial;
@font-size-base: 11px;
@line-height-base: 18px;

变量can be found in variables.less文件的完整列表。

【讨论】:

【解决方案2】:

根据http://lesscss.org/#-variables 此处的文档,PeterVR 将自定义变量声明移动到引导程序 @import 语句下方的建议是正确的。这表明:

当定义一个变量两次时,使用变量的最后一个定义,从当前作用域向上搜索。例如:

@var: 0;
.class1 {
    @var: 1;
    .class {
        @var: 2;
        three: @var;
        @var: 3;
    }
    one: @var;
}

编译为:

.class1 .class {
    three: 3;
}
.class1 {
    one: 1;
}

(示例代码已编辑 - 他们的版本中有几个拼写错误!)

所以我猜编译顺序是这样的:

  1. 处理所有 @import 以构建一个 LESS 代码块
  2. 浏览 LESS 代码并收集所有变量声明(每个范围块)
  3. 任何变量声明值都会替换任何以前的同名实例(每个范围块)
  4. 用变量值替换变量占位符

这可以解释为什么 .class1 .class { three: 的值是 3,即使它是在 @var: 3; 声明之前声明的。

【讨论】:

    【解决方案3】:

    你好,我从随机互联网搜索中找到了一个更好的方法

    http://ollomedia.com/using-twitter-bootstrap-the-right-way/

    示例源码,请下载查看

    http://ollomedia.com/wp-content/uploads/sample.zip
    

    【讨论】:

      【解决方案4】:

      我最近做了类似的事情,我发现最好的方法是创建自己的“variables_override.less”并在 在 bootstrap.less 和 responsive.less 中导入标准 variables.less 之后导入这个。然后正常编译这两个文件,你的变量将覆盖引导默认值

      这种方法确实涉及修改 bootsrap.less 和 responsive.less,但方式非常简单

      【讨论】:

      • 嗯..告诉我更多。为什么有必要编辑任何引导程序包含的内容?按照 PeterVR 的建议,我将变量声明移动到 导入:所以我可以强加我的变量设置并从“原始”引导程序拉取中受益......
      • 我的理解(当然我可能是错的,而且似乎是)是,当引导程序编译 css 文件时,它会处理每个 less 文件并将它们合并到最终的 css 中。如果您首先创建变量,它将被引导程序默认值覆盖,如果您在之后声明它们,则为时已晚。看到彼得所说的对你有用,我猜只有在导入所有文件后才会进行编译(我猜这是有道理的)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 2020-11-06
      • 2015-05-14
      相关资源
      最近更新 更多