Phông chữ CSS?


491

Với tất cả các công cụ viền CSS3 mới đang diễn ra ( -webkit, ...), giờ đây có thể thêm đường viền vào phông chữ của bạn không? (Giống như đường viền màu trắng xung quanh logo Twitter màu xanh). Nếu không, có bất kỳ hack không quá xấu nào sẽ thực hiện điều này trong CSS / XHTML hay tôi vẫn cần phải kích hoạt Photoshop?

Câu trả lời:


1004

Có một thuộc tính CSS thử nghiệm được gọi là đột quỵ văn bản , được hỗ trợ trên một số trình duyệt đằng sau tiền tố -webkit .

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

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

Một mẹo có thể khác là sử dụng bốn bóng, mỗi pixel cho mỗi hướng, sử dụng thuộc tính 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>

Nhưng nó sẽ bị mờ với độ dày hơn 1 pixel.


4
này làm việc cho tôi pefrectly, tôi thêm vào chỉ 1px "mờ": text-shadow: -1px 0 1px màu đen, 0 1px 1px màu đen, 1px 0 1px màu đen, 0 -1px 1px màu đen
Jakub M.

84
tuyệt vời nếu bạn chỉ cần đường viền 1px. Nhưng nó trở nên xấu xí khi sử dụng 2px trở lên.
Jules Colle

2
Lưu ý: có một lỗi với trình duyệt Andriod ( code.google.com/p/android/issues/detail?id=7531 ), nếu bạn đặt "làm mờ" thành 0px, thì không có đường viền nào xuất hiện cả.
Mark Rhodes

1
btw, bạn có thể tìm thấy mã này trong trang mẹo W3C CSS w3.org/Style/Examples/007/text-shadow.en.html (dưới DRAWING LETTERS AS OUTLINESphần)
luiges90

Tôi đã thấy điều này hoạt động tốt nhất trên nền màu và câu trả lời của @ pixelass hoạt động tốt nhất với nền hình ảnh
SemanticZen

151

CẬP NHẬT

Đây là một mixin SCSS để tạo đột quỵ: 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);
}

nhập mô tả hình ảnh ở đây

CÓ câu hỏi cũ .. với câu trả lời được chấp nhận (và tốt) ..

NHƯNG ... Trong trường hợp bất cứ ai cũng cần điều này và ghét gõ mã ...

ĐÂY là viền đen 2px có hỗ trợ CrossBrowser (không phải IE) Tôi cần điều này cho phông chữ @fontface để nó cần sạch hơn các câu trả lời đã thấy trước đó ... Tôi lấy mọi mặt theo chiều dọc để đảm bảo không có khoảng trống nào cho " phông chữ mờ "(vẽ tay hoặc tương tự). Subpixels (0,5px) có thể được thêm nhưng tôi không cần nó.

Mã dài cho chỉ biên giới ??? ...ĐÚNG!!!

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;

đã cập nhật mã do trùng lặp 0 2px 0 # 000 và các phần tử - / +. Có thể xóa mờ (0 trước # 000) nhưng tôi có xu hướng giữ nó ngay cả khi nó bằng 0. Tôi cũng cần lưu ý rằng nên có phiên bản CSS được rút gọn hoặc nén của mã trên các trang web sản xuất và giữ phiên bản không nén được nhận xét cho chỉnh sửa. Mã ở trên là một ví dụ tốt về lý do tại sao mã CSS nên được thu nhỏ nhưng cần được phân tách từng dòng để chỉnh sửa.

Tôi đã chơi xung quanh với thuộc tính '-webkit-text-Stro' (chủ yếu để làm cho phông chữ trông đẹp hơn trên các cửa sổ UGLY UGLY) Tuy nhiên, điều này khiến thời gian tải quá lâu và thậm chí làm sập trang web của tôi (mac Chrome 16). Vì vậy, tôi loại bỏ nó nhanh hơn trang thậm chí có thể tải. Tôi đoán điều này chỉ dành cho các dòng phông chữ duy nhất. (Tôi đã sử dụng nó cho 'cơ thể')

1
Bạn đã thực hiện bất kỳ điểm chuẩn hiệu suất với điều này? Tôi đã tìm thấy bóng văn bản để làm hỏng trang khi cuộn, chẳng hạn
Chris Bosco

1
Tôi đã tìm thấy điều này hoạt động tốt nhất trên nền hình ảnh và câu trả lời của @ Narcélio Filho hoạt động tốt nhất với nền màu
SemanticZen

1
codepen ban đầu "biến mất", vì vậy tôi đã tạo một cái mới với mã gốc từ bài đăng này và cũng đã so sánh các giải pháp khác được đề cập ở đây codepen.io/Grienauer/pen/GRRdRJr
Grienauer

51

Bạn có thể có thể mô phỏng một nét chữ, sử dụng css text-shadow(hoặc -webkit-text-shadow/ -moz-text-shadow) và độ mờ rất thấp:

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

Nhưng mặc dù điều này có sẵn rộng rãi hơn -webkit-text-stroketài sản, tôi nghi ngờ rằng nó có sẵn cho phần lớn người dùng của bạn, nhưng đó có thể không phải là vấn đề (xuống cấp duyên dáng, và tất cả điều đó).


3
Cần lưu ý rằng có thể bỏ hoàn toàn đối số thứ ba để không bị mờ đi chút nào.
François Feugeas

23

Để giải thích thêm về một số câu trả lời đã đề cập -webkit-text-Stro, đây là mã để làm cho nó hoạt động:

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

Một bài viết chuyên sâu về việc sử dụng đột quỵ văn bản có ở đây và một danh sách các trình duyệt hỗ trợ đột quỵ văn bản ở đây .



11

Đây là những gì tôi đang sử dụng:

.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

Phông chữ đột quỵ với ít mixin

Đây là một mixin LESS để tạo đột quỵ: 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;
}

(dựa trên câu trả lời pixelass thay vì sử dụng SCSS)




0

Tôi đã từng thử làm những góc tròn đó và thả bóng với css3. Sau này, tôi thấy nó vẫn được hỗ trợ kém (tất nhiên là Internet Explorer (s)!)

Cuối cùng tôi đã cố gắng làm điều đó trong JS (HTML canvas với IE Canvas), nhưng nó ảnh hưởng đến hiệu suất rất nhiều (ngay cả trên máy C2D của tôi). Nói tóm lại, nếu bạn thực sự cần hiệu ứng, hãy xem xét các thư viện JS (hầu hết trong số chúng sẽ có thể chạy trên IE6) nhưng đừng làm quá vì vấn đề hiệu năng; nếu bạn vẫn cần một giải pháp thay thế ... bạn có thể sử dụng SFiR, sau đó PS nó và SFiR nó. CSS3 chưa sẵn sàng ngày hôm nay.


0

Xin lỗi tôi đến trễ, nhưng nói về bóng văn bản, tôi nghĩ bạn cũng sẽ thích ví dụ này (tôi sử dụng nó khá thường xuyên khi tôi cần bóng tốt trên văn bản):

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