【问题标题】:Can I use the ampersand in SASS to reference specific tags with the parent class? [duplicate]我可以使用 SASS 中的 & 符号来引用父类的特定标签吗? [复制]
【发布时间】:2013-03-25 15:39:06
【问题描述】:

我有一个课程semantic,我将其应用于许多不同的元素。根据应用类的 html 标签,我希望它应用不同的样式。这就是我尝试这样做的方式:

.semantic {
    &ul {
        padding: 0;
        margin: 0;
    }
    &p {
        margin: 0;
    }
}

这不起作用。我当然可以这样写,但不会很“干”:

 .semantic ul {
    padding: 0;
    margin: 0;
 }

 .semantic p {
     margin: 0;
 }

这可能吗?

编辑:为澄清起见,以下是我的 HTML 的示例:

<ul class='semantic'>
    <li>An Item</li>
</ul>

<p class='semantic'>This text is semantically a paragraph, but should not be displayed as such</p>

【问题讨论】:

    标签: sass


    【解决方案1】:

    在 Sass 3.4 上:

    .semantic {
        @at-root {
          ul#{&} {
            padding: 0;
            margin: 0;
          }
          p#{&} {
            margin: 0;
          }
        }
    }
    

    生成:

    ul.semantic {
      padding: 0;
      margin: 0;
    }
    
    p.semantic {
      margin: 0;
    }
    

    @at-root 将块移动到顶层。这有多种用途(参见链接),但在这里它被用来继续利用 &amp; 语法,而不暗示这些规则是 .semantic 的子选择器。

    【讨论】:

    • 你能解释一下它是如何/为什么起作用的吗?
    • 这可能有两个类吗?例如:.semantic, .semantic2 {}
    • 这应该是公认的答案
    • 相关信息: 不幸的是,它不适用于嵌套样式,因为它将直接应用于根元素(一旦您使用 @at-root 特殊选择器就有意义),不给父母 (jsfiddle.net/4g5fL5sp/1)。
    • 记录在案,@at-root ul#{&amp;}(单行)适用于
    【解决方案2】:

    理论上你想要的应该是这样的:

    .semantic {
        ul& {
            padding: 0;
            margin: 0;
        }
        p& {
            margin: 0;
        }
    }
    

    这是不可能的,因为&amp; 必须是第一个。你只需要处理它不是 DRY 的事实并用手写出来:

    ul.semantic {
        padding: 0;
        margin: 0;
    }
    
    p.semantic {
        margin: 0;
    }
    

    从 Sass 3.3 或 3.4 开始,可以使用以下语法:

    .semantic {
        ul#{&} {
            padding: 0;
            margin: 0;
        }
        p#{&} {
            margin: 0;
        }
    }
    

    【讨论】:

    • &amp; 不一定是第一个。唯一严格的要求是&amp;必须被空格或那些特殊的css选择符~、&gt;等包围。
    • 这对我不起作用。在 Sass 3.4.16 中,您的 wxample 生成 .semantic ul.semantic {padding: 0; margin: 0;} .semantic p.semantic {margin: 0;}
    • 这在 Sass 3.4.21 中不起作用。相反,@jruz 的解决方案效果很好。
    • 谢谢哥们。它帮了我很多,而且效果很好:)
    • 聪明。从来不知道你能做到这一点,但非常方便。
    【解决方案3】:

    由于 CSS 特定性的工作原理,您可以这样做:

    .semantic {
      margin: 0; 
    }
    
    ul.semantic {
      padding: 0;
    }
    

    在您的 HTML 中,p.semantic 和 ul.semantic 将具有 margin: 0;,而只有 ul.semantic 将具有 padding: 0;

    少 Sass,少 CSS。干燥。

    如果与您的示例不同,真实站点上的元素的共同点更少,您可能需要重新考虑为什么它们需要具有相同的类名。

    【讨论】:

    • 我试图避免的部分是必须为每个人指定.semantic。 SASS 的一大优点是它的嵌套性。我试图避免多次指定类名(以保持其干燥)。
    猜你喜欢
    • 2019-03-29
    • 2014-07-14
    • 2014-12-20
    • 1970-01-01
    • 2015-05-04
    • 2012-06-21
    • 2014-11-21
    • 2012-12-24
    • 2012-06-28
    相关资源
    最近更新 更多