Introduccion


Asignar propiedades de fuente de plataforma a propiedades CSS


Este apéndice se incluye como antecedentes para algunos de los problemas y situaciones que se describen en otras secciones. Debe verse solo como informativo. Las propiedades de fuente en CSS están diseñadas para ser independientes de los formatos de fuente subyacentes utilizados; se pueden usar para especificar fuentes de mapa de bits, fuentes Type1, fuentes SVG además de las fuentes comunes TrueType y OpenType. Pero hay facetas de los formatos TrueType y OpenType que a menudo causan confusión para los autores y presentan desafíos para los implementadores en diferentes plataformas.





Originalmente desarrollado en Apple, TrueType fue diseñado como un formato de fuente de contorno para pantalla e impresión. Microsoft se unió a Apple en el desarrollo del formato TrueType y ambas plataformas han sido compatibles con las fuentes TrueType desde entonces. Los datos de fuentes en el formato TrueType constan de un conjunto de tablas que se distinguen por nombres comunes de etiquetas de cuatro letras, cada una con un tipo específico de datos. Por ejemplo, la información de nombres, incluidos los derechos de autor y la información de la licencia, se almacena en la nametabla ' '. El mapa de caracteres ('cmap') tabla contiene un mapeo de codificaciones de caracteres a glifos. Apple luego agregó tablas adicionales para soportar la funcionalidad tipográfica mejorada; ahora se llaman tipos de Apple Advanced Typography, o AAT. Microsoft y Adobe desarrollaron un conjunto separado de tablas para la tipografía avanzada y llamaron a su formato OpenType [OPENTYPE] .

En muchos casos, los datos de fuente utilizados en Microsoft Windows o Linux son ligeramente diferentes de los datos utilizados en Mac OS X de Apple porque el formato TrueType permite una variación explícita en todas las plataformas. Esto incluye métricas de fuentes, nombres y datos de mapas de caracteres


Específicamente, los datos del nombre de la familia de fuentes se manejan de forma diferente en todas las plataformas. Para las fuentes TrueType y OpenType, estos nombres están incluidos en la nametabla ' ', en registros de nombres con nombre ID 1. Se pueden almacenar múltiples nombres para diferentes configuraciones regionales, pero Microsoft recomienda que las fuentes siempre incluyan al menos una versión del nombre en inglés de EE. UU. En Windows, Microsoft tomó la decisión de compatibilidad con versiones anteriores para limitar este apellido a un máximo de cuatro caras; para agrupaciones más grandes, se puede usar la "familia preferida" (nombre ID 16) o "familia WWS" (nombre ID 21). Otras plataformas como OSX no tienen esta limitación, por lo que el apellido se usa para definir todas las agrupaciones posibles.


Otros datos de la tabla de nombres proporcionan nombres utilizados para identificar de manera única una cara específica dentro de una familia. El nombre completo de la fuente (nombre ID 4) y el nombre PostScript (nombre ID 6) describen una única cara de forma única. Por ejemplo, la negrita de la familia Gill Sans tiene un nombre completo de "Gill Sans Bold" y un nombre Postscript de "GillSans-Bold". Puede haber múltiples versiones localizadas del nombre completo para una cara determinada, pero el nombre Postscript es siempre un nombre único hecho a partir de un conjunto limitado de caracteres ASCII.


En varias plataformas, se usan diferentes nombres para buscar una fuente. Por ejemplo, con la API Windows GDI CreateIndirectFont, se puede usar una familia o un nombre completo para buscar una cara, mientras que en Mac OS X la llamada a la API CTFontCreateWithName se usa para buscar una cara determinada usando el nombre completo y el nombre Postscript. En Linux, la API fontconfig permite buscar fuentes con cualquiera de estos nombres. En situaciones en las que la plataforma API sustituye automáticamente otras opciones de fuente, puede ser necesario verificar que una fuente devuelta coincida con un nombre dado.


El peso de una cara determinada puede determinarse a través del campo usWeightClass de la tabla OS / 2 o inferirse del nombre de estilo (nombre ID 2). Del mismo modo, el ancho se puede determinar a través de usWidthClass de la tabla OS / 2 o inferirse del nombre del estilo. Por razones históricas relacionadas con el plegado sintético con pesos 200 o inferiores con la API GDI de Windows, los diseñadores de fuentes a veces han sesgado valores en la tabla OS / 2 para evitar estos pesos.


