Làm thế nào để thêm nhiều tập tin phông chữ cho cùng một phông chữ?


454

Tôi đang xem trang MDC để biết quy tắc CSS @ font-face , nhưng tôi không nhận được một điều. Tôi có các tệp riêng biệt cho đậm , in nghiêng in đậm + in nghiêng . Làm cách nào tôi có thể nhúng cả ba tệp trong một@font-facequy tắc? Ví dụ: nếu tôi có:

@font-face {
    font-family: "DejaVu Sans";
    src: url("./fonts/DejaVuSans.ttf") format("ttf");
}
strong {
    font-family: "DejaVu Sans";
    font-weight: bold;
}

Trình duyệt sẽ không biết phông chữ nào được sử dụng để in đậm (vì tệp đó là DejaVuSansBold.ttf), vì vậy nó sẽ mặc định là thứ tôi có thể không muốn. Làm cách nào tôi có thể nói với trình duyệt tất cả các biến thể khác nhau mà tôi có cho một phông chữ nhất định?


Là một phần mở rộng cho câu hỏi nếu chúng ta sử dụng các phông chữ này trong các trình soạn thảo WYSIWYG như TinyMCE, chúng ta có còn cần Chữ in đậm không? Mặc dù TinyMCE có mông để làm chữ in đậm? Câu trả lời đoán của tôi là CÓ - bởi vì bên trong họ tìm kiếm các tệp này?
Nishant

Câu trả lời:


749

Giải pháp dường như là thêm nhiều @font-facequy tắc, ví dụ:

@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans.ttf");
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Bold.ttf");
    font-weight: bold;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Oblique.ttf");
    font-style: italic, oblique;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-BoldOblique.ttf");
    font-weight: bold;
    font-style: italic, oblique;
}

Nhân tiện, có vẻ như Google Chrome không biết về format("ttf") đối số, vì vậy bạn có thể muốn bỏ qua điều đó.

(Câu trả lời này là chính xác cho đặc tả CSS 2. CSS3 chỉ cho phép một kiểu phông chữ thay vì danh sách được phân tách bằng dấu phẩy.)


130
Thứ tự là quan trọng, phong cách in đậm / in nghiêng phải đến cuối cùng.
Ai là

8
Đáng lưu ý rằng điều này không hoạt động trong IE8 (và bên dưới), ngay cả khi bạn sử dụng EOT. IE sẽ tải xuống kiểu chữ thay thế, nhưng nó sẽ không sử dụng nó, thay vào đó nó sẽ in đậm / in nghiêng kiểu chữ thông thường. Ngoài ra, Chrome 11 dường như không thể hiển thị một kiểu chữ vừa in đậm vừa in nghiêng
JaffaTheCake

2
Ví dụ này hoạt động hoàn hảo cho các phông chữ có tệp TTF riêng cho đậm và in nghiêng. Nhưng nếu toàn bộ phông chữ nằm trong một tệp .ttf và bạn muốn sử dụng đậm, thì nó hoạt động như thế nào?

2
Bài viết này làm một công việc tuyệt vời giải thích lý do tại sao điều này làm việc. Trích đoạn chính: "Lưu ý rằng thuộc tính họ phông chữ là cùng tên cho cả bốn phông chữ. Ngoài ra, kiểu phông chữ và trọng lượng phông chữ phù hợp với phông chữ là gì. Lưu ý: Trọng lượng bình thường phải ở đầu danh sách! Chúng tôi đã không tìm thấy thứ tự sau vấn đề đó. "
JD Smith

13
Tôi đã gặp sự cố với việc này bị bắn tỉa trên trình duyệt nhúng Android 4.4. Đã kết thúc thay đổi font-style: italic, oblique;chỉ font-style: italic;để sửa chữa mọi thứ.
Xavi

59

Kể từ CSS3, thông số kỹ thuật đã thay đổi, chỉ cho phép một lần duy nhất font-style. Một danh sách được phân tách bằng dấu phẩy (theo CSS2) sẽ được xử lý như thể nó normalvà ghi đè bất kỳ mục nhập (mặc định) nào trước đó. Điều này sẽ làm cho các phông chữ được xác định theo cách này xuất hiện in nghiêng vĩnh viễn.

@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans.ttf");
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Bold.ttf");
    font-weight: bold;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Oblique.ttf");
    font-style: italic;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-BoldOblique.ttf");
    font-weight: bold;
    font-style: italic;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-Oblique.ttf");
    font-style: oblique;
}
@font-face {
    font-family: "DejaVu Sans";
    src: url("fonts/DejaVuSans-BoldOblique.ttf");
    font-weight: bold;
    font-style: oblique;
}

