3

使用 LESS 时,我发现混合类很有用,以便基于其他类属性创建一个新类,但有时我需要覆盖它们。

喜欢:

.btn {
  border-radius: 10px;
  background-color: blue;
  font-size:10px;
}

.btn_warning {
  .btn;
  background-color: yellow;
  font-size: 12px;
}

输出具有重复的属性:

.btn {
    border-radius: 10px;
    background-color: blue;
    font-size:10px;
}

.btn_warning {
    border-radius: 10px;
    background-color: blue; 
    font-size:10px; 
    background-color: yellow;
    font-size: 12px;
}

我知道有多种方法可以解决这个问题,比如 dom 上的多个类,甚至是 @extend 来构建多个选择器,但导航器仍然在运行时覆盖属性。

混合时是否有任何理由复制相同的属性?似乎是一种制作“独立”属性组的简单方法,但如果有重复的值,那就不好了。

4

2 回答 2

6

LESS 不考虑删除块中的重复属性,至少部分是因为这里说明的原因(为语法修复稍作修改的引用):

问题是人们经常使用多个属性来为旧浏览器提供后备。删除属性不是一般性的好方法。

程序员可以不对其进行重复编程。您可以设置一个基本的 mixin,就像 Danny Kijkov 在他的回答中提到的那样,或者......

解决方案 #1(复杂,但功能强大,可以完全定义)

您可以在构建主按钮制造商 mixin 时进行详细说明。像这样的东西:

LESS(混音)

.makeBtn(@ext: null; @rad: 10px; @color: blue; @size: 10px;) {
  .set-extension() when (@ext = null) {
    @class-extension: ~'';
  }
  .set-extension() when not (@ext = null) {
    @class-extension: ~'_@{ext}';
  }
  .set-extension();

  .btn@{class-extension} {
    border-radius: @rad;
    background-color: @color;
    font-size: @size;

    //define various addtions based on extensions here
    .specialExtensionProps() when (@ext = danger) {
      border: 3px solid red;
    }
    .specialExtensionProps() when (@ext = someExtName) {
      my-special-prop: yep;
    }
    .specialExtensionProps();
  }  
}

LESS(以多种方式使用 Mixin)

.makeBtn(); //makes base button
.makeBtn(warning; @color: yellow; @size: 12px); //makes modified button 
.makeBtn(danger; @color: red;); //makes modified button
.makeBtn(someExtName, 15px); //makes modified button

CSS 输出

.btn {
  border-radius: 10px;
  background-color: #0000ff;
  font-size: 10px;
}
.btn_warning {
  border-radius: 10px;
  background-color: #ffff00;
  font-size: 12px;
}
.btn_danger {
  border-radius: 10px;
  background-color: #ff0000;
  font-size: 10px;
  border: 3px solid red;
}
.btn_someExtName {
  border-radius: 15px;
  background-color: #0000ff;
  font-size: 10px;
  my-special-prop: yep;
}

如果您不知道,请注意上面演示的 LESS 功能,即仅设置 mixin 变量集中的一些变量。所以对于前两个专门的.makeBtn()调用,我只设置了几个变量,从 mixin 中乱序,通过显式调用变量名来设置(例如@color: yellow)。这使我可以“跳过”设置@size. 在最后一个例子中,我只设置了前两个值,所以我不需要输入任何变量名。

我不知道以上内容是否可以帮助您获得想要的东西,但它确实提供了一种能够减少代码大小的不同方式。

解决方案#2

您提到:extend()的 ,在这里可以很好地使用以避免重复:

较少的

.btn {
  border-radius: 10px;
  background-color: blue;
  font-size:10px;
}

.btn_warning {
  &:extend(.btn);
  background-color: yellow;
  font-size: 12px;
}

CSS 输出

.btn,
.btn_warning {
  border-radius: 10px;
  background-color: blue;
  font-size: 10px;
}
.btn_warning {
  background-color: yellow;
  font-size: 12px;
}

解决方案#3

在您的情况下,如果所有按钮都属于类.btn.btn_SOMETHING表单,并且您.btn_除了按钮之外没有使用其他任何东西,那么您也许可以只使用 CSS 级联来应用样式并防止重复 CSS 代码像这样(不需要特别的LESS):

LESS 和 CSS 输出

.btn, [class *= btn_] {
  border-radius: 10px;
  background-color: blue;
  font-size:10px;
}

.btn_warning {
  background-color: yellow;
  font-size: 12px;
}

任何带有该类的 htmlbtn_warning都会首先从属性选择器中获取基本按钮样式,[class *= btn_]而实际的btn_warning类将覆盖设置为被覆盖的东西。

解决方案#4

如果您在 html 中拆分类名(soclass="btn warning"而不是class="btn_warning"),则可以避免重复:

LESS 和 CSS 输出

.btn {
  border-radius: 10px;
  background-color: blue;
  font-size:10px;
}

.btn.warning {
  background-color: yellow;
  font-size: 12px;
}
于 2013-09-20T19:16:42.520 回答
3

这个解决方案怎么样?

.btn(@size: 10px, @color:blue) {
    border-radius: 10px;
    background-color: @color;
    font-size:@size;
}

.btn_warning {
    .btn(12px, yellow);
}
于 2013-09-17T00:34:58.973 回答