130 votes

Mixin Placeholder SCSS/CSS

J'essaie de créer un mixin pour les placeholders dans sass.

Voici le mixin que j'ai créé.

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

Voici comment j'aimerais inclure le mixin :

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

Il est évident que cela ne va pas fonctionner à cause de tous les deux-points et les points-virgules qui sont transmis au mixin, mais... J'aimerais vraiment pouvoir entrer une css statique et la faire passer exactement comme la fonction ci-dessus.

Est-ce possible ?

264voto

cimmanon Points 25378

Vous cherchez le @content directive :

@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 Reference a plus d'informations, qui peuvent être trouvées ici : http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


À partir de Sass 3.4, ce mixin peut être écrit de la manière suivante pour fonctionner à la fois avec et sans imbrication :

@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;
  }
}

Utilisation :

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

@include placeholder {
  color: red;
}

Sortie :

.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 votes

Parfait, exactement ce dont j'avais besoin.

4 votes

Je ne sais pas pourquoi cela a été annulé, mais la réponse est incorrecte. Vous avez besoin de '@' au début de chacun des préfixes des fournisseurs individuels. Jetez un coup d'oeil à la réponse donnée plus bas par Dave Hein, ou mieux encore - essayez d'exécuter ce code, et vous verrez qu'il ne fonctionne pas.

1 votes

@RickM Il a été rétabli parce que les modifications que vous avez apportées ne compilent pas (erreur : Les règles de base ne peuvent pas contenir le caractère '&' de référence au sélecteur de parent). Cela crée le résultat exact que le PO recherche, la réponse que vous prétendez être "correcte" ne l'est pas.

171voto

Dave Hein Points 565

J'ai trouvé l'approche donnée par cimmanon et Kurt Mueller a presque fonctionné, mais j'avais besoin d'une référence parentale (c'est-à-dire que je dois ajouter le préfixe '&' à chaque préfixe de fournisseur) ; comme ceci :

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

J'utilise le mixin comme ceci :

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

Avec la référence parentale en place, le css correct est généré, par exemple :

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

Sans la référence parentale (&), un espace est inséré avant le préfixe du fournisseur et le processeur CSS ignore la déclaration ; cela ressemble à ceci :

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

9 votes

Merci beaucoup. Vous m'avez épargné des heures d'essais et d'erreurs pour faire fonctionner la réponse/solution acceptée...

0 votes

Il convient de noter que vos sélecteurs sont désormais légèrement surqualifiés (à moins que vous ne souhaitiez réellement que le système ne fonctionne pas sur les éléments d'entrée ou de sélection). L'ajout du sélecteur parent vous empêche d'utiliser le mixin sans imbrication (ce qui était ce que le PO recherchait).

1 votes

Le site & est totalement nécessaire. J'ai modifié la réponse populaire pour refléter cela.

11voto

igrossiter Points 87

Ceci est pour une syntaxe abrégée

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

utilisez-le comme

input
  +placeholder
    color: red

3voto

Kurt Mueller Points 389

Pourquoi pas quelque chose comme ça ?

Il utilise une combinaison de listes, d'itération et d'interpolation.

@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 votes

C'est juste un peu trop compliqué, je cherchais la directive de contenu mais merci !

3voto

NoDirection Points 51

Pour éviter que l'erreur 'Unclosed block : CssSyntaxError' à partir des compilateurs sass, ajoutez un ';' à la fin de @content.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X