【问题标题】:How to use twitter bootstrap with bootstrap-sass in rails app?如何在 Rails 应用程序中使用 twitter bootstrap 和 bootstrap-sass?
【发布时间】:2012-04-11 11:13:41
【问题描述】:

我对此很陌生,但我无法弄清楚问题所在。

在 twitter 引导程序中我会使用:

<div class="row-fluid">
  <div class="span2">Column1</div>
  <div class="span6">Column2</div>
</div>

而且一切正常。但我不想将 spanX 和 spanY 直接写到我的 html 文件中,而是我想给出有意义的类名,例如:

<div class="user-container">
  <div class="user-filter">First Column</div>
  <div class="user-list">Second Column</div>
</div>

鉴于我正在使用https://github.com/thomas-mcdonald/bootstrap-sass,我应该如何编写我的 scss 文件?我尝试了以下方法,但它不起作用(没有显示两列):

@import "bootstrap";
@import "bootstrap-responsive";

.user-container {
    @extend .row-fluid;
}

.user-filter {
    @extend .span2;
}

.user-list {
    @extend .span10;
}

如果我查看生成的代码,在我看来一切都应该没问题:

/* line 164, ../../../../../.rvm/gems/ruby-1.9.3-p125/gems/bootstrap-sass-2.0.0/vendor/assets/stylesheets/bootstrap/_mixins.scss */
.span2, .user-filter {
  width: 140px;
}

等等。

我做错了什么?

更新:

好的,只是为了弄清楚出了什么问题 - 列被布置成行(一个接一个)而不是真正的列(一个相邻),例如:

使用引导程序:Column1 Column2
使用我的自定义类:
第一栏
第二栏

我检查了 Chrome 中的元素布局,似乎引导类具有浮动属性,而我的 - 没有。查看 css 源代码,我看到这样的类:

[class*="span"] {
  float: left;
  margin-left: 20px;
}

所以在我的情况下,我认为它应该生成如下内容: [类* =“用户过滤器”] { 向左飘浮; 左边距:20px; }

还是不行?

【问题讨论】:

  • 你能发布什么问题吗?到目前为止,输出似乎是合适的。您是否有一个包含用户容器 (.row) 的 .container 类?
  • 不,我没有 .container 类,但如果我使用 twitter 类 span* 和 row-fluid,它可以在没有容器的情况下工作。我试过添加一个容器,但没有帮助
  • 我现在将针对此问题的潜在修复推送到 bootstrap-sass 2.0.2 分支。它不会使用@extend,但会增加对流式makeColumn 和makeRow 的支持。
  • 另外——一个建议:只使用“span2”。
  • 只使用 span2 会更容易,但网格并不完全符合语义。

标签: ruby-on-rails twitter-bootstrap bootstrap-sass


【解决方案1】:

这是你对@extend的使用,或者更确切地说,是Sass无法处理通配符类匹配,这并不奇怪,因为它变得相当复杂。

Bootstrap 使用一些我可能称之为“非标准”的方法来处理某些类。您在上面的帖子中提到了其中之一 - [class*="span"]。

当然,当你使用@extend x 时,Sass 会扩展x 类。不幸的是,它(目前)无法知道通配符匹配器也会影响类的输出。所以是的,在理想情况下,[class*="span"] 也可以扩展为定义 [class*="span"], .user-filter,但 Sass 目前无法做到这一点。

虽然扩展.row-fluid 足以包含嵌套在它下面的规则。跨度类,如上所述,它不会调整扩展跨度的通配符。

bootstrap-sass 已经有一个用于固定宽度列/行的 mixin,makeRow() 和 makeColumn()。我刚刚推了一个makeFluidColumn() mixin,嗯,它产生了一个流畅的跨度。您的代码将变为:

.user-container {
  @extend .row-fluid;
}

.user-filter {
  @include makeFluidColumn(2);
}

.user-list {
  @include makeFluidColumn(10);
}

不幸的是(像往常一样)它并不是那么简单。 Bootstrap 使用这个 sn-p 来重置作为该行子级的第一个 spanx 类的边距。

> [class*="span"]:first-child {
  margin-left: 0;
}

但是,我们不能为每次调用 makeFluidColumn 重新定义它,因此我们必须在任何将成为流动行的第一个子元素的元素上手动设置 no margin-left。还值得注意的是,混合 spanx 类和 makeFluidColumn 类将导致第一个 spanx 类重置其边距,无论它是否实际上是行中的第一列。

因此您的代码将是

.user-container {
  @extend .row-fluid;
}

.user-filter {
  @include makeFluidColumn(2);
  margin-left: 0; // reset margin for first-child
}

.user-list {
  @include makeFluidColumn(10);
}

这不是一个特别漂亮的解决方案,但它有效,并且与 Bootstrap 如何使用通配符类匹配有关,正如您在问题更新中收集的那样。我刚刚将它推送到 2.0.2 分支,所以你必须使用 Bundler 和 Git 来安装它,但我希望在接下来的几天内发布。

【讨论】:

  • 太棒了!喜欢宝石,也喜欢使用 SO 来推动开发。
  • 在 boostrap-sass 2.3.2.2 上对我不起作用。我会发布一个有效的答案
【解决方案2】:

你是对的。 Twitter 正在这里推动一个 ani-patter。请参阅这篇文章。

http://ruby.bvision.com/blog/please-stop-embedding-bootstrap-classes-in-your-html

【讨论】:

    【解决方案3】:

    使用boostrap-sass 2.3.2.2 gem,我必须基于bootstrap 的mixin 创建自己的mixin,以使CSS 类的行为类似于bootstrap .span 类。

    // private mixin: add styles for bootstrap's spanX classes
    @mixin _makeFluidSpan($gridColumns, $fluidGridColumnWidth, $fluidGridGutterWidth) {
      @include input-block-level();
      float: left;
      margin-left: $fluidGridGutterWidth;
      *margin-left: $fluidGridGutterWidth - (.5 / $gridRowWidth * 100px * 1%);
      @include grid-fluid-span($gridColumns, $fluidGridColumnWidth, $fluidGridGutterWidth);
    }
    
    // thats what you should use
    @mixin makeFluidSpan($gridColumns) {
      @media (min-width: 980px) and (max-width: 1199px) {
        @include _makeFluidSpan($gridColumns, $fluidGridColumnWidth, $fluidGridGutterWidth);
      }
      @media (min-width: 1200px) {
        @include _makeFluidSpan($gridColumns, $fluidGridColumnWidth1200, $fluidGridGutterWidth1200);
      }
      @media (min-width: 768px) and (max-width: 979px) {
        @include _makeFluidSpan($gridColumns, $fluidGridColumnWidth768, $fluidGridGutterWidth768);
      }
      &:first-child {
        margin-left: 0;
      }
      @media (max-width: 767px) {
        float: none;
        display: block;
        width: 100%;
        margin-left: 0;
        box-sizing: border-box;
        margin-bottom: 20px;
        &:last-child {
          margin-bottom: 0;
        }
      }
    }
    

    示例:

      .like-span3 { // this class acts like .span3
        @include makeFluidSpan(3);
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 2013-09-26
      • 2014-01-13
      相关资源
      最近更新 更多