【问题标题】:Create Smart Utility Padding and Margin classes with LESS?使用 LESS 创建智能实用程序填充和边距类?
【发布时间】:2014-06-25 01:19:48
【问题描述】:

我觉得有一种方法可以创建一组更智能的实用程序类,然后我可以将<div class="margin-top-6"> 之类的类添加到 HTML 本身的标签中,LESS 将能够使用它运行并应用一个 CSS 规则,将在该元素的顶部添加 6px 的边距。

这可能吗?

我非常相信更聪明地工作而不是更努力地工作,但现在我有一个疯狂的笨拙,感觉如果有更多的 LESS 知识,它可能会更聪明。

所以我想知道是否有更好的东西。这是我所拥有的填充部分的示例。完整的代码重复如下,每个类集最多 25px,但如果限制完全灵活的设置会很棒。我在想一些带有变量或混合的东西,或者你会有一个看起来像 .padding-@var1-@var2 的 LESS 规则的东西,然后检查 vars 是否存在,如果存在,它们是什么,然后......等等。

.padding {

    &-1  { padding:  1px !important; }
    &-2  { padding:  2px !important; }
    &-3  { padding:  3px !important; }
    &-...

    &-height-1  { padding-top:  1px !important; padding-bottom:  1px !important; }
    &-height-2  { padding-top:  2px !important; padding-bottom:  2px !important; }
    &-height-3  { padding-top:  3px !important; padding-bottom:  3px !important; }
    &-...

    &-top-1  { padding-top:  1px !important; }
    &-top-2  { padding-top:  2px !important; }
    &-top-3  { padding-top:  3px !important; }
    &-...

    &-bottom-1  { padding-bottom:  1px !important; }
    &-bottom-2  { padding-bottom:  2px !important; }
    &-bottom-3  { padding-bottom:  3px !important; }
    &-...

    &-width-1  { padding-right:  1px !important; padding-left:  1px !important; }
    &-width-2  { padding-right:  2px !important; padding-left:  2px !important; }
    &-width-3  { padding-right:  3px !important; padding-left:  3px !important; }
    &-...

    &-right-1  { padding-right:  1px !important; }
    &-right-2  { padding-right:  2px !important; }
    &-right-3  { padding-right:  3px !important; }
    &-...

    &-left-1  { padding-left:  1px !important; }
    &-left-2  { padding-left:  2px !important; }
    &-left-3  { padding-left:  3px !important; }
    &-...


}

HTML 用途:

<div class="listItem margin-top-6 padding-width-14">
    ...content here...
</div>

有什么想法吗?

非常感谢大家的时间和想法!

【问题讨论】:

  • 好吧,将这种东西(即各种大小,尤其是像素)硬编码到 HTML 类中几乎不是“更智能”的实用程序类。事实上,它是一个纯 CSS 反模式。 (好吧,您可能有一些 Bootstrap "col-md-6" 等作为示例,但它更像是一个例外 - 在它被发明时只有 no 其他方法可以做到这一点) .
  • 将所有这些转换为loops 是没有问题的(因此只需两三行Less 代码就可以生成数千个这样的类)。但是...不,说真的,您不会为每个可能的 CSS 属性和每个可能的值都提供一个专用类,是吗?
  • 毕竟,如果您需要将您的尺寸硬编码为 HTML,您可以使用初始的普通 HTML 语法:&lt;div class="listItem" style="margin-top: 6px; padding-left: 14px"&gt;,这种方法中没有 CSS 的空间。
  • 我回答你的问题了吗?
  • ALL:我同意你的观点,它实际上并不“更聪明”。我认为自己是一位资深的 CSS 纯粹主义者,而这将与这种纯粹性相反。我一直被纯程序员和他们对内联样式的不懈实践所诱惑。在喝那个 koolaid 的时候,我想创建“帮助类”,这样他们就可以以一种“更聪明”更简单的方式继续他们的方式。对于这个问题的所有伟大和建设性的回答,你们都帮助我重新关注分离形式、功能和风格的重要性……我感谢你们。我已经相应地放弃了这种方法。

标签: html css less


【解决方案1】:

很抱歉打断了你,但这是工作更难而不是更聪明

为什么要费力生成大量的 CSS 类来对元素的盒子模型进行微调?只需使用 HTML 的内置特性:style 属性。

代替:

<div class="listItem margin-top-6 padding-width-14">
    ...content here...
</div>

你可以这样做:

<div class="listItem" style="margin-top: 6px; padding: 0 14px;">
    ...content here...
</div>

...而且不必生成任何神奇的类。

如果你想更聪明地工作,你可以将这些微调整移动到一个 CSS 文件中,将它们附加到一个有意义的类名上:

<div class="listItem listItem-special">
    ...content here...
</div>

然后,您可以使用 LESS(即parametric mixins)的强大功能来缩短您需要编写的 CSS:

.listItem-special {
  .padding-width(4);
  margin-top:6px;
}

这是上面使用的混合:

.padding-width(@width){
  padding-left: (@width)px;
  padding-right: (@width)px;
}

通过类名listItem-special 抽象出您的样式,您可以在标记中的多个位置重复使用这些样式。此外,当您需要在整个站点中更改 listItem-special 的样式时,您只需更新该类的 CSS 定义!

将样式与标记分开通常被认为是一种最佳做法。关于这个主题有很多资源。 Here's one from Smashing Magazine

【讨论】:

  • @Jonathan_Wilson:问题“已回答”......确实很好解决,因为在阅读了您的答案和其他人的 cmets 之后,我意识到使用 LESS 无法回答这个问题,也不应该在实践中使用。您对利用 mix-ins 的解释很好,并帮助我在使用 LESS 时确定了它的作用。谢谢...
  • ...我想我在想 LESS 可能能够做的——它不能——将识别一个由关键字构建的类名,然后能够在其上构建样式-the-fly 有点像一种方法……但这确实是 JavaScript 的东西,也没有真正提供应该实践的形式、功能和样式的分离。 JavaScript 可以选择像“margin-left-5”这样的类名,然后生成 style="margin-left: 5px;" 的内联样式,但那会比硬编码的内联样式更好。
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 2012-03-18
  • 2015-06-20
  • 1970-01-01
  • 2011-11-18
  • 2023-03-28
  • 2012-01-27
  • 2020-10-25
相关资源
最近更新 更多