LESS名称空间:“#namespace> .mixin()”与“.namespace.mixin()”

时间:2013-08-24 01:52:12

标签: syntax namespaces less

所有LESS文档和教程都使用#namespace> .mixin()语法何时进入名称空间。但是我发现自己更熟悉.namespace.mixin()语法,即:

.namespace() {
    .mixin() {
        foo: bar;
    }
}

#usage {.namespace.mixin()}

我错过了什么吗?这两个变体之间是否存在任何差异(在partucular中,mixins /变量影响范围的方式,反之亦然)?或者它只是某种历史根源的传统?


你是对的,“。namespace> .mixin”,“。namespace.mixin”和“.namespace .mixin”在用作选择器时是不同的野兽。但是当它进入mixin调用/扩展时,事情似乎有些不同。我不能在下面写一个例子:

"#usage {#namespace > .mixing}"
"#usage {#namespace.mixing}"
"#usage {#namespace .mixing}"

等。假设.mixin被定义为参数规则集,则产生不相等的输出。 “.namespace”也是如此。 E.g:

/* A */
#namespace {
    .mixin1() {
        foo1: bar;
        .mixin1() {
            foo2: bar;
        }
    }

    .someruleset {
        foo3: bar;
        .mixin1 {
            foo4: bar;
        }
    }
}

/* 1 */
#u1 {#namespace > .mixin1()}
/* 2 */
#u2 {#namespace .mixin1()}
/* 3 */
#u3 {#namespace.mixin1}
/* 4 */
#u4 {#namespace .mixin1}
/* 5 */
#u5 {#namespace.mixin1.mixin1()}
/* 6 */
#u6 {#namespace.someruleset.mixin1()}

/* B */
.namespace {
    .mixin1() {
        foo1: bar;
        .mixin1() {
            foo2: bar;
        }
    }

    .someruleset {
        foo3: bar;
        .mixin1 {
            foo4: bar;
        }
    }
}

/* 1 */
#u1 {.namespace > .mixin1()}
/* 2 */
#u2 {.namespace .mixin1()}
/* 3 */
#u3 {.namespace.mixin1}
/* 4 */
#u4 {.namespace .mixin1}
/* 5 */
#u5 {#namespace.mixin1.mixin1()}
/* 6 */
#u6 {#namespace.someruleset.mixin1()}

所有1-6个结果似乎相等。

我不知道它是否意图是轻微的行为,“语言黑暗的角落”或...... 但这就是为什么我更喜欢使用“.namespace.mixin()”语法而不是“#namespace> .mixin()” (如果我理解正确,如果当前的工作方式是预期的行为 - 假设“less.js 1.4.x”): 严格来说,LESS中没有“命名空间”或“混合”这样的东西,这些只不过是“逻辑抽象”。只有规则集可以是参数化和非参数化的。规则集可以作为命名空间,mixin或两者,具体取决于我们定义和调用它的方式。

所以我原来的问题实际上是两个:

  1. 使用“>” (这是我的主要关注点):如果它真的是冗余的,当调用/“调用”mixin时(与选择器中的“>”不同) - 放弃它。
  2. “#”vs.“。”:如果嵌套的“mixin”也可以作为命名空间(只有当它被定义为“点规则集”时才有可能)为什么我们要用“#”声明顶级命名空间? “? 换句话说,如果我们可以使用“.ruleset1.ruleset2.ruleset3.ruleset4.etc()”但不能“#ruleset1>#ruleset2>。etc()”为什么要将后一种语法用于两级只是扩张? (除非我们确实需要在id选择器内部使用mixin)。

  3. 在编写上述所有内容时,我认为最好通过在“.namespace”定义中添加一个空的parens来纠正我的原始示例,以强调它是一个显式可调用的实体,而不是任何方式的选择器。 / p>

2 个答案:

答案 0 :(得分:3)

.namespace.mixin是指包含两个类的元素,而.namespace .mixin会在.namespace中找到所有.mixins,或者只是一个错字?

答案 1 :(得分:1)

更新:我在官方的less.js问题列表https://github.com/less/less.js/issues/1205中找到了类似的主题(即使有更全面的示例/测试列表)。 这似乎就像最初无意识的语法倾向于保持“原样”:

  

令人惊讶..但我猜人们很可能会依赖这一点,如果我们打破它就不会高兴:(