在Sass中修改选择器的中间(添加/删除类等)

前端之家收集整理的这篇文章主要介绍了在Sass中修改选择器的中间(添加/删除类等)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的菜单中有样式链接的SCSS:
  1. nav {
  2. ul {
  3. li {
  4. a {
  5. color: red
  6. }
  7. }
  8. }
  9.  
  10. ul.opened {
  11. li {
  12. a {
  13. color: green
  14. }
  15. }
  16. }
  17. }

哪个生成以下(正确)CSS:

  1. nav ul li a {
  2. color: red;
  3. }
  4. nav ul.opened li a {
  5. color: green;
  6. }

我尝试修改我的JavaScript以将类应用于nav元素,并在Sass中使用selector-append()来附加类.但这似乎以错误的顺序进行追加(如果参数被反转,则该类将附加到最后一个元素!):

  1. nav {
  2. ul {
  3. li {
  4. a {
  5. color: red;
  6.  
  7. @at-root #{selector-append('.opened',&)} {
  8. color: green;
  9. }
  10. }
  11. }
  12. }
  13. }

输出(不正确!):

  1. nav ul li a {
  2. color: red;
  3. }
  4. .openednav ul li a {
  5. color: green;
  6. }

有没有一种方法可以重写SCSS,以便可以正确地附加类,而不必重复选择器(类似于selector-append()方法)?

解决方法

简短的回答

由于我们要替换的元素具有唯一的名称,我们正在寻找的是:

  1. nav {
  2. ul {
  3. li {
  4. a {
  5. color: red;
  6.  
  7. @at-root #{selector-replace(&,'ul','ul.opened')} {
  8. color: green;
  9. }
  10. }
  11. }
  12. }
  13. }

答案很长

操纵选择器是非常脏的,除非你绝对必须,否则我会反对它.如果你通过指定诸如table tr td或ul li之类的东西来高估你的选择器,那么首先要简化:tr和ul在这些选择器中都是多余的(除非你试图避免在有序列表下的样式元素).调整您的嵌套更简单等.

从Sass 3.4版开始,有两个重要的功能允许您修改选择器.

> Selector functions
>父选择器可以存储在变量中

例:

  1. .foo ul > li a,.bar {
  2. $sel: &;
  3. @debug $sel;
  4. }

您将始终获得字符串列表的列表,因为选择器可以用逗号链接在一起,即使您只有一个选择器也是如此.

  1. .foo ul > li a,.bar { ... }
  2. (1 2 3 4 5),(1)

您将注意到后代选择器在此处计数(Sass中的列表可以是空格或逗号分隔).记住这一点非常重要.

当selector-replace()不起作用时

在以下情况下,selector-replace()函数不起作用:

>您要替换的选择器不是唯一的(例如,ul ul li)
>您想插入一个或多个选择器(例如,ul ul li – > ul ul ul li)
>您想要删除选择器(例如,ul> li – > ul li)

在这种情况下,您需要遍历选择器,您需要知道要修改的位置.以下函数将使用函数并使用call() function的魔力将其应用于选择器中的特定位置.

  1. @function selector-nth($sel,$n,$f,$args...) {
  2. $collector: ();
  3. @each $s in $sel {
  4. $modified: call($f,nth($s,$n),$args...);
  5. $collector: append($collector,set-nth($s,$modified),comma);
  6. }
  7.  
  8. @return $collector;
  9. }

附加一个类(当选择器不唯一或你不知道它的名字时)

我们需要的函数有两个参数:原始选择器和你想要追加的选择器.使用简单插值来完成工作.

  1. @function append-class($a,$b) {
  2. @return #{$a}#{$b};
  3. }
  4.  
  5. .foo,.bar {
  6. ul > li a {
  7. color: red;
  8.  
  9. @at-root #{selector-nth(&,-2,append-class,'.baz')} {
  10. color: blue;
  11. }
  12. }
  13. }

输出

  1. .foo ul > li a,.bar ul > li a {
  2. color: red;
  3. }
  4. .foo ul > li.baz a,.bar ul > li.baz a {
  5. color: blue;
  6. }

插入选择器

函数还有两个参数:原始选择器和您想要在其之前插入的选择器.

  1. @function insert-selector($a,$b) {
  2. @return $b $a;
  3. }
  4.  
  5. .foo,insert-selector,.bar ul > li a {
  6. color: red;
  7. }
  8. .foo ul > .baz li a,.bar ul > .baz li a {
  9. color: blue;
  10. }

删除选择器

删除选择器就像用空字符串替换选择器一样简单.

  1. @function remove-selector($sel) {
  2. @return '';
  3. }
  4.  
  5. .foo,remove-selector)} {
  6. color: blue;
  7. }
  8. }
  9. }

输出

  1. .foo ul > li a,.bar ul > li a {
  2. color: red;
  3. }
  4. .foo ul > a,.bar ul > a {
  5. color: blue;
  6. }

TL; DR

选择器只是一个列表.任何列表操作函数都可以使用它,您可以循环它以根据需要进行修改.

所以,是的,除非你真的真的需要,否则不要这样做.如果您确定仍然需要它,我已将这些功能打包到selector-nth library中.

猜你在找的CSS相关文章