【问题标题】:Double ampersand in LESSLESS 中的双 & 号
【发布时间】:2023-03-29 17:50:01
【问题描述】:

我对 LESS 编译器中的双 & 行为感到困惑。

看:

.heading {
    &&--type-small {
        font-size: 15px;
    }
}

将被编译为:

.heading.heading--type-small {
      font-size: 15px;
}

这很好。

但是。

.wrapper {
    .heading {
        &&--type-small {
            font-size: 15px;
        }
    }
}

将产生:

.wrapper .heading.wrapper .heading--type-small {
    font-size: 15px;
}

看起来很奇怪。没有?

有什么建议可以让这段代码像这样工作:

.wrapper .heading.heading--type-small {
    font-size: 15px;
}

谢谢 =)

【问题讨论】:

  • AFAIK,没有办法只插入外部选择器的一部分。
  • && 功能是何时添加到 LESS 中的,它记录在哪里?我没听说过这个。
  • @zzzzBov 不是嵌套规则名称中的第一个字符(以及第二个&符号)的&符号基本上是整个嵌套规则路径的占位符 - 有关更多详细信息,请参阅我的答案。我相信它是在LESS 1.3.1 中引入的,并带有与符号的其他一些功能。记录在"Advanced Usage of &"
  • @MartinTurjak,我很困惑&& 发生了一些新的事情,我知道使用&,并且没有建立它正在复制选择器的连接。
  • @zzzzBov 是的,实际上-在&& 中,两者具有两个不同的功能...第一个执行“加入”,第二个充当“路径”的占位符(和我同意它使它变得更加混乱,因为它被插入到选择器的其余部分之前 =)。我现在措辞得很好,以至于我必须将其添加到我的答案中;-)

标签: css less


【解决方案1】:

当您在嵌套规则中使用 & 符号时,默认嵌套结构会在输出选择器中被忽略,&符号充当 外部选择器完整列表的占位符,只会将所有父规则一直插入到层次结构的顶部(上面所有嵌套级别的“路径”)......没有办法。

所以使用第一个 - & 只会将嵌套选择器加入(连接)到整个外部选择器列表(看起来好像它只是将它添加到父选择器)并充当组合器 - 参见 @987654321 @在lescss.org。但是,当您使用第二个&符号时 - 您的选择器最终将再次包含所有外部规则 - .wrapper 和其间的所有规则现在将被添加两次。所以,这种行为并不奇怪。另请参阅我对这个问题的回答:"How to refer to two previous elements / tags / classes with LESS?",有关& 的更多功能,另请参阅下面的 7-phases-max 的 cmets。或者在 lescss.org 上找到一些 & 被用作“路径”占位符的示例,"Advanced Usage of &" 下。

你的具体例子:

我不完全确定你为什么要在类名.header--type-small 中重复“header”这个词,如果你在一个名为.header 的类之外使用它......我只会使用额外的类,比如如.type-small,像这样:

.wrapper {
    //style for the wrapper
    .heading{
        //general style for the heading
        &.type-small {
           //style for the heading with class .type-small
           font-size: 15px;
        }
        &.type-large {
           //style for the heading with class .type-large ... and so on
        }
    }
}

带有输出 CSS:

.wrapper .heading.type-small {
  font-size: 15px;
}

但是如果你真的因为某些特定的原因真的需要带有重复名称的整个长字符串......你可以这样做:

.wrapper {
    //style for the wrapper
    .heading {
        //general style for the heading
        &.heading--type{
            &-small {
               //style for the heading with class .type-small
               font-size: 15px;
            }
        }
    }
}

带有输出 CSS:

.wrapper .heading.heading--type-small {
    font-size: 15px;
}

【讨论】:

  • "这两个 & 只是有非常不同的功能" - 这不太正确,事实上,无论您使用多少次,& 符号的扩展都是相同的。 & 符号总是指“外部选择器的完整列表”,而不是“仅最近的父级”(参见Parent-SelectorsAppender)。尝试以下示例以了解 & 扩展机制: 1. a { b { c & {-:-}}} 2. a, b { c, d { & + & {-:-}}}
  • 典型的混淆点通常是:“使用& 也取消了所有外部选择器的默认前置并不那么明显”,所以对于基本的a { b { & c {-:-}}} 情况它可能看起来像& 只是最近父母的同义词 - 但它不是。
  • 恐怕我们不得不说 1) 和 2) (以及“在规则名称中使用 & - 它做了两件事”)来“详细解释”。否则我们只会将事情推向错误的方向,当@gobwas 将面临a { b { c & {-:-}}} 之类的事情时,他会再次感到震惊(例如参见github.com/less/less.js/issues/1575
  • @seven-phases-max 你是对的......我绝对不想增加任何额外的混乱......所以我现在尝试以不同的方式简化答案(但它仍然适用于更复杂的情况,无需过多详细说明)。我现在明确补充说,它永远不会仅适用于父选择器。你现在怎么看?
  • @seven-phases-max 不,我不会 :P 但是谢谢,现在清楚了 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2017-11-29
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
相关资源
最近更新 更多