¿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?


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

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


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.


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

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

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


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

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.