Jak dodać wiele plików czcionek dla tej samej czcionki?

454

Patrzę na stronę MDC dla reguły CSS @ font-face , ale nic nie rozumiem. Mam osobne pliki dla pogrubienia , kursywy i pogrubienia + kursywy . Jak osadzić wszystkie trzy pliki w jednej @font-faceregule? Na przykład, jeśli mam:

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

Przeglądarka nie będzie wiedziała, która czcionka ma być pogrubiona (ponieważ ten plik to DejaVuSansBold.ttf), więc domyślnie wybierze coś, czego prawdopodobnie nie chcę. Jak mogę powiedzieć przeglądarce, że mam różne warianty dla określonej czcionki?

Felix
źródło
Jako rozszerzenie pytania, czy używamy tych czcionek w edytorach WYSIWYG, takich jak TinyMCE, czy nadal potrzebujemy pogrubionej kursywy? Pomimo, że TinyMCE ma pośladki do wykonania Bold Italics? Zgaduję, że odpowiedź brzmi TAK - ponieważ między nimi szukają tych plików?
Nishant,
możliwy duplikat Jak scalać czcionki?
user2284570,

Odpowiedzi:

749

Wydaje się, że rozwiązaniem jest dodanie wielu @font-facereguł, na przykład:

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

Nawiasem mówiąc, wygląda na to, że Google Chrome nie wie o tym format("ttf")argumencie, więc możesz to pominąć.

(Ta odpowiedź była poprawna dla CSS 2 specyfikacji. CSS3 pozwala tylko na jeden font-style zamiast listy oddzielonych przecinkami).

Felix
źródło
130
Kolejność jest ważna, pogrubienie / kursywą musi być ostatnia.
The Who
8
Warto zauważyć, że nie działa to w IE8 (i poniżej), nawet jeśli używasz EOT. IE pobierze alternatywny krój pisma, ale nie będzie go używał, zamiast tego będzie fake-bold / kursywa zwykłego kroju pisma. Poza tym Chrome 11 nie wyświetla czcionki pogrubionej i pochylonej
JaffaTheCake
2
Ten przykład działa idealnie dla czcionek, które mają osobny plik TTF dla pogrubienia i kursywy. Ale co, jeśli cała czcionka znajduje się w jednym pliku .ttf i chcesz użyć pogrubienia, jak to działa?
2
Ten artykuł świetnie się tłumaczy, dlaczego to działa. Kluczowy fragment: „Zauważ, że właściwość rodziny czcionek ma taką samą nazwę dla wszystkich czterech czcionek. Styl czcionki i jej grubość odpowiadają czcionce. Uwaga: Normalna grubość musi znajdować się na górze listy! Nie stwierdziliśmy, że kolejność ma znaczenie. ”
JD Smith,
13
Miałem problem z tym wyciętym na wbudowanej przeglądarce Androida 4.4. Skończyło się na zmianie, font-style: italic, oblique;aby po prostu font-style: italic;wszystko naprawić.
Xavi
59

Począwszy od CSS3, specyfikacja uległa zmianie, dopuszczając tylko jeden font-style. Lista oddzielona przecinkami (według CSS2) będzie traktowana tak, jakby była normali zastąpi każdy wcześniejszy (domyślny) wpis. Spowoduje to, że zdefiniowane w ten sposób czcionki będą stale wyświetlane kursywą.

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

W większości przypadków kursywą będzie prawdopodobnie wystarczająca, a ukośne reguły nie będą konieczne, jeśli zadbasz o to, aby określić, którego z nich będziesz używać i trzymać się tego.

Josiah
źródło
Wydaje mi się, że trzecia i czwarta czcionka mają niepoprawną nazwę, powinny mieć „Kursywa” zamiast „Oblique”.
Nathan Merrill
3
@NathanMerrill as by OP: I have separate files for bold, italic and bold + italic- więc są trzy różne pliki. Ta odpowiedź poprawia zaakceptowaną, ponieważ font-style: italic, oblique;nie jest już ważna, ale również ta odpowiedź używała tego samego pliku dla kursywy i ukośnego. Warto jednak zaznaczyć, że plik jest udostępniany w dwóch przypadkach.
Silly Freak
18

Aby wariacja czcionek działała poprawnie, musiałem odwrócić kolejność @ font-face w 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");
}
Cedric Simon
źródło
Bardzo przydatne. +1
Mr. Polywhirl
Co rozumiesz przez „odwrócenie kolejności” ?
Nyxynyx
15

obecnie, 17.12.2017. Nie znalazłem żadnego opisu na temat konieczności zamówienia właściwości-czcionki w specyfikacji . I testuję w chrome zawsze działa niezależnie od kolejności.

@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');
}
xlaoyu.Lee
źródło
13

Jeśli używasz czcionek Google, sugeruję następujące.

Jeśli chcesz, aby czcionki działały z lokalnego hosta lub serwera, musisz pobrać pliki.

Zamiast pobierać pakiety ttf z linków do pobierania, użyj linku na żywo, który podają, na przykład:

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

Wklej adres URL w przeglądarce, a powinieneś otrzymać deklarację czcionki podobną do pierwszej odpowiedzi.

Otwórz podane adresy URL, pobierz pliki i zmień ich nazwę.

Przyklej zaktualizowane deklaracje czcionek za pomocą względnych ścieżek do plików woff w swoim CSS i gotowe.

Dieter Gribnitz
źródło
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;
}
Jerry T.
źródło
1

Nie zapominaj, że jest to odważny wariant font-weight; dla wariantu kursywy jest tofont-style

Ooker
źródło
Nie bardzo związany z problemem @font-face, więc staram się głosować za odpowiedzią (ale nie mogę, nie mam wystarczającej reputacji)
FryingggPannn
tak, to nie jest odpowiedź na pytanie, ale warto pamiętać o stosowaniu odpowiedzi. Problem polega na tym, że sekcja komentarzy w odpowiedzi ma już wiele, więc ta wskazówka zostałaby pochowana
Ooker
Ok, więc nie wiedziałem o tym
FryingggPannn