【问题标题】:Less Mixin iteration infinite (circular loop)Less Mixin 迭代无限(循环循环)
【发布时间】:2023-03-20 09:13:01
【问题描述】:

如何不停地迭代 mixin 循环?假设我有一个有四种颜色的数组。当它迭代到最后一种颜色时,它会从第一种颜色开始,依此类推,第四种。

我的代码:

@array: blue, red, green, yellow;

.color-mix(@i) when (@i > 0) {
  ul {
    li:nth-child(@{i}) {
      .background-color(extract(@array, @i);
    }
  }
.color-mix(@i - 1);
}

.color-mix(4);

只会迭代四次,如果我添加更多迭代它会中断,因为颜色数组只有四种颜色,我正确吗?但是如何进行无限循环呢?

【问题讨论】:

  • 我很好奇你为什么要这样做,除非你正在考虑让某人的系统崩溃。
  • @Harry,我不知道。但是假设我有一个未排序的列表,我想将颜色添加到它的背景中,当它超过四个 li 元素时,我希望它再次从第一个颜色开始......你明白我在哪里吗上车?
  • 好的,所以你更多的是当它迭代到最后一种颜色时,它从第一种颜色开始,依此类推,然后是第四种。而不是真正的无限循环对吗?我的意思是,您更多的是寻找循环而不是无限?
  • @Harry,是的。圆形循环听起来更方便...

标签: css loops less mixins less-mixins


【解决方案1】:

您可以对传递给extract 函数的索引进行一些数学运算。在下面的 sn-p 中,我使用了 mod 函数来确保索引始终在 1 到 length(@array) 之间,而不管 @i 的值是什么。

即使没有,mixin 也会适应。 @array 变量中的值随着我使用数组长度而不是硬编码值而增加。

@array: blue, red, green, yellow, orange;
.color-mix(@i) when (@i > 0) {
  ul {
    li:nth-child(@{i}) {
      @temp: mod(@i - 1, length(@array)) + 1; /* for the cycle */
      @color: extract(@array, @temp); /* usage of separate var is personal preference */
      .background-color(@color); /* replace mixin with prop-value if mixin does only this */
      &:hover{
        .background-color(darken(@color, 5.5%));
      }
    }
  }
  .color-mix(@i - 1);
}

.color-mix(8); /* you can give any number here and it will iterate in a cyclic manner */

.background-color(@color){
  background: @color;
}

正如 7-phases-max 在他的评论中正确指出的那样,使用nth-child(an + b) 是比nth-child(n) 产生重复模式(循环循环)更好的选择。

@array: blue, red, green, yellow, orange;
.color-mix(@i) when (@i > 0) {
  ul {
    @index: unit(length(@array), n) ~"+" @i;
    li:nth-child(@{index}) {
      @color: extract(@array, @i);
      .background-color(@color);
      &:hover{
        .background-color(darken(@color, 5.5%));
      }
    }
  }
  .color-mix(@i - 1);
}

.color-mix(length(@array));

.background-color(@color){
  background: @color;
}

【讨论】:

  • 谢谢。它有效......不过只有一个问题。悬停时我有这个: .background-color(darken(extract(@array, @i), 5,5%);... 出现语法错误。为什么?
  • @Flirt:不客气。提出问题,您的意思是您对每个li 都这样做吗?如果是,请给我一些时间,我也会将其添加到答案中。
  • 这对我来说太冗长了,可以改成like this。
  • 另外需要注意的是,如果它是 circular 颜色(或任何属性)分配,则使用nth-child(Xn + Y) 而不是仅使用nth-child(X) 会更有效(例如@987654322 @)。
  • 你在这两个方面都是对的@seven-phases-max。 mod功能修复是我在答案中已经提到的待处理的东西。而且我不知道我是如何忘记 ax+b 模式的。当我早上进入我的系统时会更新答案:)
猜你喜欢
  • 2017-05-05
  • 2014-10-31
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2014-10-03
  • 2015-03-02
  • 2021-07-10
相关资源
最近更新 更多