Trong hầu hết các trường hợp, chữ nghiêng có thể sẽ đủ và các quy tắc xiên sẽ không cần thiết nếu bạn cẩn thận xác định bất cứ thứ gì bạn sẽ sử dụng và tuân theo nó.


Tôi tin rằng phông chữ thứ ba và thứ tư được đặt tên sai, chúng nên có chữ "In nghiêng" thay vì "Xiên".
Nathan Merrill

3
@NathanMerrill như của OP: I have separate files for bold, italic and bold + italic- vì vậy có ba tệp khác nhau. Câu trả lời này sửa câu được chấp nhận trong đó font-style: italic, oblique;không còn hợp lệ, nhưng câu trả lời đó đã sử dụng cùng một tệp cho chữ nghiêng và xiên. Tuy nhiên, giá trị chỉ ra rằng các tập tin được chia sẻ trong hai trường hợp.
Silly Freak

18

Để biến thể phông chữ hoạt động chính xác, tôi đã phải đảo ngược thứ tự của @ font-face trong CSS.

@font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono-BoldOblique.ttf");
    font-weight: bold;
    font-style: italic, oblique;
}   
@font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono-Oblique.ttf");
    font-style: italic, oblique;
}
@font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono-Bold.ttf");
    font-weight: bold;
}
 @font-face {
    font-family: "DejaVuMono";
    src: url("styles/DejaVuSansMono.ttf");
}

Rất hữu ích. +1
Ông Polywhirl

Bạn có ý nghĩa gì khi "đảo ngược trật tự" ?
Nyxynyx

15

ngày nay, 2017-12-17. Tôi không tìm thấy bất kỳ mô tả nào về sự cần thiết của Font-property-order trong spec . Và tôi kiểm tra trong chrome luôn hoạt động bất kể thứ tự là gì.

@font-face {
  font-family: 'Font Awesome 5 Free';
  font-weight: 900;
  src: url('#{$fa-font-path}/fa-solid-900.eot');
  src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
  url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
  url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
  url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
  url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
}

@font-face {
  font-family: 'Font Awesome 5 Free';
  font-weight: 400;
  src: url('#{$fa-font-path}/fa-regular-400.eot');
  src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
  url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
  url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
  url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
  url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
}

13

Nếu bạn đang sử dụng phông chữ của Google, tôi sẽ đề xuất như sau.

Nếu bạn muốn các phông chữ chạy từ localhost hoặc máy chủ của bạn, bạn cần tải xuống các tệp.

Thay vì tải xuống các gói ttf trong các liên kết tải xuống, hãy sử dụng liên kết trực tiếp mà họ cung cấp, ví dụ:

http://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,300italic,400italic,600italic

Dán URL trong trình duyệt của bạn và bạn sẽ nhận được một tuyên bố mặt phông chữ tương tự như câu trả lời đầu tiên.

Mở các URL được cung cấp, tải xuống và đổi tên các tập tin.

Dán các khai báo mặt phông chữ được cập nhật với các đường dẫn tương đối vào các tệp woff trong CSS của bạn và bạn đã hoàn thành.


3
/*
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# dejavu sans
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
/*default version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans.ttf'); /* IE9 Compat Modes */
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'), /* Duplicated name with hyphen */
        url('dejavu/DejaVuSans.ttf') 
        format('truetype');
}
/*bold version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans-Bold.ttf'); 
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'),
        url('dejavu/DejaVuSans-Bold.ttf') 
        format('truetype');
    font-weight: bold;
}
/*italic version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans-Oblique.ttf'); 
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'),
        url('dejavu/DejaVuSans-Oblique.ttf') 
        format('truetype');
    font-style: italic;
}
/*bold italic version*/
@font-face {
    font-family: 'DejaVu Sans';
    src: url('dejavu/DejaVuSans-BoldOblique.ttf'); 
    src: 
        local('DejaVu Sans'),
        local('DejaVu-Sans'),
        url('dejavu/DejaVuSans-BoldOblique.ttf') 
        format('truetype');
    font-weight: bold;
    font-style: italic;
}

1

Đừng quên rằng đối với biến thể táo bạo, nó là font-weight; đối với biến thể in nghiêng, nó làfont-style


Không liên quan nhiều đến vấn đề và @font-face, vì vậy tôi đang cố gắng hạ thấp câu trả lời này (nhưng tôi không thể, tôi không có đủ danh tiếng)
FryingggPannn

vâng, nó không phải là một câu trả lời cho câu hỏi, nhưng là một điều tốt để nhớ khi áp dụng các câu trả lời. Vấn đề là phần bình luận của câu trả lời đã có rất nhiều, vì vậy mẹo này sẽ bị chôn vùi
Ooker

Ok sau đó tôi đã không biết rằng
FryingggPannn
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.