占位符Mixin SCSS/CSS

Sha*_*ins 117 css sass

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

这是我创建的mixin.

@mixin placeholder ($css) {
  ::-webkit-input-placeholder {$css}
  :-moz-placeholder           {$css}
  ::-moz-placeholder          {$css}
  :-ms-input-placeholder      {$css}  
}
Run Code Online (Sandbox Code Playgroud)

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

@include placeholder(font-style:italic; color: white; font-weight:100;);
Run Code Online (Sandbox Code Playgroud)

显然这不会起作用,因为所有的冒号和分号都被传递给mixin,但是......我真的很想输入静态css并将其传递完全类似于上面的函数.

这可能吗?

cim*_*non 239

你正在寻找@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;
}
Run Code Online (Sandbox Code Playgroud)

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


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

@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;
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

@include placeholder {
  color: red;
}
Run Code Online (Sandbox Code Playgroud)

输出:

.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;
}
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这个被还原,但答案是不正确的.您需要在每个供应商前缀的开头添加"@".看看Dave Hein进一步说明的答案,或者更好 - 尝试运行此代码,你会发现它不会工作. (4认同)
  • 是的,CLI:Sass 3.3.0.rc.3通过Compass.使用[CodePen](http://codepen.io/pen/)和[Sassmeister](http://sassmeister.com/)进行双重检查.如果你想能够使用mixin获得像`input :: - webkit-input-placeholder`这样的选择器,那么`&`是必要的,但它会阻止你在根级别使用它.http://sassmeister.com/gist/9469073.现在,如果你使用的是LibSass,那就是另一回事了. (4认同)

Dav*_*ein 165

我发现cimmanonKurt Mueller给出的方法几乎可以工作,但我需要一个父引用(即,我需要为每个供应商前缀添加'&'前缀); 像这样:

@mixin placeholder {
    &::-webkit-input-placeholder {@content}
    &:-moz-placeholder           {@content}
    &::-moz-placeholder          {@content}
    &:-ms-input-placeholder      {@content}  
}
Run Code Online (Sandbox Code Playgroud)

我像这样使用mixin:

input {
    @include placeholder {
        font-family: $base-font-family;
        color: red;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

input::-webkit-input-placeholder {
    font-family: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Liberation Serif", Georgia, serif;
    color: red;
}
Run Code Online (Sandbox Code Playgroud)

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

input::-webkit-input-placeholder {
    font-family: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Liberation Serif", Georgia, serif;
    color: red;
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢你.为了使接受的答案/解决方案有效,你为我节省了数小时的试验和错误...... (9认同)

igr*_*ter 10

这是为了简写语法

=placeholder
  &::-webkit-input-placeholder
    @content
  &:-moz-placeholder
    @content
  &::-moz-placeholder
    @content
  &:-ms-input-placeholder
    @content
Run Code Online (Sandbox Code Playgroud)

用它就像

input
  +placeholder
    color: red
Run Code Online (Sandbox Code Playgroud)

  • 老实说,我认为这更难阅读,也不像常规语法那样整洁 (4认同)
  • 这是最好的,易于理解和实施. (2认同)