CSS Font Border?


491

ด้วย CSS3 border สิ่งใหม่ที่เกิดขึ้น ( -webkit, ... ) ตอนนี้เป็นไปได้หรือไม่ที่จะเพิ่มเส้นขอบให้กับแบบอักษรของคุณ? (เช่นเดียวกับเส้นขอบสีขาวทึบรอบโลโก้ Twitter สีน้ำเงิน) ถ้าไม่มีมีแฮ็คที่ไม่น่าเกลียดเกินไปที่จะทำสิ่งนี้ใน CSS / XHTML หรือฉันยังต้องเปิดไฟ Photoshop หรือไม่?

คำตอบ:


1004

มีคุณสมบัติ CSS ทดลองที่เรียกว่าเป็นข้อความจังหวะ , การสนับสนุนบนเบราว์เซอร์บางหลังคำนำหน้า -webkit

h1 {
    -webkit-text-stroke: 2px black; /* width and color */

    font-family: sans; color: yellow;
}
<h1>Hello World</h1>

เคล็ดลับที่เป็นไปได้อีกอย่างหนึ่งคือการใช้สี่เงาแต่ละพิกเซลในทุกทิศทางโดยใช้คุณสมบัติtext-shadow:

h1 {
    /* 1 pixel black shadow to left, top, right and bottom */
    text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;

    font-family: sans; color: yellow;
}
<h1>Hello World</h1>

แต่มันจะเบลอเพราะมีความหนามากกว่า 1 พิกเซล


4
สิ่งนี้ได้ผลสำหรับฉันอย่างผิดปกติฉันเพิ่มเพียง 1px "blur": text-shadow: -1px 0 1px ดำ, 0 1px 1px ดำ, 1px 0 1px ดำ, 0 -1px 1px ดำ
Jakub M.

84
ดีมากถ้าคุณต้องการเพียงชายแดน 1px แต่มันน่าเกลียดเมื่อใช้ 2px ขึ้นไป
Jules Colle

2
หมายเหตุ: มีข้อผิดพลาดกับเบราว์เซอร์ Andriod ( code.google.com/p/android/issues/detail?id=7531 ) หากคุณตั้งค่า "เบลอ" เป็น 0px แสดงว่าไม่มีโครงร่างเลย
Mark Rhodes

1
btw คุณสามารถค้นหารหัสนี้ได้ในหน้าเคล็ดลับ CSS ของ W3C w3.org/Style/Examples/007/text-shadow.en.html (ใต้DRAWING LETTERS AS OUTLINESส่วน)
luiges90

ฉันได้พบนี้ทำงานได้ดีที่สุดบนพื้นหลังสีและ @ คำตอบ pixelass ทำงานที่ดีที่สุดที่มีพื้นหลังภาพ
SemanticZen

151

UPDATE

นี่คือมิกซ์ SCSS เพื่อสร้างจังหวะ: http://codepen.io/pixelass/pen/gbGZYL

/// Stroke font-character
/// @param  {Integer} $stroke - Stroke width
/// @param  {Color}   $color  - Stroke color
/// @return {List}            - text-shadow list
@function stroke($stroke, $color) {
  $shadow: ();
  $from: $stroke*-1;
  @for $i from $from through $stroke {
   @for $j from $from through $stroke {
      $shadow: append($shadow, $i*1px $j*1px 0 $color, comma);
    }
  }
  @return $shadow;
}
/// Stroke font-character
/// @param  {Integer} $stroke - Stroke width
/// @param  {Color}   $color  - Stroke color
/// @return {Style}           - text-shadow
@mixin stroke($stroke, $color) {
  text-shadow: stroke($stroke, $color);
}

ป้อนคำอธิบายรูปภาพที่นี่

ใช่คำถามเก่า .. พร้อมคำตอบที่ยอมรับ (และดี) ..

แต่ ... ในกรณีที่ทุกคนต้องการและเกลียดการพิมพ์รหัส ...

นี่เป็นขอบสีดำขนาด 2px พร้อมการสนับสนุน CrossBrowser (ไม่ใช่ IE) ฉันต้องการสิ่งนี้สำหรับแบบอักษร @fontface ดังนั้นมันจึงต้องสะอาดกว่าคำตอบที่เห็นก่อนหน้านี้ ... ฉันใช้ทุก ๆ ด้านเพื่อให้แน่ใจว่ามีช่องว่าง (เกือบ) ฟัซซี่ "(วาดด้วยมือหรือคล้ายกัน) แบบอักษร สามารถเพิ่ม Subpixels (0.5px) ได้ แต่ฉันไม่ต้องการ

รหัสยาวสำหรับชายแดน ...ใช่!!!

