【问题标题】:LESS mixing duplicate properties更少混合重复属性
【发布时间】:2013-09-16 13:11:47
【问题描述】:

在使用 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 来构建多个选择器,但 navigator 仍然在运行时覆盖属性。

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

【问题讨论】:

    标签: less


    【解决方案1】:

    LESS 不考虑删除块中的重复属性,至少部分原因是stated here(针对语法修复稍作修改的引用):

    问题在于人们经常按顺序使用多个属性 为旧浏览器提供后备。删除属性是 不是一般情况下做的好。

    程序员可以不对其进行重复编程。您可以设置一个基本的 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;
    }
    

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

    解决方案 #4

    如果您在 html 中拆分类名(所以 class="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;
    }
    

    【讨论】:

    • 现在我明白了原因,非常友好的回答。在浏览器性能方面,一般来说,您是否认为像在解决方案 #1 中生成的输出大而冗余的单个类比在 #2、#3 或 #4 中生成的更复杂的选择器更好?似乎是大小与 cpu 的事实。由于我正在预处理,我觉得输出必须“丑陋”但经过优化。如果你想发表意见。
    • 就个人而言,如果可以修改 html,我会选择 #4。否则,我可能会使用#2。但这一切都取决于应用程序。 Cpu 时间与渲染几乎无关。
    【解决方案2】:

    这个解决方案怎么样?

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

    【讨论】:

    • 谢谢你似乎是在 mixins 中覆盖类属性时避免重复的最佳方法,提醒参数有点乏味。仍然想知道是否需要这种行为,或者是否可以请求维护已定义属性的字典并避免重复。
    猜你喜欢
    • 2015-10-07
    • 2013-12-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多