SCSS :nth-child mixin 与数组

Posted

技术标签:

【中文标题】SCSS :nth-child mixin 与数组【英文标题】:SCSS :nth-child mixin with array 【发布时间】:2016-12-17 09:40:57 【问题描述】:

所以我希望有人可以帮助我解决一些看起来简单的事情。

我设置了一个网格模板,其中包含不同位置的广告。导致代码结构有点复杂。基本上现在对我来说,为了让它看起来恰到好处,我使用了相当多的 &:nth-child 选择器来删除 / 各个断点处的广告边距。

而不是我写出以下内容:

&:nth-child( 3 ),
    &:nth-child( 10 ),
    &:nth-child( 13 ),
    &:nth-child( 17 ),
    &:nth-child( 20 ),
    &:nth-child( 23 ),
    &:nth-child( 26 ),
    &:nth-child( 30 ),
    &:nth-child( 33 ),
    &:nth-child( 37 ),
    &:nth-child( 43 ) 
        margin-right: $gutter-width;
    

我一直在尝试创建一个混合,允许我传递一个整数数组,并让 css 通过调用类似于

的内容来吐出我上面显示的内容
@include nth-children( 3, 10, 13, 17, 20...) 
    margin-right: $gutter-width;

唯一的问题是我还需要能够传递一个方程式作为该列表的一部分 (20n - 5) 或任何情况。

我尝试了一些方法,但似乎无法接近

@mixin nth-children($nths) 

@for $i from 1 through length($nths) 
    &:nth-child(#$i) 
        @content;
    

我想防止首先创建一个列表,因为值会在多种不同的屏幕尺寸和页面布局上不断变化。

【问题讨论】:

【参考方案1】:

这行得通:

$gutter-width: 12px;
$array: ("2n+1", "1", "2");
div 
    @each $i in $array 
        &:nth-child( #$i ) 
            margin-right: $gutter-width;
        
    

保持单行:

@function nth-child-adder($item) 
    @return "&:nth-child(" + $item + ")";


@function nth-child-namer($array) 
  $x: "";
  @each $i in $array 
    @if $x != "" 
        $x: append($x, "," + nth-child-adder($i));
    
    @else
        $x: append($x, nth-child-adder($i));
    
  
  @return $x;


$gutter-width: 12px;
$array: ("2n+1", "1", "2");
div 
    #nth-child-namer($array) 
        margin-right: $gutter-width;
    

【讨论】:

【参考方案2】:

下面的 mixin 应该使用 @each:

@mixin nth-children($points...) 
  @each $point in $points 
    &:nth-child(#$point) 
      @content;
    
  


/* example call */
$gutter-width: 5px;
div 
  @include nth-children( 3, 10, 13, 17, 20, "2n + 1") 
      margin-right: $gutter-width;
  

【讨论】:

【参考方案3】:

您可以使用“列表...” - 取决于您的预编译器版本)。我为它做了一个小代码笔:http://codepen.io/anon/pen/AXYRNB

$params: (1, 2, 3, 4);

$paramsLength: length($params);

@function item($item) 
  @return nth($params, $item);


@mixin nth-children($params...) 
  @for $i from 1 through $paramsLength  
    &:nth-child( #item($i) ) 
      margin-left: 2em; 
    
   



ul 
  @include nth-children($params);

欲了解更多信息,请查看此:https://www.sitepoint.com/sass-multiple-arguments-lists-or-arglist/。

PS:这并不能解决您的“方程式”问题 - 我真的不认为这是可能的 :-)

【讨论】:

以上是关于SCSS :nth-child mixin 与数组的主要内容,如果未能解决你的问题,请参考以下文章

scss 如何将它变成漂亮的SASS mixin?与@extend?

scss scss:for循环的nth-child选择器动画属性

scss 重置列mixin ...与Bourbon Neat结合使用,特别是与span-columns一起使用,以使列无需动态更改

scss よく使ってる便利そうなmixin集(Scss mixin collection)

scss Mixins.scss

scss SCSS Breakpoints Mixin