¿Cómo agregar múltiples archivos de fuente para la misma fuente?

454

Estoy buscando en la página de MDC la regla CSS @ font-face , pero no entiendo nada. Tengo archivos separados para negrita , cursiva y negrita + cursiva . ¿Cómo puedo incrustar los tres archivos en una @font-faceregla? Por ejemplo, si tengo:

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

El navegador no sabrá qué fuente se utilizará para negrita (porque ese archivo es DejaVuSansBold.ttf), por lo que tendrá un valor predeterminado que probablemente no quiera. ¿Cómo puedo decirle al navegador todas las diferentes variantes que tengo para una determinada fuente?

Felix
fuente
Como extensión de la pregunta, si usamos estas fuentes en editores WYSIWYG como TinyMCE, ¿todavía necesitamos las letras en negrita? ¿A pesar de que TinyMCE tiene que hacer Bold Italics? Mi respuesta es un SÍ, ¿porque buscan estos archivos de forma interna?
Nishant
posible duplicado de ¿Cómo fusionar fuentes?
user2284570

Respuestas:

749

La solución parece ser agregar varias @font-facereglas, por ejemplo:

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

Por cierto, parece que Google Chrome no conoce el format("ttf")argumento, por lo que es posible que desee omitirlo.

(Esta respuesta fue correcta para la especificación CSS 2. CSS3 solo permite un estilo de fuente en lugar de una lista separada por comas).

Felix
fuente
130
El orden es importante, el estilo en negrita / cursiva debe ser el último.
The Who
8
Vale la pena señalar que esto no funciona en IE8 (y a continuación), incluso si usa un EOT. IE descargará el tipo de letra alternativo, pero no lo usará, sino que pondrá en negrita / cursiva el tipo de letra normal. Además, Chrome 11 parece fallar al procesar un tipo de letra en negrita y cursiva
JaffaTheCake 05 de
2
Este ejemplo funciona perfecto para fuentes que tienen un archivo TTF separado para negrita y cursiva. Pero, ¿qué pasa si toda la fuente está en un archivo .ttf y desea usar negrita, cómo funciona?
2
Este artículo hace un gran trabajo explicando por qué esto funciona. Extracto clave: "Observe que la propiedad de familia de fuentes es el mismo nombre para las cuatro fuentes. Además, el estilo de fuente y el peso de fuente coinciden con la fuente. Nota: ¡El peso normal debe estar en la parte superior de la lista! No hemos encontrado que el orden después de eso importe ".
JD Smith
13
Estaba teniendo problemas con esto cortado en el navegador integrado Android 4.4. Terminé cambiando font-style: italic, oblique;a solo font-style: italic;parecía arreglarlo todo.
Xavi
59

A partir de CSS3, la especificación ha cambiado, permitiendo solo uno font-style. Una lista separada por comas (por CSS2) se tratará como si fuera normaly anulará cualquier entrada anterior (predeterminada). Esto hará que las fuentes definidas de esta manera aparezcan en cursiva de forma permanente.

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

En la mayoría de los casos, la cursiva probablemente será suficiente y las reglas oblicuas no serán necesarias si tiene cuidado de definir lo que va a utilizar y cumplirlo.

Josiah
fuente
Creo que las fuentes tercera y cuarta tienen un nombre incorrecto, deberían tener "cursiva" en lugar de "oblicua".
Nathan Merrill el
3
@NathanMerrill según OP: I have separate files for bold, italic and bold + italic- así que hay tres archivos diferentes. Esta respuesta corrige la aceptada en que font-style: italic, oblique;ya no es válida, pero también esa respuesta usó el mismo archivo para cursiva y oblicua. Aún así, vale la pena señalar que el archivo se comparte en dos casos.
Silly Freak
18

Para que la variación de fuente funcione correctamente, tuve que invertir el orden de @ font-face en 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
fuente
Muy útil. +1
Sr. Polywhirl
¿Qué quieres decir con "invertir el orden" ?
Nyxynyx
15

hoy en día, 2017-12-17. No encuentro ninguna descripción sobre la necesidad de Font-property-order en la especificación . Y pruebo en Chrome siempre funciona sea cual sea el orden.

@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
fuente
13

Si está utilizando las fuentes de Google, sugeriría lo siguiente.

Si desea que las fuentes se ejecuten desde su servidor local o servidor, debe descargar los archivos.

En lugar de descargar los paquetes ttf en los enlaces de descarga, use el enlace en vivo que proporcionan, por ejemplo:

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

Pegue la URL en su navegador y debería obtener una declaración de tipo de letra similar a la primera respuesta.

Abra las URL proporcionadas, descargue y cambie el nombre de los archivos.

Pegue las declaraciones actualizadas de la fuente con rutas relativas a los archivos woff en su CSS, y ya está.

Dieter Gribnitz
fuente
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
fuente
1

No olvide que para la variante en negrita, lo es font-weight; para la variante cursiva, esfont-style

Ooker
fuente
No estoy muy relacionado con el problema y @font-face, por lo tanto, estoy tratando de rechazar esta respuesta (pero no puedo, no tengo suficiente reputación)
FryingggPannn
Sí, no es una respuesta a la pregunta, pero es algo bueno para recordar al aplicar las respuestas. El problema es que la sección de comentarios de la respuesta ya tiene muchos, por lo que este consejo sería enterrado
Ooker
Ok, entonces no sabía eso
FryingggPannn