考察如下的 HTML 片段,通过 CSS 的 <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li></ul> 很容易地,我们能得出如下样式代码: ul { li:nth-child(3n + 1) { color: indigo; } li:nth-child(3n + 2) { color: red; } li:nth-child(3n + 3) { color: green; }} 以上,只三种颜色循环,简单情况下可这样处理。但样式多起来之后,上面代码显得很臃肿且不易维护。 既然是使用 SASS,很容易想到可通过编写循环语句来将其简化。 循环过程就是遍历一个预设的颜色列表,为每一个颜色生成相应的样式。 List & Map首先需要定义一个对象来保存预设的颜色列表,SASS 中的 Lists 可满足条件。 $colors: indigo,red,green; 使用上面的 List: $colors: indigo,green;@each $color in $colors { .color-#{$color} { color: $color; }} 编译后输出: .color-indigo { color: indigo;}.color-red { color: red;}.color-green { color: green;} 当然,也可以定义 Map 类型,为每种颜色指定名字,这样使用的时候比较语义: $colors: ( "indigo": indigo,"red": red,"green": green);@each $name,$color in $colors { .color-#{$name} { color: $color; }}索引 列表对象及其遍历如上,现在还需要在遍历过程中获得一个 index 索引值,用于生成 通过 $colors: (indigo,green);@each $color in $colors { $index: index($colors,$color); .color-#{$index} { color: $color; }} 编译后输出: .color-1 { color: indigo;}.color-2 { color: red;}.color-3 { color: green;}生成 nth-child 样式 结合上面所有,可以得出生成 $colors: (indigo,green);ul { @each $color in $colors { $index: index($colors,$color); li:nth-child(3n + #{$index}) { color: $color; } }} 编译后输出: ul li:nth-child(3n + 1) { color: indigo;}ul li:nth-child(3n + 2) { color: red;}ul li:nth-child(3n + 3) { color: green;} 注意到 通过 $colors: (indigo,$color); li:nth-child(#{length($colors)}n + #{$index}) { color: $color; } }} 这样,如果后续有颜色增加,或顺序的调整,我们只需要更新 进一步,我们可以将上面遍历生成 $colors: (indigo,green);@mixin nth-color { @each $color in $colors { $index: index($colors,$color); li:nth-child(#{length($colors)}n + #{$index}) { color: $color; } }}ul { @include nth-color;}mixin 的优化 但像上面这样还不能达到完全公用,因为 mixin 中使用了 首先,使用 $colors: (indigo,$color); &:nth-child(#{length($colors)}n + #{$index}) { color: $color; } }}ul { li { @include nth-color; }} 诚然,这样修改过后,确实可以将该 mixin 使用于多个地方了。 但考虑这么一种情况,因为上面列表比较简单,更加常见的情况是,列表中是另外复杂的元素,而不是单纯的一个元素,比如像下面这样: <ul> <li> <div classname="item"> <h3>Title</h3> <div>desc goes here...</div> </div> </li> <li> <div classname="item"> <h3>Title</h3> <div>desc goes here...</div> </div> </li> <li> <div classname="item"> <h3>Title</h3> <div>desc goes here...</div> </div> </li></ul> 现在想针对列表元素中的 结合前面的优化,似乎可以这样写: $colors: (indigo,red,green);@mixin nth-color { @each $color in $colors { $index: index($colors,$color);- &:nth-child(#{length($colors)}n + #{$index}) {+ &:nth-child(#{length($colors)}n + #{$index}) h3{ color: $color; } }}ul { li { @include nth-color; }} 编译后的结果: ul li:nth-child(3n+1) h3 { color: indigo;}ul li:nth-child(3n+2) h3 { color: red;}ul li:nth-child(3n+3) h3 { color: green;} 从结果来看,达到了目标。但又在 所以 @mixin 传参 mixin 是可以接收参数的,通过外部传递选择器进来,可以达到将 @mixin nth-color($child) { @each $color in $colors { $index: index($colors,$color); &:nth-child(#{length($colors)}n + #{$index}) #{$child}{ color: $color; } }}ul { li { @include nth-color("h3"); }}从 @mixin 将参数传递到外面 最后, 现在在其中写死了只有一个 SASS 确实也提供了这么种机制,即 mixin 能够身外传递参数,借助
@mixin nth-color($child) { @each $color in $colors { $index: index($colors,$color); &:nth-child(#{length($colors)}n + #{$index}) #{$child}{ color: $color;+ @content; } }}ul { li {- @include nth-color("h3")+ @include nth-color("h3"){+ border:1px solID orange;+ }; }} 编译后内容为: ul li:nth-child(3n+1) h3 { color: indigo; border: 1px solID orange;}ul li:nth-child(3n+2) h3 { color: red; border: 1px solID orange;}ul li:nth-child(3n+3) h3 { color: green; border: 1px solID orange;} 可以看到,外部书写的 当我们使用 @include <name> using (<arguments...>)最终的 mixin 所以,最终版的代码为: $colors: (indigo,green);@mixin nth-color($child) { @each $color in $colors { $index: index($colors,$color); &:nth-child(#{length($colors)}n + #{$index}) #{$child} { color: $color; @content ($color); } }}ul { li { @include nth-color("h3") using($color) { border: 1px solID #{$color}; } }} 编译后得到的 CSS: ul li:nth-child(3n+1) h3 { color: indigo; border: 1px solID indigo;}ul li:nth-child(3n+2) h3 { color: red; border: 1px solID red;}ul li:nth-child(3n+3) h3 { color: green; border: 1px solID green;}总结 通过将生成 @mixin 的使用,参数的传递 @mixin 中 @content 的使用 @mixin 中向外传递参数 相关资源 :nth-child() SASS documentation - Lists SASS documentation - Maps @content |
以上是内存溢出为你收集整理的利用 SASS 简化 `nth-child` 样式的生成全部内容,希望文章能够帮你解决利用 SASS 简化 `nth-child` 样式的生成所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)