Placeholder Mixin SCSS / CSS

122

Saya mencoba membuat mixin untuk placeholder di sass.

Ini adalah mixin yang saya buat.

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

Ini adalah bagaimana saya ingin memasukkan mixin:

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

Jelas ini tidak akan berhasil karena semua titik dua dan titik koma yang diteruskan ke mixin, tapi ... Saya benar-benar ingin memasukkan css statis dan meneruskannya persis seperti fungsi di atas.

Apakah ini mungkin?

Shannon Hochkins
sumber

Jawaban:

253

Anda mencari @contentarahan:

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

Referensi SASS memiliki informasi lebih lanjut, yang dapat ditemukan di sini: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


Mulai Sass 3.4, mixin ini dapat ditulis seperti itu agar berfungsi baik bersarang maupun tidak:

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

Pemakaian:

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

@include placeholder {
  color: red;
}

Keluaran:

.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;
}
cimmanon
sumber
1
Sempurna, persis seperti yang saya butuhkan.
Shannon Hochkins
4
Tidak yakin mengapa ini dikembalikan, tetapi jawabannya salah. Anda membutuhkan '@' di awal setiap prefiks vendor individual. Lihat jawaban lebih lanjut oleh Dave Hein, atau lebih baik lagi - coba jalankan kode ini, dan Anda akan melihatnya tidak akan berhasil.
Sk446
1
@RickM Dipulihkan karena modifikasi yang Anda buat tidak dapat dikompilasi (kesalahan: Aturan tingkat dasar tidak dapat berisi karakter referensi selektor-induk '&'.). Ini menciptakan keluaran yang tepat yang dicari OP, jawaban yang Anda klaim adalah "benar" tidak.
cimmanon
Menarik ... apakah Anda mengkompilasi melalui cli? Sepertinya pasti ada konflik versi karena yang terjadi sebaliknya pada saya, dan menilai dari balasan lain, beberapa juga lainnya.
Sk446
4
Ya, CLI: Sass 3.3.0.rc.3 melalui Kompas. Periksa ulang dengan CodePen dan Sassmeister . Ini &diperlukan jika Anda ingin mendapatkan selektor seperti input::-webkit-input-placeholderpada mixin, tetapi ini akan menghalangi Anda untuk menggunakannya di tingkat akar. sassmeister.com/gist/9469073 . Sekarang jika Anda menggunakan LibSass, itu cerita yang berbeda.
cimmanon
168

Saya menemukan pendekatan yang diberikan oleh cimmanon dan Kurt Mueller hampir berhasil, tetapi saya membutuhkan referensi orang tua (yaitu, saya perlu menambahkan awalan '&' ke setiap awalan vendor); seperti ini:

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

Saya menggunakan mixin seperti ini:

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

Dengan referensi induk di tempat, maka css yang benar akan dihasilkan, misalnya:

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

Tanpa referensi induk (&), maka spasi disisipkan sebelum awalan vendor dan prosesor CSS mengabaikan deklarasi tersebut; yang terlihat seperti ini:

input::-webkit-input-placeholder {
    font-family: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Liberation Serif", Georgia, serif;
    color: red;
}
Dave Hein
sumber
9
Terima kasih banyak. Anda menyelamatkan saya berjam-jam trial and error untuk membuat jawaban / solusi yang diterima bekerja ...
tmuecksch
Perlu dicatat bahwa penyeleksi Anda sekarang sedikit melebihi kualifikasi (kecuali jika Anda benar-benar tidak ingin itu bekerja pada input atau elemen pemilihan). Menambahkan pemilih induk mencegah Anda menggunakan mixin tanpa bersarang (yang dicari OP).
cimmanon
1
Ini &benar-benar diperlukan. Mengedit jawaban populer untuk mencerminkan ini.
AlexKempton
1
+1. Beberapa browser mendukung ::placeholderproperti resmi sekarang, jadi saya sarankan untuk menambahkan ini di atas:&::placeholder {@content}
Matt Browne
11

Ini untuk sintaks singkat

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

gunakan seperti itu

input
  +placeholder
    color: red
igrossiter
sumber
4
Sejujurnya saya pikir ini lebih sulit untuk dibaca dan juga tidak serapi sintaks biasa
Shannon Hochkins
Saya mencoba memasukkannya sebagai komentar, tetapi terlalu besar. Saya lebih suka menggunakan sintaks ini, dan tidak dapat membuat jawaban yang dipilih bekerja terlalu mudah. Saya pikir ini bisa berguna untuk orang lain.
igrossiter
2
yang satu ini adalah yang terbaik, mudah dipahami dan diterapkan.
arslion
3

Kenapa tidak seperti ini?

Ini menggunakan kombinasi daftar, iterasi, dan interpolasi.

@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 );
Kurt Mueller
sumber
1
Hanya sedikit rumit, saya mencari petunjuk konten tetapi terima kasih!
Shannon Hochkins
3

Untuk menghindari kesalahan 'Blok tidak tertutup: CssSyntaxError' dilempar dari kompiler sass, tambahkan ';' ke akhir @content.

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

Saya menggunakan placeholder mixin sass yang sama persis seperti yang ditulis NoDirection. Saya menemukannya dalam koleksi sass mixins di sini dan saya sangat puas dengannya. Ada teks yang lebih menjelaskan opsi mixin.

Nesha Zoric
sumber