较少CSS:滥用&嵌套时的操作员?

时间:2012-07-18 08:30:16

标签: css css-selectors less

Less使用&运算符来增强possibilities for nesting

.header        { color: black;
  .navigation  { font-size: 12px;
    &.class    { text-decoration: none }
  }
}

导致使用父选择器替换&并导致实际选择器与父选择器的连接:.header .navigation.class而不是正常追加,这将导致{{ 1}}是一个后裔:.class

现在还有可能是以下(see also here):

.header .navigation .class

会产生以下结果:.header { color: black; .navigation { font-size: 12px; #some-id & .foo { text-decoration: none } } } try here。替换发生了,我有预先选择器(#some-id .header .navigation .foo)到我的父选择器。

除了我永远不会以这种方式编码的事实,因为这可能会立刻弄乱你的样式表,我的问题是:

由于没有记录此功能,它是一个功能还是更可能是一个错误? 哪些是可能的副作用?

2 个答案:

答案 0 :(得分:8)

自从我们遇到in that question you referenced以来,我一直在进一步思考这种用法。虽然我无法肯定地回答这是&的一个“错误”用法(BoltClock似乎是一个很好的论据,它不是一个bug),我想争论的价值它(从逻辑的角度来看,这不是一个错误)。

但是,在逻辑参数之前,我确实发现another short, simple quote(在“嵌套规则”部分中)似乎表明它至少不是无意的:“&表示当前的选择器父级。 “而已。正如BoltClock认为的那样,无论是前期还是追加都是无关紧要的。所有这一切都是因为它是那个“选择器父”的占位符,它是当前的最佳选择。它总是与语言的“嵌套”使用一起提及,这意味着它被设计为将嵌套的完整选择器字符串指定到它所在的嵌套点。如何使用该字符串(预先或附加)似乎取决于编码器。

现在,你提到(以前提到过)你“永远不会用这种方式编码”,但我发现自己看到了一个看似非常有用的东西。请考虑以下论点。

插图的HTML设置

为了便于说明,假设在body元素上有三个可能的类('light','medium','dark'主题)的动态设置,它们改变了“look”的“外观”。现场。我们有 我们希望在每个主题的每列中设置两个列以及一些不同类型的链接(textLinkpicLinktextWithIconLink)。

<body class="light">
  <div class="leftCol">
     <a class="textLink"></a>
     <a class="picLink"></a>
     <a class="textWithIconLink"></a>
  </div>
  <div class="rightCol">
     <a class="textLink"></a>
     <a class="picLink"></a>
     <a class="textWithIconLink"></a>
  </div>
</body>

现在要问的问题只是查看以下两种方法的链接,其中......

  1. LESS中的代码较少
  2. LESS最佳组织代码
  3. 在CSS中输出更少的代码
  4. Best组织输出的CSS
  5. “最佳”可能有些主观。我会让你自己从下面权衡这些证据。

    选项#1典型嵌套

    (约99行代码)

    /*Light Color Theme */
        .light {
          .leftCol {
            .textLink {
              color: fooL1;
              &:hover { color: barL1;}
            } 
            .picLink {
              background-image: url(/fooL1.jpg);
              &:hover { background-image: url(/barL1.jpg);}
            }
            .textWithIconLink {
              color: fooL2;
              background-image: url(/fooL2.jpg);
              &:hover { color: barL2; background-image: url(/barL2.jpg);}
            }   
          }
          .rightCol {
            .textLink {
              color: fooL3;
              &:hover { color: barL3;}
            } 
            .picLink {
              background-image: url(/fooL3.jpg);
              &:hover { background-image: url(/barL3.jpg);}
            }
            .textWithIconLink {
              color: fooL4;
              background-image: url(/fooL4.jpg);
              &:hover { color: barL4; background-image: url(/barL4.jpg);}
            }   
          }
        }
    /*Medium Color Theme */
        .medium {
          .leftCol {
            .textLink {
              color: fooM1;
              &:hover { color: barM1;}
            } 
            .picLink {
              background-image: url(/fooM1.jpg);
              &:hover { background-image: url(/barM1.jpg);}
            }
            .textWithIconLink {
              color: fooM2;
              background-image: url(/fooM2.jpg);
              &:hover { color: barM2; background-image: url(/barM2.jpg);}
            }   
          }
          .rightCol {
            .textLink {
              color: fooM3;
              &:hover { color: barM3;}
            } 
            .picLink {
              background-image: url(/fooM3.jpg);
              &:hover { background-image: url(/barM3.jpg);}
            }
            .textWithIconLink {
              color: fooM4;
              background-image: url(/fooM4.jpg);
              &:hover { color: barM4; background-image: url(/barM4.jpg);}
            }   
          }
        }
    /*Dark Color Theme */
        .dark {
          .leftCol {
            .textLink {
              color: fooD1;
              &:hover { color: barD1;}
            } 
            .picLink {
              background-image: url(/fooD1.jpg);
              &:hover { background-image: url(/barD1.jpg);}
            }
            .textWithIconLink {
              color: fooD2;
              background-image: url(/fooD2.jpg);
              &:hover { color: barD2; background-image: url(/barD2.jpg);}
            }   
          }
          .rightCol {
            .textLink {
              color: fooD3;
              &:hover { color: barD3;}
            } 
            .picLink {
              background-image: url(/fooD3.jpg);
              &:hover { background-image: url(/barD3.jpg);}
            }
            .textWithIconLink {
              color: fooD4;
              background-image: url(/fooD4.jpg);
              &:hover { color: barD4; background-image: url(/barD4.jpg);}
            }   
          }
        }
    

    CSS输出(约87行输出,当然按主题排列)

     /*Light Color Theme */
    .light .leftCol .textLink { color:fooL1; }
    .light .leftCol .textLink:hover { color:barL1; }
    .light .leftCol .picLink { background-image:url(/fooL1.jpg); }
    .light .leftCol .picLink:hover { background-image:url(/barL1.jpg); }
    .light .leftCol .textWithIconLink {
      color:fooL2;
      background-image:url(/fooL2.jpg);
    }
    .light .leftCol .textWithIconLink:hover {
      color:barL2;
      background-image:url(/barL2.jpg);
    }
    .light .rightCol .textLink { color:fooL3; }
    .light .rightCol .textLink:hover { color:barL3; }
    .light .rightCol .picLink { background-image:url(/fooL3.jpg); }
    .light .rightCol .picLink:hover { background-image:url(/barL3.jpg); }
    .light .rightCol .textWithIconLink {
      color:fooL4;
      background-image:url(/fooL4.jpg);
    }
    .light .rightCol .textWithIconLink:hover {
      color:barL4;
      background-image:url(/barL4.jpg);
    }
    /*Medium Color Theme */
    .medium .leftCol .textLink { color:fooM1; }
    .medium .leftCol .textLink:hover { color:barM1; }
    .medium .leftCol .picLink { background-image:url(/fooM1.jpg); }
    .medium .leftCol .picLink:hover { background-image:url(/barM1.jpg); }
    .medium .leftCol .textWithIconLink {
      color:fooM2;
      background-image:url(/fooM2.jpg);
    }
    .medium .leftCol .textWithIconLink:hover {
      color:barM2;
      background-image:url(/barM2.jpg);
    }
    .medium .rightCol .textLink { color:fooM3; }
    .medium .rightCol .textLink:hover { color:barM3; }
    .medium .rightCol .picLink { background-image:url(/fooM3.jpg); }
    .medium .rightCol .picLink:hover { background-image:url(/barM3.jpg); }
    .medium .rightCol .textWithIconLink {
      color:fooM4;
      background-image:url(/fooM4.jpg);
    }
    .medium .rightCol .textWithIconLink:hover {
      color:barM4;
      background-image:url(/barM4.jpg);
    }
    /*Dark Color Theme */
    .dark .leftCol .textLink { color:fooD1; }
    .dark .leftCol .textLink:hover { color:barD1; }
    .dark .leftCol .picLink { background-image:url(/fooD1.jpg); }
    .dark .leftCol .picLink:hover { background-image:url(/barD1.jpg); }
    .dark .leftCol .textWithIconLink {
      color:fooD2;
      background-image:url(/fooD2.jpg);
    }
    .dark .leftCol .textWithIconLink:hover {
      color:barD2;
      background-image:url(/barD2.jpg);
    }
    .dark .rightCol .textLink { color:fooD3; }
    .dark .rightCol .textLink:hover { color:barD3; }
    .dark .rightCol .picLink { background-image:url(/fooD3.jpg); }
    .dark .rightCol .picLink:hover { background-image:url(/barD3.jpg); }
    .dark .rightCol .textWithIconLink {
      color:fooD4;
      background-image:url(/fooD4.jpg);
    }
    .dark .rightCol .textWithIconLink:hover {
      color:barD4;
      background-image:url(/barD4.jpg);
    }
    

    选项#2结束目标分组

    我将其命名为“结束目标分组”,因为我真正看到了在添加父选择器的另一种方式中使用&。现在一个是根据实际被设计样式的最终目标元素进行编码。

    (约88行代码)

    /*Links */
    /*Text  Links*/
    .textLink {
      .light .leftCol &  {
          color: fooL1;
          &:hover { color: barL1;}
        }      
      .light .rightCol &  {
          color: fooL3;
          &:hover { color: barL3;}
        } 
      .medium .leftCol &  {
          color: fooM1;
          &:hover { color: barM1;}
        } 
      .medium .rightCol &  {
          color: fooM3;
          &:hover { color: barM3;}
        } 
      .dark .leftCol &  {
          color: fooD1;
          &:hover { color: barD1;}
        } 
      .dark .rightCol &  {
          color: fooD3;
          &:hover { color: barD3;}
        } 
    }
    /*Picture Links */
    .picLink {
      .light .leftCol &  {
          background-image: url(/fooL1.jpg);
          &:hover { background-image: url(/barL1.jpg);}
        } 
      .light .rightCol &  {
          background-image: url(/fooL3.jpg);
          &:hover { background-image: url(/barL3.jpg);}
        } 
      .medium .leftCol &  {
          background-image: url(/fooM1.jpg);
          &:hover { background-image: url(/barM1.jpg);}
        } 
      .medium .rightCol &  {
          background-image: url(/fooM3.jpg);
          &:hover { background-image: url(/barM3.jpg);}
        } 
      .dark .leftCol &  {
          background-image: url(/fooD1.jpg);
          &:hover { background-image: url(/barD1.jpg);}
        } 
      .dark .rightCol &  {
          background-image: url(/fooD3.jpg);
          &:hover { background-image: url(/barD3.jpg);}
        } 
    }
    /*Text with Icon Links */
    .textWithIconLink {
      .light .leftCol &  {
          color: fooL2;
          background-image: url(/fooL1.jpg);
          &:hover { color: barL2; background-image: url(/barL1.jpg);}
        } 
      .light .rightCol &  {
          color: fooL4;
          background-image: url(/fooL3.jpg);
          &:hover { color: barL4;  background-image: url(/barL3.jpg);}
        } 
      .medium .leftCol &  {
          color: fooM2;
          background-image: url(/fooM1.jpg);
          &:hover { color: barM2; background-image: url(/barM1.jpg);}
        } 
      .medium .rightCol &  {
         color: fooM4;
          background-image: url(/fooM3.jpg);
          &:hover { color: barM4; background-image: url(/barM3.jpg);}
        } 
      .dark .leftCol &  {
         color: fooD2;
          background-image: url(/fooD1.jpg);
          &:hover { color: barD2; background-image: url(/barD1.jpg);}
        } 
      .dark .rightCol &  {
          color: fooD4;
          background-image: url(/fooD3.jpg);
          &:hover { color: barD4; background-image: url(/barD3.jpg);}
        } 
    }
    

    CSS (大约88行输出[由于一个额外的评论],由最终目标元素组织;但请注意,由于类结构,主题仍然存在子组织)

    /*Links*/
    /*Text  Links*/
    .light .leftCol .textLink { color:fooL1; }
    .light .leftCol .textLink:hover { color:barL1; }
    .light .rightCol .textLink { color:fooL3; }
    .light .rightCol .textLink:hover { color:barL3; }
    .medium .leftCol .textLink { color:fooM1; }
    .medium .leftCol .textLink:hover { color:barM1; }
    .medium .rightCol .textLink { color:fooM3; }
    .medium .rightCol .textLink:hover { color:barM3; }
    .dark .leftCol .textLink { color:fooD1; }
    .dark .leftCol .textLink:hover { color:barD1; }
    .dark .rightCol .textLink { color:fooD3; }
    .dark .rightCol .textLink:hover { color:barD3; }
    /*Picture Links */
    .light .leftCol .picLink { background-image:url(/fooL1.jpg); }
    .light .leftCol .picLink:hover { background-image:url(/barL1.jpg); }
    .light .rightCol .picLink { background-image:url(/fooL3.jpg); }
    .light .rightCol .picLink:hover { background-image:url(/barL3.jpg); }
    .medium .leftCol .picLink { background-image:url(/fooM1.jpg); }
    .medium .leftCol .picLink:hover { background-image:url(/barM1.jpg); }
    .medium .rightCol .picLink { background-image:url(/fooM3.jpg); }
    .medium .rightCol .picLink:hover { background-image:url(/barM3.jpg); }
    .dark .leftCol .picLink { background-image:url(/fooD1.jpg); }
    .dark .leftCol .picLink:hover { background-image:url(/barD1.jpg); }
    .dark .rightCol .picLink { background-image:url(/fooD3.jpg); }
    .dark .rightCol .picLink:hover { background-image:url(/barD3.jpg); }
    /*Text with Icon Links */
    .light .leftCol .textWithIconLink {
      color:fooL2;
      background-image:url(/fooL1.jpg);
    }
    .light .leftCol .textWithIconLink:hover {
      color:barL2;
      background-image:url(/barL1.jpg);
    }
    .light .rightCol .textWithIconLink {
      color:fooL4;
      background-image:url(/fooL3.jpg);
    }
    .light .rightCol .textWithIconLink:hover {
      color:barL4;
      background-image:url(/barL3.jpg);
    }
    .medium .leftCol .textWithIconLink {
      color:fooM2;
      background-image:url(/fooM1.jpg);
    }
    .medium .leftCol .textWithIconLink:hover {
      color:barM2;
      background-image:url(/barM1.jpg);
    }
    .medium .rightCol .textWithIconLink {
      color:fooM4;
      background-image:url(/fooM3.jpg);
    }
    .medium .rightCol .textWithIconLink:hover {
      color:barM4;
      background-image:url(/barM3.jpg);
    }
    .dark .leftCol .textWithIconLink {
      color:fooD2;
      background-image:url(/fooD1.jpg);
    }
    .dark .leftCol .textWithIconLink:hover {
      color:barD2;
      background-image:url(/barD1.jpg);
    }
    .dark .rightCol .textWithIconLink {
      color:fooD4;
      background-image:url(/fooD3.jpg);
    }
    .dark .rightCol .textWithIconLink:hover {
      color:barD4;
      background-image:url(/barD3.jpg);
    }
    

    结论思考

    其他一些注意事项:

    首先,您的大多数主题颜色(以及可能的其他主题方面)将使用变量进行设置,即使使用上面的选项#2,也可以按主题将其分组在LESS代码的顶部 - 因此具有主题结构对于输出CSS本身分散在代码中并不一定是坏事。

    其次,任何主题代码上面都定义了一种元素的任何“标准”代码。我的示例没有显示这一点,但是说所有.textLink个元素都设置了text-decoration: none;。这将在选项#2下发生一次而没有任何其他选择器代码,并且将出现在下面的所有主题更改之上。对于选项#1,我需要设置一个新的 unnested .textLink选择器(至少一行代码)以将其应用于所有主题链接,以及“基本”代码对于类,将再次与主题链接信息的其余代码无关。

    第三,作为开发人员,如果我的picLinks(我页面上的特定类型的元素)出现问题,则选项#2可以更轻松地检查我的代码中我遇到问题的元素因为我所有主题的所有代码都在一个地方。

    显然,人们如何想要最终的LESS和CSS组织将成为人们如何看待其价值的一个主要因素。 我的观点仅仅是证明使用&以这种方式将父级别选择器添加到&引用时,有一个非常有用的逻辑原因。

答案 1 :(得分:5)

根本不是滥用&组合者;你可以把它放在任何地方嵌套的选择器中,它将被它上面的任何东西(它所谓的父选择器)代替:

  当您希望嵌套选择器连接到其父选择器而不是充当后代时,使用

[&组合子]。

请注意,它表示“连接”;它并没有说你只能将父选择器前置或附加到嵌套选择器。连接只能在任何特定方向上起作用。

此外,单词“descendant”与被处理的嵌套选择器的性质有关,就像默认情况下它们是由后代组合子链接一样。这绝不会限制&仅用于后代的使用,也不暗示父选择器必须以这样的方式表示父元素或祖先元素,使得嵌套选择器只能附加到它,并没有预先插入或插入其中间。