我有这个
HTML
<ul> // first level <li> <ul></ul> // second level </li> <li> <ul> // second level <li> <ul></ul> // third level </li> </ul> </li> </ul>
有没有可能将嵌套列表相互循环,得到这样的东西:
ul { padding: 10px; ul { padding: 20px; ul { padding: 30px; ... through 10 * ul } } }
有了这个我只有列表乘法.
@for $i from 1 through 10 { ul { padding-left: 100 - (10 * $i) + px; } }
解决方法
对于3.4之前的Sass版本,您需要执行此操作的功能不是本机Sass的一部分(并且递归mixin在某些版本中不起作用).你需要名为nest()的Compass函数.
$sel: ''; @for $i from 1 through 10 { // remove !global flag if you're using Sass < 3.3 $sel: if($i == 1,"ul",nest($sel,"ul")) !global; #{$sel} { padding-left: 10px * $i; } }
Sass 3.4有一个名为selector-nest()的函数的原生版本:
$sel: ''; @for $i from 1 through 10 { $sel: if($i == 1,selector-nest($sel,"ul")) !global; #{$sel} { padding-left: 10px * $i; } }
输出:
ul { padding-left: 10px; } ul ul { padding-left: 20px; } ul ul ul { padding-left: 30px; } ul ul ul ul { padding-left: 40px; } ul ul ul ul ul { padding-left: 50px; } ul ul ul ul ul ul { padding-left: 60px; } ul ul ul ul ul ul ul { padding-left: 70px; } ul ul ul ul ul ul ul ul { padding-left: 80px; } ul ul ul ul ul ul ul ul ul { padding-left: 90px; } ul ul ul ul ul ul ul ul ul ul { padding-left: 100px; }
如果你想拼出最初的ul,那么你会这样做:
ul { // parent styles border: 1px solid; $sel: ''; @for $i from 2 through 10 { $sel: if($i == 2,'ul','ul')); // note no !global flag #{$sel} { padding-left: 10px * $i; } } }
请注意,您可以使用简单的字符串连接而不是这些函数中的任何一个,但它仅适用于您只嵌套单个选择器的情况.如果您有2个或更多选择器,这是绝对必要的:
$sel: ''; @for $i from 1 through 3 { $sel: if($i == 1,"article,section",section")) !global; #{$sel} { h1 { padding-left: 10px * $i; } } }
输出:
article h1,section h1 { padding-left: 10px; } article article h1,article section h1,section article h1,section section h1 { padding-left: 20px; } article article article h1,article article section h1,article section article h1,article section section h1,section article article h1,section article section h1,section section article h1,section section section h1 { padding-left: 30px; }