我可以在SASS中使用符号AND引用父类的特定标记吗?

我可以在SASS中使用符号AND引用父类的特定标记吗?,sass,Sass,我有一个类semantic,我将其应用于许多不同的元素。根据类应用于哪个html标记,我希望它应用不同的样式。我就是这样做的: .semantic { &ul { padding: 0; margin: 0; } &p { margin: 0; } } 这不管用。我当然可以这样写,但不会很“干”: 这可能吗 编辑:为了澄清,下面是我的HTML的示例: <ul class='semantic'&

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

.semantic {
    &ul {
        padding: 0;
        margin: 0;
    }
    &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>
  • 项目

此文本在语义上是一个段落,但不应如此显示


理论上,你想要的是:

.semantic {
    ul& {
        padding: 0;
        margin: 0;
    }
    p& {
        margin: 0;
    }
}
这是不可能的,因为
&
必须在第一位。你只需要面对它不干燥的事实,用手把它写出来:

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

p.semantic {
    margin: 0;
}
从Sass 3.3或3.4开始,可以使用以下语法:

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

由于CSS的特殊性是如何工作的,您可以这样做:

.semantic {
  margin: 0; 
}

ul.semantic {
  padding: 0;
}
在HTML中,
p.semantic
ul.semantic
将具有
边距:0并且只有
ul。语义
将有
填充:0

更少的Sass,更少的CSS。干的

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

在Sass 3.4上:

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

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

p.semantic {
  margin: 0;
}

将块移动到顶层。这有多种用途(请参见链接),但在这里它被用来保持利用
&
语法,而不意味着规则是
.semantic

的子选择器。我试图避免的部分是必须为每个规则指定
.semantic
。SASS的最大优点之一是它的嵌套。我试图避免多次指定类名(以保持干燥)。没有必要先指定
&
。唯一严格的要求是
&
必须用空格或那些特殊的css选择器字符
~
等包围。这对我不适用。在Sass 3.4.16中,您的wxample生成
.semantic ul.semantic{padding:0;margin:0;}。semantic p.semantic{margin:0;}
这在Sass 3.4.21中不起作用。相反,@jruz的解决方案工作得很好。谢谢你。这对我帮助很大,效果也很好:)聪明。我从来都不知道你能做到这一点,但非常方便。你能解释一下这是如何/为什么工作的吗?这有两个类吗?例如:
.semantic、.semantic2{}
这应该是公认的答案相关信息:不幸的是,它不会与嵌套样式一起工作,因为它将直接应用于根元素(使用
@at root
特殊选择器时有意义),而不是父元素()。对于记录,
@at root-ul{&}
(在一行上)致力于
ul.semantic {
  padding: 0;
  margin: 0;
}

p.semantic {
  margin: 0;
}