text-shadow: 1px 1px 0 #000,
    -1px 1px 0 #000,
    1px -1px 0 #000,
    -1px -1px 0 #000,
    0px 1px 0 #000,
    0px -1px 0 #000,
    -1px 0px 0 #000,
    1px 0px 0 #000,
    2px 2px 0 #000,
    -2px 2px 0 #000,
    2px -2px 0 #000,
    -2px -2px 0 #000,
    0px 2px 0 #000,
    0px -2px 0 #000,
    -2px 0px 0 #000,
    2px 0px 0 #000,
    1px 2px 0 #000,
    -1px 2px 0 #000,
    1px -2px 0 #000,
    -1px -2px 0 #000,
    2px 1px 0 #000,
    -2px 1px 0 #000,
    2px -1px 0 #000,
    -2px -1px 0 #000;

อัปเดตรหัสเนื่องจากซ้ำซ้อนกับ 0 2px 0 # 000 และเป็น - / + องค์ประกอบ เบลอ (0 ก่อน # 000) สามารถลบออกได้ แต่ฉันมักจะเก็บไว้แม้ว่ามันจะเป็น 0 ฉันควรทราบด้วยว่าขอแนะนำให้ใช้โค้ด CSS ของคุณแบบย่อหรือบีบอัดบนไซต์ที่ใช้งานจริงและเก็บเวอร์ชันที่ไม่บีบอัดไว้สำหรับข้อคิดเห็น การตัดต่อ โค้ดด้านบนเป็นตัวอย่างที่ดีว่าทำไมโค้ด CSS ควรมีการย่อขนาด แต่ต้องแยกบรรทัดทีละบรรทัดเพื่อทำการแก้ไข

ฉันเล่นด้วยคุณสมบัติ '-webkit-text-stroke' (ส่วนใหญ่จะทำให้แบบอักษรดูดีกว่าบนหน้าต่าง UGLY UGLY) แต่สิ่งนี้ทำให้เวลาในการโหลดนานเกินไปและทำให้เว็บไซต์ของฉันพัง (mac Chrome 16) ดังนั้นฉันจึงลบมันเร็วกว่าที่หน้าสามารถโหลดได้ ฉันเดาว่านี่มีไว้สำหรับแบบอักษรบรรทัดเดียวเท่านั้น (ฉันใช้มันเป็น 'ร่างกาย')

1
คุณเคยทำการเปรียบเทียบประสิทธิภาพกับสิ่งนี้แล้วหรือยัง? ฉันได้พบเงาข้อความเพื่อทำให้หน้ากระดาษสะดุดเมื่อเลื่อนเช่น
Chris Bosco

1
ฉันพบว่าสิ่งนี้ทำงานได้ดีที่สุดบนพื้นหลังภาพและคำตอบของ @ Narcélio Filho ทำงานได้ดีที่สุดกับพื้นหลังสี
SemanticZen

1
codepen ดั้งเดิม "หายไป" ดังนั้นฉันจึงสร้างขึ้นใหม่ด้วยรหัสต้นฉบับจากโพสต์นี้และทำการเปรียบเทียบโซลูชันอื่น ๆ ที่กล่าวถึงที่นี่codepen.io/Grienauer/pen/GRRdRJr
Grienauer

51

คุณอาจเลียนแบบการลากข้อความโดยใช้ css text-shadow(หรือ-webkit-text-shadow/ -moz-text-shadow) และเบลอต่ำมาก:

#element
{
  text-shadow: 0 0 2px #000; /* horizontal-offset vertical-offset 'blur' colour */
  -moz-text-shadow: 0 0 2px #000;
  -webkit-text-shadow: 0 0 2px #000;
}

แต่ในขณะนี้มีให้บริการมากกว่า-webkit-text-strokeคุณสมบัติฉันสงสัยว่ามันพร้อมใช้งานสำหรับผู้ใช้ส่วนใหญ่ของคุณ แต่นั่นอาจไม่เป็นปัญหา


3
ควรสังเกตว่าเป็นไปได้ที่จะละเว้นอาร์กิวเมนต์ที่สามทั้งหมดเพื่อที่จะไม่เบลอเลย
François Feugeas

23

เพื่ออธิบายรายละเอียดเพิ่มเติมเกี่ยวกับคำตอบบางอย่างที่ได้กล่าวถึง -webkit-text-stroke นี่คือโค้ดที่จะทำให้มันทำงาน:

div {
  -webkit-text-fill-color: black;
  -webkit-text-stroke-color: red;
  -webkit-text-stroke-width: 2.00px; 
}

บทความในเชิงลึกเกี่ยวกับการใช้จังหวะข้อความที่นี่และรายชื่อของเบราว์เซอร์ที่สนับสนุนจังหวะข้อความที่นี่



11

นี่คือสิ่งที่ฉันใช้:

.text_with_1px_border
{
    text-shadow: 
        -1px -1px 0px #000,
         0px -1px 0px #000,
         1px -1px 0px #000,
        -1px  0px 0px #000,
         1px  0px 0px #000,
        -1px  1px 0px #000,
         0px  1px 0px #000,
         1px  1px 0px #000;
}

