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?


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,

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).


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.


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");
}

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');
}

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.


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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.