La representación de secuencias de comandos complejas que usan formas contextuales como Thai, Arabic y Devanagari requiere características presentes solo en las fuentes OpenType o AAT. Actualmente, la representación de scripts complejos es compatible con Windows y Linux utilizando las características de fuente OpenType, mientras que las características de fuente OpenType y AAT se utilizan bajo Mac OS X.



Resolución de la función de fuente



Como se describió en la sección anterior, las características de fuente se pueden habilitar de varias maneras, ya sea mediante el uso de ' font-variant' o ' font-feature-settings' en una regla de estilo o dentro de una @font-faceregla. El orden de resolución para la unión de estos ajustes se define a continuación. Las características definidas a través de las propiedades CSS se aplican sobre las funciones predeterminadas del motor de diseño.


Características predeterminadas


Para las fuentes OpenType, los agentes de usuario deben habilitar las características predeterminadas definidas en la documentación de OpenType para una secuencia de comandos y un modo de escritura determinados. Las ligaduras requeridas, las ligaduras comunes y las formas contextuales deben estar habilitadas por defecto (funciones OpenType: rlig, liga, clig, calt ), junto con las formas localizadas (función OpenType: locl ) y las características necesarias para la visualización adecuada de caracteres y marcas compuestos (OpenType características: ccmp, mark, mkmk ). Estas características siempre deben estar habilitadas, incluso cuando el valor de las propiedades ' font-variant' y ' font-feature-settings' es ' normal' . Las características individuales solo se desactivan cuando el autor las anula explícitamente, como cuando 'font-variant-ligatures'está configurado en' no-common-ligatures'. Para manejar scripts complejos como Arabic , Khmer o Devanagari se requieren características adicionales. Para texto vertical dentro de las ejecuciones de texto vertical, las alternativas verticales (función OpenType: vert ) deben estar habilitadas.


Característica de precedencia


  1. La configuración general y la propiedad de la fuente específica de la fuente se resuelven en el siguiente orden, en orden ascendente de precedencia. Este orden se usa para construir una lista combinada de características de fuente que afectan una ejecución de texto dada.

  2. Las características de fuente están habilitadas de forma predeterminada, incluidas las características requeridas para una secuencia de comandos determinada.

  3. Si la fuente se define mediante una @font-faceregla, las características de fuente implícitas en el descriptor variante de fuente en la @font-faceregla.

  4. Si la fuente se define a través de una @font-faceregla, las características de fuente implícitas en el descriptor font-feature-settings en la @font-faceregla.

  5. Las características de fuente implícitas por el valor de la propiedad ' font-variant' , las subpropiedades relacionadas ' font-variant' y cualquier otra propiedad de CSS que use características OpenType (por ejemplo, la ' font-kerning' propiedad).

  6. La configuración de funciones está determinada por propiedades distintas de ' font-variant' o ' font-feature-settings' . Por ejemplo, establecer un valor no predeterminado para la letter-spacingpropiedad ' ' desactiva las ligaduras comunes.

  7. Las características de fuente implícitas por el valor de ' font-feature-settings' propiedad


Características de predeterminadas



Ejemplos de precedencia de características


Con los estilos a continuación, los números se representan proporcionalmente cuando se utilizan dentro de un párrafo, pero se muestran en forma de tabla dentro de las tablas de precios:

 body {
            font-variant-numeric: proportional-nums;
        }

            table.prices td {
            font-variant-numeric: tabular-nums;
        }
        