.text_with_2px_border
{
    text-shadow: 
        /* first layer at 1px */
        -1px -1px 0px #000,
         0px -1px 0px #000,
         1px -1px 0px #000,
        -1px  0px 0px #000,
         1px  0px 0px #000,
        -1px  1px 0px #000,
         0px  1px 0px #000,
         1px  1px 0px #000,
        /* second layer at 2px */
        -2px -2px 0px #000,
        -1px -2px 0px #000,
         0px -2px 0px #000,
         1px -2px 0px #000,
         2px -2px 0px #000,
         2px -1px 0px #000,
         2px  0px 0px #000,
         2px  1px 0px #000,
         2px  2px 0px #000,
         1px  2px 0px #000,
         0px  2px 0px #000,
        -1px  2px 0px #000,
        -2px  2px 0px #000,
        -2px  1px 0px #000,
        -2px  0px 0px #000,
        -2px -1px 0px #000;
}

2

ตัวอักษรจังหวะตัวอักษรที่มี mixin น้อย

นี่คือ LESS mixin เพื่อสร้างจังหวะ: http://codepen.io/anon/pen/BNYGBy?editors=110

/// Stroke font-character
/// @param  {Integer} $stroke - Stroke width
/// @param  {Color}   $color  - Stroke color
/// @return {List}            - text-shadow list
.stroke(@stroke, @color) {
  @maxi: @stroke + 1;
  .i-loop (@i) when (@i > 0) {
    @maxj: @stroke + 1;
    .j-loop (@j) when (@j > 0) {
      text-shadow+: (@i - 1)*(1px)  (@j - 1)*(1px) 0 @color;
      text-shadow+: (@i - 1)*(1px)  (@j - 1)*(-1px) 0 @color;
      text-shadow+: (@i - 1)*(-1px)  (@j - 1)*(-1px) 0 @color;
      text-shadow+: (@i - 1)*(-1px)  (@j - 1)*(1px) 0 @color;
      .j-loop(@j - 1);
    }
    .j-loop (0) {}
    .j-loop(@maxj);
    .i-loop(@i - 1);
  }
  .i-loop (0) {}
  .i-loop(@maxi);
  text-shadow+: 0 0 0 @color;
}

(ขึ้นอยู่กับคำตอบ pixelass ที่ใช้ SCSS แทน)



1

ฉันสร้างการเปรียบเทียบโซลูชันทั้งหมดที่กล่าวถึงที่นี่เพื่อให้มีภาพรวมอย่างรวดเร็ว:

<h1>with mixin</h1>
<h2>with text-shadow</h2>
<h3>with css text-stroke-width</h3>

https://codepen.io/Grienauer/pen/GRRdRJr


0

ฉันเคยลองทำมุมรอบเหล่านั้นและวางเงาด้วย css3 ต่อมาฉันพบว่ายังรองรับได้ไม่ดี (แน่นอน! Internet Explorer)

ฉันลงเอยด้วยการพยายามทำเช่นนั้นใน JS (ผ้าใบ HTML กับ IE Canvas) แต่มันส่งผลกระทบต่อประสิทธิภาพเป็นอย่างมาก (แม้ในเครื่อง C2D ของฉัน) ในระยะสั้นหากคุณต้องการผลกระทบจริงๆให้พิจารณาไลบรารี JS (ส่วนใหญ่ควรจะสามารถทำงานบน IE6 ได้) แต่อย่าทำมากเกินไปเนื่องจากปัญหาด้านประสิทธิภาพ หากคุณยังต้องการทางเลือก ... คุณสามารถใช้ SFiR ได้จากนั้นใช้ PS และ SFiR CSS3 ไม่พร้อมในวันนี้


0

ขออภัยฉันช้า แต่พูดถึง text-shadow ฉันคิดว่าคุณจะชอบตัวอย่างนี้ด้วย (ฉันใช้บ่อยเมื่อต้องการเงาที่ดีกับข้อความ):

                    text-shadow: -2px   -2px lightblue,
                                 -2px -1.5px lightblue,
                                 -2px   -1px lightblue,
                                 -2px -0.5px lightblue,
                                 -2px    0px lightblue,
                                 -2px  0.5px lightblue,
                                 -2px    1px lightblue,
                                 -2px  1.5px lightblue,
                                 -2px    2px lightblue,
                               -1.5px    2px lightblue,
                                 -1px    2px lightblue,
                               -0.5px    2px lightblue,
                                  0px    2px lightblue,
                                0.5px    2px lightblue,
                                  1px    2px lightblue,
                                1.5px    2px lightblue,
                                  2px    2px lightblue,
                                  2px  1.5px lightblue,
                                  2px    1px lightblue,
                                  2px  0.5px lightblue,
                                  2px    0px lightblue,
                                  2px -0.5px lightblue,
                                  2px   -1px lightblue,
                                  2px -1.5px lightblue,
                                  2px   -2px lightblue,
                                1.5px   -2px lightblue,
                                  1px   -2px lightblue,
                                0.5px   -2px lightblue,
                                  0px   -2px lightblue,
                               -0.5px   -2px lightblue,
                                 -1px   -2px lightblue,
                               -1.5px   -2px lightblue;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.