Yer tutucu Mixin SCSS / CSS


122

Sass'ta yer tutucular için bir mixin oluşturmaya çalışıyorum.

Oluşturduğum mixin bu.

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

Karışımı şu şekilde dahil etmek istiyorum:

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

Açıkçası bu, mixin'e aktarılan tüm iki nokta üst üste ve noktalı virgüllerden dolayı işe yaramayacak, ama ... Gerçekten sadece statik css girip yukarıdaki işlev gibi geçirmeyi çok isterim.

Mümkün mü?

Yanıtlar:


253

@contentDirektifi arıyorsunuz :

@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 Referansı, şu adreste bulunabilecek daha fazla bilgiye sahiptir: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


Sass 3.4'ten itibaren, bu mixin hem iç içe hem de iç içe çalışmayacak şekilde yazılabilir:

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

Kullanımı:

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

@include placeholder {
  color: red;
}

Çıktı:

.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
Mükemmel, tam da ihtiyacım olan şey.
Shannon Hochkins

4
Bunun neden geri çevrildiğinden emin değilim, ancak cevap yanlış. Her bir satıcı önekinin başında "@" işaretine ihtiyacınız vardır. Daha sonra Dave Hein tarafından verilen bir cevaba bir göz atın veya daha iyisi - bu kodu çalıştırmayı deneyin ve işe yaramayacağını göreceksiniz.
Sk446

1
@RickM Yaptığınız değişiklikler derlenmediği için geri alındı ​​(hata: Temel düzey kuralları, üst seçici referanslama karakteri '&' içeremez.). Bu, OP'nin aradığı kesin çıktıyı yaratır, iddia ettiğiniz yanıt "doğru" değildir.
cimmanon

İlginç ... cli ile mi derliyorsunuz? Görünüşe göre benim için tam tersi olduğu için bir versiyonlama çatışması olmalı ve diğer yanıtlara bakılırsa, birkaç kişi daha.
Sk446

4
Evet, CLI: Sass 3.3.0.rc.3 Compass aracılığıyla. CodePen ve Sassmeister ile iki kez kontrol edildi . &Eğer böyle bir seçici elde edebilmek istiyorsanız gerekli input::-webkit-input-placeholdermixin ile, ancak kök düzeyinde kullanmasını engeller. sassmeister.com/gist/9469073 . Şimdi, LibSass kullanıyorsanız, bu farklı bir hikaye.
cimmanon

168

Cimmanon ve Kurt Mueller'in verdiği yaklaşımın neredeyse işe yaradığını buldum, ancak bir ana referansa ihtiyacım vardı (yani, her bir satıcı önekine '&' ön ekini eklemem gerekiyor); bunun gibi:

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

Karışımı şu şekilde kullanıyorum:

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

Ana referans yerinde olduğunda, doğru css oluşturulur, örneğin:

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

Üst referans (&) olmadan, satıcı önekinden önce bir boşluk eklenir ve CSS işlemcisi bildirimi yok sayar; şuna benziyor:

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

9
Çok teşekkür ederim. Kabul edilen cevabın / çözümün işe yaraması için bana saatler süren deneme yanılma süresinden kurtuldunuz ...
tmuecksch

Seçicilerinizin artık biraz fazla nitelikli olduğuna dikkat etmek önemlidir (gerçekten girdi üzerinde çalışmasını veya seçilen öğeler üzerinde çalışmasını istemediğiniz sürece). Üst seçiciyi eklemek, mixini iç içe geçmeden kullanmanızı engeller (OP'nin aradığı buydu).
cimmanon

1
Bu &tamamen gereklidir. Popüler cevabı bunu yansıtacak şekilde düzenledi.
AlexKempton

1
+1. Bazı tarayıcılar ::placeholderşu anda resmi mülkü destekliyor , bu yüzden bunu en üste eklemenizi tavsiye ederim:&::placeholder {@content}
Matt Browne

11

Bu, steno sözdizimi içindir

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

gibi kullan

input
  +placeholder
    color: red

4
Dürüst olmak gerekirse, bunu okumanın daha zor olduğunu ve normal sözdizimi kadar düzgün olmadığını düşünüyorum
Shannon Hochkins

Yorum olarak koymaya çalıştım ama çok büyük. Bu sözdizimini kullanmayı tercih ederim ve seçilen cevabın çok kolay çalışmasını sağlayamadım. Başkası için yararlı olabileceğini düşündüm.
igrossiter

2
bu en iyisi, anlaşılması ve uygulanması kolay.
arslion

3

Neden böyle bir şey olmasın?

Listelerin, yinelemelerin ve enterpolasyonun bir kombinasyonunu kullanır.

@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
Sadece biraz karmaşık, içerik yönergesini arıyordum ama teşekkür ederim!
Shannon Hochkins

3

'Unclosed block: CssSyntaxError' hatalarının sass derleyicilerinden atılmasını önlemek için bir ';' ekleyin. @content'in sonuna kadar.

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

0

NoDirection'ın yazdığı gibi tam olarak aynı sass mix yer tutucusunu kullanıyorum. Onu burada sass mixins koleksiyonunda buluyorum ve çok memnunum. Orada bir metin daha bir Katmalar seçeneği açıklıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.