【问题标题】:Specify an attribute value using the parent selector in LESS?使用 LESS 中的父选择器指定属性值?
【发布时间】:2016-02-13 02:00:13
【问题描述】:

是否可以在LESS中使用父选择器为父属性选择器指定值?

我想要以下输出:

[some-attribute] {
    font-weight: normal;
}

[some-attribute~="bold"] {
    font-weight: bold;
}

鉴于这个(显然不正确的)例子:

[some-attribute] {
    font-weight: normal;

    &~="bold" {
        font-weight: bold;
    }
}

LESS 中是否有可能发生这样的事情?

编辑:对于任何可能好奇的人,我确实尝试过这个可憎的:

[some-attribute {

    &] {
        font-weight: normal;
    }

    &~="bold"] {
        font-weight: bold;
    }
}

我很高兴它没有奏效。我可能受到了诱惑。

【问题讨论】:

  • 您使用的是 LESS 还是 Sass?你必须选择一个。 LESS 解决方案与 Sass 解决方案截然不同。
  • @cimmanon 我经常在各种项目中使用 LESS 和 SCSS。我很好奇两者的解决方案。
  • 同时使用这两个标签很难作为重复关闭,因为这个问题的 Sass 版本已经存在:stackoverflow.com/questions/30400162/…

标签: css-selectors less


【解决方案1】:

免责声明:严格来说,这是不让事情变得过于复杂的方法,但是是的,它仍然可以通过使用选择器插值和混合的方式实现。

你可以编写一个像下面这样的 mixin,它使用属性名称作为一个输入参数,使用条件作为另一个输入参数。条件是一个可选参数,当没有提供时,mixin 认为它只是一个属性存在选择器。

必须附加的规则也作为输入传递。

.mixin-attrib-selector(@attr-name, @rule, @param:null){
    @sel-start: ~"[";
    @sel-end: ~"]";
    @{sel-start}@{attr-name}{
        & when(@param = null){
            &@{sel-end}{
                @rule();
            }
        }
        & when not (@param = null){
            &@{param}@{sel-end}{
                @rule();
            }
        }
    }
}

.mixin-attrib-selector(some-attribute, {
            font-weight: normal;
        });
.mixin-attrib-selector(some-attribute,{
            font-weight: bold;
        }, ~"~='bold'");

#output{
    .mixin-attrib-selector(some-attr, {
                font-weight: normal;
            });
    .mixin-attrib-selector(some-attr,{
                font-weight: italic;
            }, ~"~='italic'");
}

【讨论】:

  • (并不是说这是一个的答案,“坏”是指它的过度杀伤力;)
  • @BoltClock:别担心,伙计。我明白你的意思。我希望没有人使用这个答案,只是想展示它增加了多么不必要的复杂性:)
  • +1 - 这真是太棒了!谢谢你解决了我的问题!我今晚要把它投入生产!
  • @BryanDowning:对生产实施伙伴要格外小心。这行得通,但不是我自己喜欢使用的东西。
  • 废话。在生产中,任何事情都会发生;)
【解决方案2】:

父选择器 (&) 仅包含对整个复杂选择器的引用,如果您将整个选择器用作基础,则可以选择扩展选择器:

.one > .two {
    &::after, &::before {
        // Compiles to .one > .two::after, .one > .two::before
    }
    & + .three {
        // Compiles to .one > .two + .three

        &-suffix {
            // Compiles to .one > .two + .three-suffix
        }
    }
}

它不能用于引用复合选择器或简单选择器的一部分,特别是它不能用于仅引用属性选择器中的属性名称。你必须坚持使用原版 CSS。

abomination 不起作用的原因是因为两个预处理器都希望样式规则中的所有选择器都是有效的; [some-attribute 不是有效的选择器。你可以write a mixin and/or use selector interpolation,但是当与样式规则一起使用时它仍然必须产生一个有效的选择器,因为编译器不能假设你不会在它自己的一组样式声明中使用选择器(当然, 预处理器是否应该 以这种方式控制作者还有待商榷...)。

【讨论】:

  • +1 - 是的,好点。我没有考虑过更长的选择器(它怎么知道我想把属性值塞到哪里?)。
【解决方案3】:

我不知道。你能做的最接近的事情是

[some-attribute] {
    font-weight: normal;

    &[some-attribute~="bold"] {
        font-weight: bold;
    }
}

哪个输出

[some-attribute] {
  font-weight: normal;
}

[some-attribute][some-attribute~="bold"] {
  font-weight: bold;
}

但你最好把它们分开

[some-attribute] {
    font-weight: normal;
}

[some-attribute~="bold"] {
    font-weight: bold;
}

【讨论】:

  • +1 - 是的,这就是我一直在做的事情。我通常将它们分开以避免特异性问题。我真的很喜欢整个 AMCSS 的想法,但是 CSS 有点讨厌。
  • @Bryan Downing:这是我第一次听说 AMCSS。令人惊讶的是,它还没有被性能爱好者击落,仅仅因为属性选择器比类选择器慢 ¯\_(ツ)_/¯ (更不用说你建议的更多类型了)
  • @BoltClock - 哈哈,还有很多时间来做这一切。尽管 CSS 比较混乱,但我认为它确实可以改善 HTML 的使用,而且根据我的经验,大多数开发人员都宁愿不接触 CSS。
猜你喜欢
  • 2016-05-06
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
相关资源
最近更新 更多