从SASS mixin中访问父选择器

Mac*_*yce 5 css sass compass-sass

我使用display:inline-block为按钮设置了mixin.我试图找到最终会使用mixim的任何类的父类,所以我可以在那里添加font-size:0px行以确保我不需要对我的HTML进行调整以避免不必要的每个按钮之间的空间.

这是一个例子......我想要的.父类接收font-size:0px行.

@mixin button() {
    display:inline-block;
    font-size: 1em;
    //other stuff to make a pretty button
    && { font-size: 0px; }
}

.parent{
    .child {
        @include button();
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 13

从Sass 3.4开始,现在可以实现.

@mixin parent {

  @each $selector in & {

    $l: length($selector);

    @if ($l == 1) {
      @error "Used parent mixin on a top-level selector";
    } @else {

      $parent: nth($selector,1);
      @for $i from 2 to $l {
        $parent: append($parent,nth($selector,$i));
      }

      @at-root #{$parent} {
        @content;
      }

    }
  }
}

// Use
.grandparent {
  .parent{
      .child {
        font-size: 1em;
          @include parent {
            font-size: 0px;
          }
      }
  }
}

// Result
.grandparent .parent .child {
  font-size: 1em;
}
.grandparent .parent {
  font-size: 0px;
}

// Errors:
.root {
  @include parent {
    content: "Won't work";
  }
}
.grandparent .parent, .root {
  @include parent {
    content: "Also won't work";
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 所有这些都需要让父类的字体大小为 1px 吗?如果没有,您能举一个更简单的例子吗? (2认同)

cim*_*non 7

不,这是不可能的.不过你可以这样做:

@mixin button($child: '.child') {
    font-size: 0px;
    //other stuff to make a pretty button

    #{$child} {
        display:inline-block;
        font-size: 1em;
    }
}

.parent{
    @include button();
}
Run Code Online (Sandbox Code Playgroud)

输出:

.parent {
  font-size: 0px;
}
.parent .child {
  display: inline-block;
  font-size: 1em;
}
Run Code Online (Sandbox Code Playgroud)