scss列表索引从1开始是设计选择,nth()传0或负数报错,取首末项须用nth($list,1)和nth($list,length($list)),遍历需@for $i from 1 through length($list),index()返回值也从1起,append()/join()需注意分隔符一致性。

SCSS 列表索引从 1 开始不是 bug,是设计选择;强行套用 0-based 思维会导致编译失败,必须主动适配。
nth() 函数传入 0 或负数直接报错
写 nth($list, 0) 或 nth($list, -1) 会触发 SassError: Invalid argument for nth()。SCSS 没有运行时异常机制,错误发生在编译阶段,且不提示具体行号,排查困难。
- 取首项必须用
nth($list, 1),不能省略或写 0 - 取末项必须用
nth($list, length($list)),nth($list, -1)无效 - 遍历时循环变量必须从 1 开始:
@for $i from 1 through length($list) - 用
index($list, $value)查位置时,返回值也从 1 起,比如index(a b c, b)返回2
append() 和 join() 的分隔符行为影响索引连续性
列表拼接后新列表仍遵循 1-based 索引,但若分隔符不一致,可能意外改变结构——例如 append((a, b), c) 得到 a, b c(空格分隔),此时 nth($result, 3) 取到的是 c,但语义上它本应是第三项,而实际解析可能被当作文本片段。
-
append()默认按第一个参数的分隔符推断,想确保逗号分隔必须显式写append($list, $val, comma) -
join($a, $b, comma)比嵌套多个append()更可靠,尤其处理多值 CSS 属性(如box-shadow) - 拼接前建议先校验长度:
@if length($a) > 0 and length($b) > 0 { ... },避免空列表导致索引错位
@for 循环中插值和边界判断容易漏检
写 .item-#{$i} 看似简单,但一旦 $i 超出 length($list),后续调用 nth($list, $i) 就崩。Sass 不做隐式截断,越界即停。
- 循环体里每次用
nth()前,加一层防御:@if $i - 插值必须写成
#{$i},写成$i或{ $i }都会编译失败 - 需要补零(如
.item-01)时,Sass 无原生格式化函数,得手动拼:"0" + $i仅适用于 $i if($i
最易被忽略的点:所有列表函数——slice()、set-nth()、zip()——都共享同一套索引规则。你以为只改了 nth() 就够,其实 slice($list, 2) 也是从第二项起截,不是下标 2 的位置。别依赖记忆,每次用前扫一眼文档里的“1-based”标注。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











