ตัวยึด Mixin SCSS / CSS


122

ฉันกำลังพยายามสร้าง mixin สำหรับตัวยึดตำแหน่งใน sass

นี่คือมิกซ์อินที่ฉันสร้างขึ้น

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

นี่คือวิธีที่ฉันต้องการรวมมิกซ์อิน:

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

เห็นได้ชัดว่าสิ่งนี้จะไม่ได้ผลเพราะเครื่องหมายทวิภาคและเซมิโคลอนทั้งหมดที่ส่งผ่านไปยังมิกซ์อิน แต่ ... ฉันต้องการแค่ใส่ static css แล้วส่งผ่านเหมือนกับฟังก์ชันข้างต้น

เป็นไปได้หรือไม่

คำตอบ:


253

คุณกำลังมองหา@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;
}

SASS Reference มีข้อมูลเพิ่มเติมซึ่งสามารถดูได้ที่นี่: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


ใน Sass 3.4 คุณสามารถเขียน mixin นี้ได้เพื่อให้ทำงานได้ทั้งแบบซ้อนและไม่ทดสอบ:

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

การใช้งาน:

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

@include placeholder {
  color: red;
}

เอาท์พุท:

.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
สมบูรณ์แบบในสิ่งที่ฉันต้องการ
แชนนอน Hochkins

4
ไม่แน่ใจว่าเหตุใดจึงเปลี่ยนกลับ แต่คำตอบไม่ถูกต้อง คุณต้องมี "@" ที่จุดเริ่มต้นของคำนำหน้าผู้ขายแต่ละราย ลองดูคำตอบเพิ่มเติมโดย Dave Hein หรือดีกว่า - ลองเรียกใช้รหัสนี้แล้วคุณจะเห็นว่ามันไม่ได้ผล
Sk446

1
@RickM มันถูกเปลี่ยนกลับเนื่องจากการแก้ไขที่คุณทำไม่ได้คอมไพล์ (ข้อผิดพลาด: กฎระดับพื้นฐานไม่สามารถมีอักขระอ้างอิงตัวเลือกหลัก '&' ได้) สิ่งนี้สร้างผลลัพธ์ที่แน่นอนที่ OP กำลังมองหาคำตอบที่คุณอ้างว่า "ถูกต้อง" ไม่ได้
cimmanon

น่าสนใจ ... คุณกำลังรวบรวมผ่าน cli หรือไม่? ดูเหมือนว่าจะต้องมีความขัดแย้งในการกำหนดเวอร์ชันเนื่องจากสิ่งที่ตรงกันข้ามเกิดขึ้นกับฉันและตัดสินโดยคำตอบอื่น ๆ อีกสองสามคนด้วย
Sk446

4
ใช่ CLI: Sass 3.3.0.rc.3 ผ่านเข็มทิศ ดับเบิลตรวจสอบกับCodePenและSassmeister &จำเป็นถ้าคุณต้องการที่จะสามารถที่จะได้รับเลือกเช่นinput::-webkit-input-placeholderกับ mixin แต่มันจะป้องกันคุณจากการใช้มันที่ระดับราก sassmeister.com/gist/9469073 ตอนนี้ถ้าคุณใช้ LibSass นั่นเป็นอีกเรื่องหนึ่ง
cimmanon

168

ฉันพบว่าแนวทางที่กำหนดโดยcimmanonและKurt Muellerเกือบจะได้ผล แต่ฉันต้องการข้อมูลอ้างอิงของผู้ปกครอง (เช่นฉันต้องเพิ่มคำนำหน้า '&' ให้กับคำนำหน้าผู้ขายแต่ละราย) แบบนี้:

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

ฉันใช้ mixin แบบนี้:

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

เมื่อมีการอ้างอิงพาเรนต์แล้ว css ที่ถูกต้องจะถูกสร้างขึ้นเช่น:

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

หากไม่มีการอ้างอิงระดับบนสุด (&) ช่องว่างจะถูกแทรกก่อนคำนำหน้าผู้ขายและตัวประมวลผล CSS จะละเว้นการประกาศ ที่มีลักษณะดังนี้:

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

9
ขอบคุณมาก. คุณช่วยฉันได้หลายชั่วโมงในการลองผิดลองถูกเพื่อให้คำตอบ / วิธีแก้ปัญหาเป็นที่ยอมรับ ...
tmuecksch

เป็นที่น่าสังเกตว่าตัวเลือกของคุณมีคุณสมบัติมากเกินไปเล็กน้อย (เว้นแต่คุณจะไม่ต้องการให้มันทำงานกับอินพุตหรือเลือกองค์ประกอบ) การเพิ่มตัวเลือกหลักจะป้องกันไม่ให้คุณใช้มิกซ์อินโดยไม่ต้องซ้อนกัน (ซึ่งเป็นสิ่งที่ OP กำลังมองหา)
cimmanon

1
&เป็นสิ่งที่จำเป็นทั้งหมด แก้ไขคำตอบยอดนิยมเพื่อสะท้อนสิ่งนี้
AlexKempton

1
+1 เบราว์เซอร์บางตัวรองรับ::placeholderคุณสมบัติอย่างเป็นทางการในขณะนี้ดังนั้นฉันขอแนะนำให้เพิ่มสิ่งนี้ที่ด้านบน:&::placeholder {@content}
Matt Browne

11

นี่คือไวยากรณ์ชวเลข

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

ใช้มันเช่น

input
  +placeholder
    color: red

4
ฉันคิดตามตรงว่ามันอ่านยากกว่าและยังไม่เรียบร้อยเท่าไวยากรณ์ปกติ
Shannon Hochkins

ฉันพยายามใส่ไว้เป็นความคิดเห็น แต่มีขนาดใหญ่เกินไป ฉันค่อนข้างใช้ไวยากรณ์นี้และไม่สามารถทำให้คำตอบที่เลือกทำงานได้ง่ายเกินไป ฉันคิดว่ามันอาจเป็นประโยชน์สำหรับคนอื่น
igrossiter

2
อันนี้ดีที่สุดเข้าใจง่ายและนำไปใช้ได้
arslion

3

ทำไมไม่เป็นแบบนี้?

ใช้การรวมกันของรายการการวนซ้ำและการแก้ไข

@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
มันค่อนข้างซับซ้อนฉันกำลังมองหาคำสั่งเนื้อหา แต่ขอบคุณ!
Shannon Hochkins

3

เพื่อหลีกเลี่ยงข้อผิดพลาด 'Unclosed block: CssSyntaxError' ที่ถูกส่งจากคอมไพเลอร์ sass ให้เพิ่ม ';' ไปยังจุดสิ้นสุดของ @content

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

0

ฉันใช้ตัวยึด sass mixin เดียวกันกับที่ NoDirection เขียน ฉันพบมันในคอลเลกชัน sass mixins ที่นี่และฉันพอใจกับมันมาก มีข้อความที่อธิบายตัวเลือกมิกซ์อินเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.