我可以在SASS中使用&符号来引用父类的特定标签吗?

Jor*_*dge 34 sass

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

.semantic {
    &ul {
        padding: 0;
        margin: 0;
    }
    &p {
        margin: 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用.当然我可以像这样写它,但它不会非常"干":

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

 .semantic p {
     margin: 0;
 }
Run Code Online (Sandbox Code Playgroud)

这可能吗?

编辑:为了澄清,这里是我的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>
Run Code Online (Sandbox Code Playgroud)

小智 43

在萨斯3.4:

.semantic {
    @at-root {
      ul#{&} {
        padding: 0;
        margin: 0;
      }
      p#{&} {
        margin: 0;
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

产生:

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

p.semantic {
  margin: 0;
}
Run Code Online (Sandbox Code Playgroud)

@ at-root将块移动到顶层.这有几个用途(参见链接),但在这里它被用来保持利用&语法而不暗示规则是子选择器.semantic.

  • 这应该是公认的答案 (3认同)
  • **相关信息:**不幸的是,它不适用于嵌套样式,因为它将直接应用于根元素(一旦您使用`@at-root`特殊选择器就有意义),而不是父元素(https:// /jsfiddle.net/4g5fL5sp/1/)。 (2认同)

cim*_*non 22

你理想的是理论上看起来像这样:

.semantic {
    ul& {
        padding: 0;
        margin: 0;
    }
    p& {
        margin: 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是不可能的,因为&必须先行.你只需要处理它不是DRY并且手工写出来的事实:

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

p.semantic {
    margin: 0;
}
Run Code Online (Sandbox Code Playgroud)

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

.semantic {
    ul#{&} {
        padding: 0;
        margin: 0;
    }
    p#{&} {
        margin: 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用.在Sass 3.4.16中,你的wxample生成`.semantic ul.semantic {padding:0; margin:0;} .semantic p.semantic {margin:0;}` (10认同)
  • "&`首先没有必要.唯一严格的要求是`&`必须用空格或那些特殊的css选择符`~`,`>`等包围. (2认同)