css - 少 CSS : abusing the & Operator when nesting?

标签 css css-selectors less

少用 &运营商增强possibilities for nesting .

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

这会导致 & 的替换使用父选择器并导致实际选择器与父选择器的串联:.header .navigation.class而不是正常的追加,这将导致 .class后裔:.header .navigation .class .

现在还有可能是以下( see also here ):
.header        { color: black;
  .navigation  { font-size: 12px;
    #some-id & .foo   { text-decoration: none }
  }
}

这将导致以下结果:#some-id .header .navigation .foo try here .替换发生了,我有 前置 一个选择器( #some-id )到我的父选择器。

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

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

最佳答案

自从我们遇到它后,我也一直在进一步思考这个用途 in that question you referenced .虽然我无法明确回答这是 & 的“错误”用途(BoltClock 似乎很好地论证了它不是错误),我想论证它的值(value)(从逻辑的 Angular 认为它不是错误)。

然而,在逻辑论证之前,我确实找到了another short, simple quote (在“嵌套规则”部分)这似乎表明它至少不是无意的:“& 代表当前选择器父级。”而已。正如 BoltClock 所说,前置或附加似乎无关紧要。所有的目的是它是当前到那个点的“选择器父级”的占位符。事实上,它总是与语言的“嵌套”使用一起被提及,这意味着它旨在指定嵌套的完整选择器字符串,直到它所在的嵌套点。如何使用该字符串(用于预先或附加)似乎取决于编码器。

现在,您提到(并且之前提到过)您“永远不会以这种方式编码”,但我发现自己看到了似乎非常有值(value)的用途。考虑以下论点。

插图的 HTML 设置

假设,为了说明起见,body 上有三个可能的类别(“浅”、“中”、“深”主题)的动态设置。改变网站“外观”的元素。我们有
两列,以及我们想要在每个主题的每一列中设置不同样式的一些不同类型的链接( 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>

现在要问的问题是,只需查看链接,以下两种方法的...
  • LESS 中的代码更少
  • 最好在 LESS 中组织代码
  • 在 CSS 中输出更少的代码
  • 最好组织输出的 CSS

  • “最佳”可能有些主观。我会让你自己从下面权衡这些证据。

    选项 #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,我需要设置一个新的、未嵌套的 .textLink选择器(至少另一行代码)将其应用于所有主题链接,并且该类的“基本”代码将再次与主题链接信息的其余代码所在的位置无关。

    第三,作为开发人员,如果我的 picLinks 有问题(我页面上的一种特定类型的元素),选项 #2 使检查我遇到问题的元素的代码变得更加容易,因为我所有主题的所有代码都在一个地方。

    显然,人们希望最终的 LESS 和 CSS 的组织方式将成为人们如何看待其值(value)的一个主要因素。 我在这里的观点只是为了证明使用 & 有一个非常有用的、合乎逻辑的理由。以这种方式将父级选择器添加到 &引用。

    关于css - 少 CSS : abusing the & Operator when nesting?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11537260/

    相关文章:

    CSS:div高度占用父级的所有可用空间

    javascript - 为什么我的页面没有加载到 Github 上?

    javascript - 不是 css 中的选择器不起作用?

    jquery - css 选择器 #<my-id> (应该是)100% 等同于 jQuery 中的 [id=<my-id>] 吗?

    css - LESS 在 mixin 中重复选择器声明

    css - Grunt 动态文件映射生成过多的路径

    jquery - 使用文档选择动态元素不起作用

    html - 为什么::selection:first-child 不起作用?

    html - 影响 :active 上的多个类

    css - 更改较少变量的背景不透明度