Cuando el descriptor defont-variant se utiliza dentro de una@font-faceregla, solo se aplica a la fuente definida por esa regla

 @font-face {
              font-family: MainText;
              src: url(http://example.com/font.woff);
              font-variant: oldstyle-nums proportional-nums styleset(1,3);
        }

              body {
              font-family: MainText, Helvetica;
        }

              table.prices td {
              font-variant-numeric: tabular-nums;
        }
        

En este caso, los números de estilo antiguo se usarán en todas partes, pero solo cuando se use la fuente "Texto principal". Al igual que en el ejemplo anterior, los valores tabulares se usarán en tablas de precios‘tabular-nums’ aparece en una regla de estilo general y su uso es mutuamente exclusivo con proportional-nums’Los conjuntos alternativos estilísticos solo se usarán cuando se use MainText.


La @font-faceregla también se puede usar para acceder a las características de fuente en fuentes disponibles localmente mediante el uso de ‘local()’ en el ‘src’ descriptor de la ‘@font-face’definición:

 @font-face {
             font-family: BodyText;
             src: local("HiraMaruPro-W4");
             font-variant: proportional-width;
             font-feature-settings: "ital"; /* Latin italics within CJK text feature */
        }

             body { font-family: BodyText, serif; }


        

Si está disponible, se usará una fuente japonesa "Hiragino Maru Gothic". Cuando se produce la reproducción de texto, el kana japonés se espaciará proporcionalmente y el texto en latín aparecerá en cursiva. El texto procesado con la fuente serif de repliegue utilizará propiedades de representación predeterminadas.


En el siguiente ejemplo, las ligaduras discrecionales solo están habilitadas para una fuente descargable, pero están deshabilitadas dentro de los tramos de la clase "especial":

 @font-face {
             font-family: main;
             src: url(fonts/ffmeta.woff) format("woff");
             font-variant: discretionary-ligatures;
        }

             body         { font-family: main, Helvetica; }
             span.special { font-variant-ligatures: no-discretionary-ligatures; }
        

Supongamos que uno agrega una regla usando ' font-feature-settings' para permitir ligaduras discrecionales:

 body         { font-family: main, Helvetica; }
              span         { font-feature-settings: "dlig"; }
              span.special { font-variant-ligatures: no-discretionary-ligatures; }
        

In this case, discretionary ligatures will be rendered within spans of class "special". This is because both the‘font-feature-settings’ and ‘font-variant-ligatures’ properties apply to these spans. Although the ‘no-discretionary ligatures’ setting of ‘font-variant-ligatures’ effectively disables the OpenType dlig feature, because the‘’ is resolved after that, the ‘dlig’ value reenables discretionary ligatures.


Fuentes de recursos



La @font-faceregla


La @font-face regla permite vincular fuentes que se recuperan automáticamente y se activan cuando es necesario. Esto permite a los autores seleccionar una fuente que coincida estrechamente con los objetivos de diseño para una página determinada en lugar de limitar la elección de la fuente a un conjunto de fuentes disponibles en una plataforma determinada. Un conjunto de descriptores de fuentes define la ubicación de un recurso de fuente, ya sea local o externamente, junto con las características de estilo de una cara individual. Se @font-facepueden usar múltiples reglas para construir familias de fuentes con una variedad de caras. Con las reglas de coincidencia de fuentes CSS, un agente de usuario puede descargar selectivamente solo las caras que se necesitan para una determinada pieza de texto.

La @font-face regla consiste @font-face en la palabra clave at seguida de un bloque de declaraciones del descriptor. En términos de la gramática, esta especificación define las siguientes producciones:


font_face_rule
        : FONT_FACE_SYM S* '{' S* descriptor_declaration? [ ';' S* descriptor_declaration? ]* '}' S*
        ;

        descriptor_declaration
        : property ':' S* expr
        ;

Se introducen las siguientes nuevas definiciones:

-    -|\\0{0,4}2d(\r\n|[ \t\r\n\f])?
        F    f|\\0{0,4}(46|66)(\r\n|[ \t\r\n\f])?

Se introduce el siguiente token nuevo:

@{F}{O}{N}{T}{-}{F}{A}{C}{E} {return FONT_FACE_SYM;}

Cada @font-face regla especifica un valor para cada descriptor de fuente, implícita o explícitamente. Aquellos que no tienen valores explícitos en la regla toman el valor inicial listado con cada descriptor en esta especificación. Estas descripciones se aplican únicamente dentro del contexto de la@font-face regla en la que están definidas, y no se aplican a los elementos del lenguaje del documento. No hay ninguna noción de a qué elementos se aplican las descripciones o si los valores son heredados por elementos secundarios. Cuando un descriptor dado ocurre varias veces en una @font-faceregla determinada , solo se utiliza la última declaración del descriptor y se ignoran todas las declaraciones anteriores para ese descriptor.


Para usar una fuente descargable llamada Gentium

              @font-face {
              font-family: Gentium;
              src: url(http://example.com/fonts/Gentium.woff);
        }

              p { font-family: Gentium, serif; }
        

Un conjunto determinado de@font-facereglas define un conjunto de fuentes disponibles para su uso dentro de los documentos que contienen estas reglas. Cuando se completa la coincidencia de fuentes, las fuentes definidas usando estas reglas se consideran antes que otras fuentes disponibles en un sistema.

Las fuentes descargadas solo están disponibles para los documentos que las referencian. El proceso de activación de estas fuentes no debe ponerlas a disposición de otras aplicaciones o documentos que no se vinculen directamente con la misma fuente. Los implementadores de agentes de usuario pueden considerar conveniente utilizar fuentes descargadas cuando representan caracteres en otros documentos para los que no existe otra fuente disponible como parte del procedimiento de system font fallback Sin embargo, esto causaría una fuga de seguridad ya que el contenido de una página podría afectar otras páginas, algo que un atacante podría usar como un vector de ataque. Estas restricciones no afectan el comportamiento de almacenamiento en caché, las fuentes se almacenan en caché de la misma manera que otros recursos web se almacenan en caché

Esta regla at sigue las reglas de análisis compatibles con versiones anteriores de CSS. Al igual que las propiedades en un bloque de declaración, las declaraciones de cualquier descriptor que no sean compatibles con el agente de usuario deben ignorarse.@font-face las reglas requieren un descriptor de fuente y familia y src; si falta alguno de ellos, la@font-faceregla no se debe considerar cuando se realiza elfont-matching-algorithm.


En los casos en que los agentes de usuario tienen recursos de plataforma limitados o implementan la capacidad de deshabilitar los recursos de fuente descargables, las @font-facereglas simplemente deben ignorarse; el comportamiento de los descriptores individuales como se define en esta especificación no debe ser alterado



Referencia de fuente: el descriptor src


Name: src
Value: [ <url> [format(<string> #)]? |<font-face-name> ] #
Initial: N/A

Este descriptor especifica el recurso que contiene datos de fuente. Se requiere que la @font-face regla sea válida. Su valor es una lista prioritaria separada por comas de referencias externas o nombres de fuentes de fuentes instalados localmente. Cuando se necesita una fuente, el agente de usuario itera sobre el conjunto de referencias enumeradas, utilizando la primera que se puede activar con éxito. Las fuentes que contienen datos no válidos o caras de fuentes locales que no se encuentran se ignoran y el agente de usuario carga la siguiente fuente en la lista.


Al igual que con otras URL en CSS, la URL puede ser relativa, en cuyo caso se resuelve en relación con la ubicación de la hoja de estilo que contiene la@font-face regla. En el caso de las fuentes SVG, la URL apunta a un elemento dentro de un documento que contiene definiciones de fuentes SVG. Si se omite la referencia del elemento, se implica una referencia a la primera fuente definida. De forma similar, los formatos de contenedor de fuentes que pueden contener más de una fuente deben cargar una y solo una de las fuentes para una @font-face regla determinada . Los identificadores de fragmentos se utilizan para indicar qué fuente cargar; estos usan el nombre PostScript de la fuente como se define en [RFC8081].


             src: url(fonts/simple.woff);       /* load simple.woff relative to stylesheet location */
             src: url(/fonts/simple.woff);      /* load simple.woff from absolute location */
             src: url(fonts/coll.otc#foo);      /* load font foo from collection coll.otc
             src: url(fonts/coll.woff2#foo);    /* load font foo from woff2 collection coll.woff2
             src: url(fonts.svg#simple);        /* load SVG font with id 'simple' */
       

Las referencias externas consisten en una URL, seguida de una sugerencia opcional que describe el formato del recurso de fuente al que hace referencia esa URL. La sugerencia de formato contiene una lista de cadenas de formato separadas por comas que denotan formatos de fuente bien conocidos. Los agentes de usuario conformes deben omitir la descarga de un recurso de fuente si las sugerencias de formato indican solo formatos de fuente no compatibles o desconocidos. Si no se proporcionan sugerencias de formato, el agente de usuario debe descargar el recurso de fuente.


            /* load WOFF font if possible, otherwise use OpenType font */
            @font-face {
            font-family: bodytext;
            src: url(ideal-sans-serif.woff) format("woff"),
            url(basic-sans-serif.ttf) format("opentype");
       }
       

Cadenas de formato definidas por esta especificación:


String Font Format Common extensions
"woff" WOFF 1.0 (Web Open Font Format) .woff
"woff2" WOFF 2.0 (Web Open Font Format) .woff2
"truetype" TrueType .ttf
"opentype" OpenType .ttf, .otf
"embedded-opentype" Embedded OpenType .eot
"svg" SVG Font .svg, .svgz