Trình giữ chỗ Mixin SCSS / CSS


122

Tôi đang cố gắng tạo một mixin cho các trình giữ chỗ trong sass.

Đây là mixin mà tôi đã tạo.

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

Đây là cách tôi muốn đưa vào mixin:

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

Rõ ràng là điều này sẽ không hoạt động vì tất cả các dấu hai chấm và dấu chấm phẩy được chuyển qua mixin, nhưng ... tôi thực sự muốn chỉ nhập css tĩnh và chuyển nó qua chính xác như hàm trên.

Điều này có khả thi không?

Câu trả lời:


253

Bạn đang tìm kiếm @contentchỉ thị:

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

Tham chiếu SASS có thêm thông tin, có thể tìm thấy tại đây: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


Kể từ Sass 3.4, mixin này có thể được viết như vậy để hoạt động cả lồng nhau và không được giải mã:

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

Sử dụng:

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

@include placeholder {
  color: red;
}

Đầu ra:

.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
Hoàn hảo, chính xác những gì tôi cần.
Shannon Hochkins

4
Không chắc tại sao điều này được hoàn nguyên, nhưng câu trả lời là không chính xác. Bạn cần '@' ở đầu mỗi tiền tố nhà cung cấp riêng lẻ. Hãy xem thêm câu trả lời của Dave Hein, hoặc tốt hơn - hãy thử chạy mã này và bạn sẽ thấy nó không hoạt động.
Sk446

1
@RickM Nó đã được hoàn nguyên vì các sửa đổi bạn đã thực hiện không biên dịch (lỗi: Quy tắc cấp cơ sở không thể chứa ký tự tham chiếu đến bộ chọn gốc '&'.). Điều này tạo ra kết quả chính xác mà OP đang tìm kiếm, câu trả lời bạn khẳng định là "đúng" thì không.
cimmanon

Thật thú vị ... bạn đang biên dịch qua cli? Có vẻ như phải có xung đột về phiên bản vì điều ngược lại xảy ra với tôi và đánh giá bằng các câu trả lời khác, một số câu trả lời khác cũng vậy.
Sk446

4
Có, CLI: Sass 3.3.0.rc.3 qua La bàn. Kiểm tra kỹ bằng CodePenSassmeister . Điều &này là cần thiết nếu bạn muốn có được một bộ chọn giống như input::-webkit-input-placeholdervới mixin, nhưng nó sẽ ngăn bạn sử dụng nó ở cấp cơ sở. sassmeister.com/gist/9469073 . Bây giờ nếu bạn đang sử dụng LibSass, đó là một câu chuyện khác.
cimmanon

168

Tôi nhận thấy cách tiếp cận do cimmanonKurt Mueller đưa ra gần như hiệu quả, nhưng tôi cần tham chiếu gốc (tức là tôi cần thêm tiền tố '&' vào tiền tố của mỗi nhà cung cấp); như thế này:

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

Tôi sử dụng mixin như thế này:

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

Với tham chiếu gốc tại chỗ, sau đó css đúng sẽ được tạo, ví dụ:

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

Nếu không có tham chiếu gốc (&), thì một khoảng trắng được chèn vào trước tiền tố của nhà cung cấp và bộ xử lý CSS bỏ qua khai báo; trông như thế này:

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

9
Cảm ơn rât nhiều. Bạn tôi đã lưu giờ thử và sai để làm cho công việc trả lời / giải pháp được chấp nhận ...
tmuecksch

Cần lưu ý rằng các bộ chọn của bạn hiện hơi quá đủ tiêu chuẩn (trừ khi bạn thực sự không muốn nó hoạt động trên các phần tử đầu vào hoặc lựa chọn). Việc thêm bộ chọn chính ngăn bạn sử dụng mixin mà không cần lồng (đó là những gì OP đang tìm kiếm).
cimmanon

1
&hoàn toàn cần thiết. Đã chỉnh sửa câu trả lời phổ biến để phản ánh điều này.
AlexKempton

1
+1. Một số trình duyệt hỗ trợ chính thức ::placeholdersở hữu bây giờ, vì vậy tôi muốn khuyên bạn nên thêm này ở đầu trang:&::placeholder {@content}
Matt Browne

11

Đây là cú pháp viết tắt

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

sử dụng nó như

input
  +placeholder
    color: red

4
Tôi thành thật nghĩ rằng đây là khó khăn hơn để đọc và cũng không phải là gọn gàng như cú pháp thông thường
Shannon Hochkins

Tôi đã cố gắng đặt nó dưới dạng nhận xét, nhưng quá lớn. Tôi thích sử dụng cú pháp này và không thể làm cho câu trả lời đã chọn hoạt động quá dễ dàng. Tôi nghĩ nó có thể hữu ích cho người khác.
igrossiter

2
cái này là tốt nhất, dễ hiểu và dễ thực hiện.
arslion

3

Tại sao không phải là một cái gì đó như thế này?

Nó sử dụng sự kết hợp của danh sách, phép lặp và phép nội suy.

@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
Nó chỉ hơi phức tạp một chút, tôi đã tìm kiếm chỉ thị nội dung nhưng thankyou!
Shannon Hochkins

3

Để tránh lỗi 'Khối chưa được đóng: CssSyntaxError' được ném từ trình biên dịch sass, hãy thêm dấu ';' vào cuối @content.

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

0

Tôi sử dụng chính xác trình giữ chỗ sass mixin giống như NoDirection đã viết. Tôi tìm thấy nó trong bộ sưu tập mixins sass ở đây và tôi rất hài lòng với nó. Có một văn bản giải thích thêm về tùy chọn mixins.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.