占位符Mixin SCSS / CSS


122

我正在尝试为sass中的占位符创建一个mixin。

这是我创建的mixin。

@mixin placeholder ($css) {
  ::-webkit-input-placeholder {$css}
  :-moz-placeholder           {$css}
  ::-moz-placeholder          {$css}
  :-ms-input-placeholder      {$css}  
}

这就是我想要包含mixin的方式:

@include placeholder(font-style:italic; color: white; font-weight:100;);

显然,由于所有冒号和分号都已传递给mixin,因此这行不通,但是...我真的很想输入静态CSS并将其完全传递给上面的函数。

这可能吗?

Answers:


253

您正在寻找@content指令:

@mixin placeholder {
  ::-webkit-input-placeholder {@content}
  :-moz-placeholder           {@content}
  ::-moz-placeholder          {@content}
  :-ms-input-placeholder      {@content}  
}

@include placeholder {
    font-style:italic;
    color: white;
    font-weight:100;
}

SASS参考有更多信息,可以在这里找到:http : //sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


从Sass 3.4开始,此mixin可以这样编写,使其既可以嵌套也可以嵌套使用:

@mixin optional-at-root($sel) {
  @at-root #{if(not &, $sel, selector-append(&, $sel))} {
    @content;
  }
}

@mixin placeholder {
  @include optional-at-root('::-webkit-input-placeholder') {
    @content;
  }

  @include optional-at-root(':-moz-placeholder') {
    @content;
  }

  @include optional-at-root('::-moz-placeholder') {
    @content;
  }

  @include optional-at-root(':-ms-input-placeholder') {
    @content;
  }
}

用法:

.foo {
  @include placeholder {
    color: green;
  }
}

@include placeholder {
  color: red;
}

输出:

.foo::-webkit-input-placeholder {
  color: green;
}
.foo:-moz-placeholder {
  color: green;
}
.foo::-moz-placeholder {
  color: green;
}
.foo:-ms-input-placeholder {
  color: green;
}

::-webkit-input-placeholder {
  color: red;
}
:-moz-placeholder {
  color: red;
}
::-moz-placeholder {
  color: red;
}
:-ms-input-placeholder {
  color: red;
}

1
完美,正是我所需要的。
Shannon Hochkins 2013年

4
不知道为什么要恢复,但是答案不正确。每个单独的供应商前缀的开头都需要“ @”。看一下Dave Hein给出的答案,或者更好的方法-尝试运行此代码,您将发现它无法正常工作。
Sk446 2014年

1
@RickM因为您所做的修改未编译而被还原(错误:基本级规则不能包含父选择器引用字符'&'。)。这将创建OP正在寻找的确切输出,而您声称为“正确”的答案就不会。
cimmanon 2014年

有趣的...您是否通过cli进行编译?看起来肯定存在版本冲突,因为恰恰相反的事情发生在我身上,并且根据其他答复(还有其他答复)来判断。
Sk446 2014年

4
是的,CLI:通过Compass的Sass 3.3.0.rc.3。使用CodePenSassmeister再次检查。的&,如果你希望能够得到一个像选择需要input::-webkit-input-placeholder与混入,但它会阻止你使用它的根目录下。 sassmeister.com/gist/9469073。现在,如果您使用的是LibSass,那就是另一回事了。
cimmanon

168

我发现cimmanonKurt Mueller给出的方法几乎可行,但是我需要一个父引用(即,我需要在每个供应商前缀中添加'&'前缀)。像这样:

@mixin placeholder {
    &::-webkit-input-placeholder {@content}
    &:-moz-placeholder           {@content}
    &::-moz-placeholder          {@content}
    &:-ms-input-placeholder      {@content}  
}

我这样使用mixin:

input {
    @include placeholder {
        font-family: $base-font-family;
        color: red;
    }
}

使用父引用,然后生成正确的css,例如:

input::-webkit-input-placeholder {
    font-family: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Liberation Serif", Georgia, serif;
    color: red;
}

如果没有父引用(&),则会在供应商前缀之前插入一个空格,并且CSS处理器将忽略该声明。看起来像这样:

input::-webkit-input-placeholder {
    font-family: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Liberation Serif", Georgia, serif;
    color: red;
}

9
非常感谢你。您节省了我数小时的尝试和错误,以使接受的答案/解决方案有效……
tmuecksch 2014年

值得注意的是,您的选择器现在已经稍微超出了资格(除非您确实不希望选择器在输入或选择元素上起作用)。添加父选择器可防止您使用mixin而不嵌套(这是OP所要的)。
cimmanon 2014年

1
&是完全必要的。编辑了流行的答案以反映这一点。
AlexKempton 2014年

1
+1。一些浏览器::placeholder现在支持官方财产,所以我建议在顶部添加它:&::placeholder {@content}
Matt Browne

11

这是速记语法

=placeholder
  &::-webkit-input-placeholder
    @content
  &:-moz-placeholder
    @content
  &::-moz-placeholder
    @content
  &:-ms-input-placeholder
    @content

用起来像

input
  +placeholder
    color: red

4
老实说,我认为这更难阅读,也不如常规语法那么整洁
Shannon Hochkins 2015年

我试图将其作为评论,但太大了。我宁愿使用这种语法,也不能使所选答案太容易工作。我认为这可能对其他人有用。
igrossiter 2015年

2
这是最好的,易于理解和实施的。
2015年

3

为什么不这样呢?

它使用列表,迭代和插值的组合。

@mixin placeholder ($rules) {

  @each $rule in $rules {
    ::-webkit-input-placeholder,
    :-moz-placeholder,
    ::-moz-placeholder,
    :-ms-input-placeholder {
      #{nth($rule, 1)}: #{nth($rule, 2)};
    }  
  }
}

$rules: (('border', '1px solid red'),
         ('color', 'green'));

@include placeholder( $rules );

1
有点复杂,我在寻找content指令,但是谢谢!
Shannon Hochkins 2013年

3

为了避免从sass编译器抛出“未封闭的块:CssSyntaxError”错误,请添加“;” 到@content的末尾。

@mixin placeholder {
   ::-webkit-input-placeholder { @content;}
   :-moz-placeholder           { @content;}
   ::-moz-placeholder          { @content;}
   :-ms-input-placeholder      { @content;}
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.