【问题标题】:How avoid duplicating multiple css classes如何避免重复多个 CSS 类
【发布时间】:2014-04-15 05:39:15
【问题描述】:

由于 bootstrap3,我的很多 html 最终都会变成这样:

<div class="form-group">
    <label class="control-label col-xs-4 col-sm-6">Name on card</label>
    <div class="col-xs-8 col-sm-6">
        <input class="form-control" type="text" placeholder="Name on Card" required />
    </div>
</div>
<div class="form-group">
    <label class="control-label col-xs-4 col-sm-6">Card Number</label>
    <div class="col-xs-8 col-sm-6">
        <input class="form-control" type="text" placeholder="Card Number" name="EWAY_CARDNUMBER" required value="4444333322221111" />
    </div>
</div>

见上面的代码,label节点针对不同的媒体屏幕有多个类。我想简单地使用我自己的类来缩短它们。

我试图更少地创建一个从多个类扩展的类,例如

my-control-label:extend(.control-label, .col-xs-4, col-sm-6){}

但这不起作用,因为对于上面的示例,less 使用了完全匹配。是的,我可以尝试扩展“全部”,如下所示:

my-control-label:extend(.control-label all, .col-xs-4 all, col-sm-6 all){}

但是很烦人,而且会炸掉生成的css。

那么有什么简单的方法可以避免这种重复吗?

谢谢, 罗恩

更新 #1:

即使 extend all 也不适用于我的情况

HTML

<div id='finalise'>
  <form class='form-horizontal'>
    <div class='form-group' >
      <label class='my-label' />
      <div class='my-controls'>
        <input class="form-control" type="text" placeholder="Name on Card" required />
      </div>

      ...
    </div>
  </form>
</div>

减:

#finalise {
    .my-label:extend(.control-label all, .col-xs-4 all, .col-sm-3 all, .col-lg-2 all){}
    .my-controls:extend(.control-label all, .col-xs-8 all, .col-sm-5 all, .col-lg-4 all){}
}

生成的css:

@media (min-width: 768px) {
  .form-horizontal .control-label,
  .form-horizontal #finalise .label,
  .form-horizontal #finalise .controls {
    text-align: right;
  }
}

看到第 3 行不会应用 html 节点,这就是它不起作用的原因。

有什么建议吗?

更新 #2: 虽然将多个类组合成一个自定义类并不是一种通用方法,但它解决了这个问题。它使用引导网格混合解决了这个问题。谢谢 NiloVelez

HTML

<div id='finalise'>
  <form class='form-horizontal'>
    <div class='form-group' >
      <label class='control-label' />
      <div class='controls'>
        <input class="form-control" type="text" placeholder="Name on Card" required />
      </div>

      ...
    </div>
  </form>
</div>

减:

#finalise {
    .form-group {
    .make-row();
}
.control-label {
    .make-xs-column(4);
    .make-sm-column(5);
    .make-lg-column(6);
}
.controls {
    .make-xs-column(8);
    .make-sm-column(5);
    .make-lg-column(6);
}
}

【问题讨论】:

  • 即使您合并选择器以保持标记整洁,您仍然会有所有这些额外的选择器在您的 CSS 中产生垃圾。
  • 同意@cimmanon。您正在清理您的 HTML,但会大大增加您的 CSS。前段时间我对此进行了简要研究,但现在我只使用 HTML 类属性中的 col 选择器。
  • @Lowkase 我并不是要暗示这不应该完成。由于缓存,小 HTML + 大 CSS 优于大 HTML 和小 CSS。我个人的建议是停止使用制造所有这些垃圾选择器的库,但我意识到这不是某些人的选择。
  • @cimmanon,我同意小 HTML 和大 css 更好,因为我们可以在以后根据需要修改 css 而无需更改 html 部分。我们可能可以缩小 css,甚至使用其他工具自动删除未使用的 css。顺便问一下,有没有像 unused-css.com 这样的 css 优化工具?
  • github.com/addyosmani/grunt-uncss 可能是我要找的,我会尽快尝试。如果可行,我的答案将是使用 less 来扩展所有、缩小 css 和 uncss。

标签: html css twitter-bootstrap twitter-bootstrap-3 less


【解决方案1】:

您必须自己解决问题,但 Bootstrap 带有 LESS mixin,旨在减少由负责任的网格列引起的选择器膨胀

http://getbootstrap.com/css/#grid-less

你可以做这样的事情(来自文档)

.wrapper {
  .make-row();
}
.content-main {
  .make-lg-column(8);
}
.content-secondary {
  .make-lg-column(3);
  .make-lg-column-offset(1);
}

...

<div class="wrapper">
  <div class="content-main">...</div>
  <div class="content-secondary">...</div>
</div>

更新: Bootstrap 现在提供了更多关于它的 LESS mixins 的文档:

http://getbootstrap.com/css/#less-mixins-vendor

http://getbootstrap.com/css/#less-mixins-utility

【讨论】:

  • 感谢 NiloVelez,我认为这不是我所期望的 100%,但至少是 95%。它解决了我的问题。但实际上我希望有一种通用方法可以将多个类(不仅仅是网格选择器)组合成一个自定义类。
  • 虽然只记录了网格混入,但 Bootstrap 带有很多混入。 github.com/twbs/bootstrap/blob/master/less/mixins.less
  • 看起来我们可以通过这些定义自己的类来适配所有的引导类。
猜你喜欢
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多