Есть ли способ исправить объявления fonts.com @ font-face? - PullRequest
12 голосов
/ 29 апреля 2011

Многие популярные шрифты, по-видимому, доступны для веб-использования исключительно с http://webfonts.fonts.com/

Однако это работает очень странным образом. Они не дают вам прямые URL-адреса шрифтов, вместо этого они дают вам файл CSS, который ссылается на файлы шрифтов. Я думаю, что URL-адреса шрифтов в CSS, вероятно, временные и меняются с течением времени, чтобы предотвратить несанкционированное использование. Поэтому вы должны использовать их CSS, вы не можете напрямую включать URL файлов шрифтов (насколько я знаю).

CSS, в свою очередь, не то, что я думаю. Вместо (упрощенного):

@font-face { 
  font-family: "Foo";
  font-weight: bold;
  src: url("foo-bold-variant.ttf");
}

@font-face {
  font-family: "Foo";
  font-weight: normal;
  src: url("foo-normal-variant.ttf");
}

Это:

@font-face { 
  font-family: "Foo Bold";
  src: url("foo-bold-variant.ttf");
}

@font-face {
  font-family: "Foo Normal";
  src: url("foo-normal-variant.ttf");
}

В результате вы не можете сделать это:

body {
  font-family: "Foo", sans-serif;
}

Вместо этого, где бы вы ни использовали font-weight: bold, вы должны изменить его на font-family: "Foo Bold", плюс, я думаю, вам нужно добавить правила CSS, чтобы изменить семейство таких вещей, как <strong>. Я использую жирный шрифт в качестве примера, но та же проблема возникает для font-style в дополнение к font-weight.

Они объясняют это как обходной путь для ошибки iOS («это особенность!»): http://blog.fonts.com/2010/09/23/getting-web-fonts-to-look-fantastic-on-iphone-and-ipad-devices/

Но эта ошибка была исправлена ​​в iOS 4.2: http://blog.typekit.com/2010/12/06/updates-to-typekits-mobile-support/

С этой настройкой, если я что-то упустил, я не смог бы использовать сторонние CSS или сценарии, которые пытаются использовать font-weight, потому что подход fonts.com нарушает свойства font-weight и font-style CSS полностью. Вместо использования font-weight вы должны создать собственный класс CSS для «mybold» или что-то подобное, чтобы установить для семейства шрифтов «Foo Bold». то есть они нарушают стандартный CSS. (Что мне не хватает?)

Может, когда-нибудь это исправят. Но в то же время, может кто-нибудь придумать разумный обходной путь? Нет никакого способа определить семейство "Foo" в терминах их "Foo Bold" и т. Д. @font-face определения есть? Напишите какой-нибудь сумасшедший JavaScript, чтобы извлекать URL-адреса из их CSS на лету, а затем динамически определять мой собственный @ font-face?

(«использовать другой шрифт с другим сервисом» не считается ответом ;-) да, я думал об этом, но мне интересно, есть ли способ «исправить» webfonts.fonts.com, каким-то образом подправив их CSS с моими собственными правилами CSS или JavaScript.)

Ответы [ 8 ]

3 голосов
/ 04 октября 2013

Обновление 2014/01/16: Fonts.com теперь поддерживает стандартное встраивание шрифтов. Следующее по-прежнему работает, как и должно, но в основном устранено сторонней поддержкой.


Во-первых, обратите внимание, что Fonts.com теперь утверждает, что семейные группировки «в работе» .В то же время, однако, на самом деле можно делать обычные встраивания семейства @font-face, используя наборы, поставляемые Fonts.com. [1]

Предположим, что объявление шрифта face, которое они вам дают, выглядит примерно так:в каждом случае вместо имени файла шрифта подставляется hash: [2]

@font-face{
    font-family:"Minion W01 It";
    src:url("Fonts/hash.eot?#iefix");
    src:url("Fonts/hash.eot?#iefix") format("eot"),url("Fonts/hash.woff") format("woff"),url("Fonts/hash.ttf") format("truetype"),url("Fonts/hash.svg#8cda8fb2-6a3e-4e20-b063-4fbfca0025e5") format("svg");
}
@font-face{
    font-family:"Minion W01 Regular";
    src:url("Fonts/hash.eot?#iefix");
    src:url("Fonts/hash.eot?#iefix") format("eot"),url("Fonts/hash.woff") format("woff"),url("Fonts/hash.ttf") format("truetype"),url("Fonts/hash.svg#cfa664d4-e518-4a49-b8a3-fccec93c29c1") format("svg");
}
@font-face{
    font-family:"Minion W01 SmBd";
    src:url("Fonts/hash.eot?#iefix");
    src:url("Fonts/hash.eot?#iefix") format("eot"),url("Fonts/hash.woff") format("woff"),url("Fonts/hash.ttf") format("truetype"),url("Fonts/hash.svg#cae2aa90-12f3-4dab-8a67-205fbdf0f046") format("svg");
}
@font-face{
    font-family:"Minion W01 SmBd It";
    src:url("Fonts/hash.eot?#iefix");
    src:url("Fonts/hash.eot?#iefix") format("eot"),url("Fonts/hash.woff") format("woff"),url("Fonts/hash.ttf") format("truetype"),url("Fonts/hash.svg#76687d3a-f199-47f2-be8c-a6ccde14c771") format("svg");
}

Затем, чтобы создать семейство шрифтов с хорошим именем, вы можете просто настроить эти объявления следующим образом:

@font-face{
    font-family:"Minion";
    font-style: italic;
    src:url("Fonts/hash.eot?#iefix");
    src:url("Fonts/hash.eot?#iefix") format("eot"),url("Fonts/hash.woff") format("woff"),url("Fonts/hash.ttf") format("truetype"),url("Fonts/hash.svg#8cda8fb2-6a3e-4e20-b063-4fbfca0025e5") format("svg");
}
@font-face{
    font-family:"Minion";
    font-weight: normal;
    font-style: normal;
    src:url("Fonts/hash.eot?#iefix");
    src:url("Fonts/hash.eot?#iefix") format("eot"),url("Fonts/hash.woff") format("woff"),url("Fonts/hash.ttf") format("truetype"),url("Fonts/hash.svg#cfa664d4-e518-4a49-b8a3-fccec93c29c1") format("svg");
}
@font-face{
    font-family:"Minion";
    font-weight: 700;
    src:url("Fonts/hash.eot?#iefix");
    src:url("Fonts/hash.eot?#iefix") format("eot"),url("Fonts/hash.woff") format("woff"),url("Fonts/hash.ttf") format("truetype"),url("Fonts/hash.svg#cae2aa90-12f3-4dab-8a67-205fbdf0f046") format("svg");
}
@font-face{
    font-family:"Minion";
    font-weight: 700;
    font-style: italic;
    src:url("Fonts/hash.eot?#iefix");
    src:url("Fonts/hash.eot?#iefix") format("eot"),url("Fonts/hash.woff") format("woff"),url("Fonts/hash.ttf") format("truetype"),url("Fonts/hash.svg#76687d3a-f199-47f2-be8c-a6ccde14c771") format("svg");
}

Вот и все;это так просто.Я уже проверил это на одном из своих сайтов, и он работает как положено.Очевидно, что для старых браузеров, которые его не поддерживают, у вас будут проблемы (проблемы, которые Typekit решает другими способами).Однако, если вы используете fonts.com, об этом вам следует позаботиться.


Сноски

  1. Примечание: этот конкретный подходгарантированно работает только для автономной опции, , а не для версии, размещенной на Fonts.com.Я подозреваю, что это могло бы работать для версии, которую они размещают, но я не проверял это и не планирую в ближайшем будущем;если кто-то захочет и сообщит мне об этом в комментарии, я с радостью обновлю ответ, чтобы отразить это.
  2. Я использую hash здесь, поскольку имена файлов выглядят так, как будто они генерируются при запуске оригиналаимя файла через генератор хешей.Поскольку это самодостаточный комплект, эти имена не будут меняться, и поэтому он будет продолжать работать.Спасибо комментатору vieron за , указав , что это необходимо уточнить.
3 голосов
/ 15 февраля 2013

К сожалению, это по-прежнему проблема почти два года спустя, и Fonts.com не планирует в ближайшее время изменить способ объявления шрифтов ( спросил их в Twitter ).

Однако, если выиспользуя CSS-компилятор (например, SASS ), вы можете довольно легко решить эту проблему с помощью вложенных стилей ... единственный недостаток - это больше кода, чем при использовании простого объявления font-weight.

Бросив здесь этот код на случай, если кто-нибудь наткнется на этот старый поток, как я!

h1 {
    font-family: "PMNCaeciliaW01-75Bold", Georgia, Times, serif;

    b, strong {
        font-family: "PMNCaeciliaW01-85Heavy", Georgia, Times, serif;
    }
    i, em {
        font-family: "PMNCaeciliaW01-76BoldIt", Georgia, Times, serif;
    }
    b i, strong i,
    i b, i strong
    b em, strong em,
    em b, em strong {
        font-family: "PMNCaeciliaW01-86HeavyI", Georgia, Times, serif;
    }
}

Он не генерирует самый красивый CSS в мире, но работает.

2 голосов
/ 05 октября 2013

Я написал небольшой Javascript Loader для Fonts.com, который позволяет использовать несколько весов для каждого семейства шрифтов. Он основан на подходе Росси, но преобразован в сценарий многократного использования. Проверьте код и использование в этой сути .

В основном он загружает CSS с fonts.com, изменяется в соответствии с указанными настройками и добавляется к <head> вашего документа.

В вашем JS:

FontsComLoader.load('HelveticaNeueFontsCom', 'https://fast.fonts.net/cssapi/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.css', {
    'W02-55Roma': '400',
    'W02-75Bold': '700'
});

В вашем CSS:

.helvetica-regular,
.helvetica-bold {
    font-family: 'HelveticaNeueFontsCom', 'Helvetica Neue', Helvetica, Arial, sans-serif;
}

.helvetica-regular {
    font-weight: 400;
}

.helvetica-bold {
    font-weight: 700;
}
1 голос
/ 02 января 2014

Fonts.com теперь имеет возможность « Семейная группировка » для решения этой проблемы.Я не проводил тщательного расследования, но, похоже, он был выпущен в сентябре 2013 года.

1 голос
/ 20 августа 2013

я сделал это: (не удосужился очистить код, это может быть намного лучше / более универсально, но я все равно опубликую его, вы поймете идею) он использует document.stylesheets для Internet Explorer, потому что я не получил междоменную загрузку CSS для работы с ним и загрузку $ .get ajax css для других браузеров. не зарегистрировался, т.е. ниже 8, но я думаю, что это даже работает там. на Windows (Vista) есть некоторое мерцание в chrome, но я думаю, что сочетание этого и загрузчика веб-шрифтов Google поможет.

<link rel="stylesheet" href="//fast.fonts.net/cssapi/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.css" />
<script>
var data = "";
try
{
    data = document.styleSheets[document.styleSheets.length - 1].cssText;
    data = data.replace(/url\(/g, 'url(//fast.fonts.net');
    data = data.replace(/font-family: Geom Slab 703 W01 Light;/g, 'font-family:"GeomSlab";font-weight:lighter;');
    data = data.replace(/font-family: GeomSlab703W01-LightIta;/g, 'font-family:"GeomSlab";font-weight:lighter;font-style: italic;');
    data = data.replace(/font-family: GeomSlab703W01-Medium;/g, 'font-family:"GeomSlab";font-weight:normal;');
    data = data.replace(/font-family: GeomSlab703W01-MediumIt;/g, 'font-family:"GeomSlab";font-weight:normal;font-style: italic;');
    data = data.replace(/font-family: Geom Slab 703 W01 Bold;/g, 'font-family:"GeomSlab";font-weight:bold;');
    data = data.replace(/font-family: GeomSlab703W01-BoldItal;/g, 'font-family:"GeomSlab";font-weight:bold;font-style: italic;');
    document.styleSheets[document.styleSheets.length - 1].cssText = data;
}
catch (e)
{
}

$.get(location.protocol + '//fast.fonts.net/cssapi/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.css', function(data) {
    data = data.replace(/url\("/g, 'url("//fast.fonts.net');
    data = data.replace(/import url\(/, 'import url(//fast.fonts.net');
    data = data.replace(/font-family:"Geom Slab 703 W01 Light";/g, 'font-family:"GeomSlab";font-weight:lighter;');
    data = data.replace(/font-family:"GeomSlab703W01-LightIta";/g, 'font-family:"GeomSlab";font-weight:lighter;font-style: italic;');
    data = data.replace(/font-family:"GeomSlab703W01-Medium";/g, 'font-family:"GeomSlab";font-weight:normal;');
    data = data.replace(/font-family:"GeomSlab703W01-MediumIt";/g, 'font-family:"GeomSlab";font-weight:normal;font-style: italic;');
    data = data.replace(/font-family:"Geom Slab 703 W01 Bold";/g, 'font-family:"GeomSlab";font-weight:bold;');
    data = data.replace(/font-family:"GeomSlab703W01-BoldItal";/g, 'font-family:"GeomSlab";font-weight:bold;font-style: italic;');
    var s = $('<style type="text/css" />').appendTo('head');
    s.html(data);
});
</script>

Хорошо, так что мне не нужно больше, чем этот быстрый взлом для моего текущего проекта, но если кто-то закодирует очищенную / оптимизированную версию, я был бы рад услышать об этом.

1 голос
/ 21 февраля 2012

Прошел год, но я все еще не вижу желаемой функциональности в webfonts.fonts.com, поэтому я столкнулся с теми же проблемами, что и "Havoc P".Это выглядит довольно сложно.К счастью, нужные мне шрифты также размещаются на веб-сайте webtype.com, что позволяет использовать стандартный подход «связывание стилей», а также позволяет выделять жирным шрифтом / курсивом разные фамилии, если вы хотите.Так что я просто пошел с этим.

0 голосов
/ 06 декабря 2012

Роберт дал лучший ответ в качестве комментария к исходному вопросу. Fonts.com использует наиболее приемлемую версию @ font-face (в настоящее время), в которой не используется объявление font-weight из-за нечеткой поддержки кросс-браузера.

0 голосов
/ 19 мая 2011

Хотя я понимаю, что это немного больше работы, есть альтернативный метод, который должен дать конечный результат, к которому вы стремитесь: Google WebFont Loader API (с нашим сервисом, предоставляющим шрифты).

По сути, Google создал API AJAX, который вы можете использовать с нашим сервисом.Преимущества включают в себя возможность определять состояние загрузки шрифтов - API динамически стилирует HTML-тег страницы с различными классами на основе того, не загружается ли шрифт (неактивен), загружается (загружается) в настоящее время или успешно загружен (активный).Затем вы можете использовать некоторые умные правила CSS, чтобы воспользоваться этими классами.

Дополнительную информацию можно найти в наших сообщениях в блогах и в документации Google .

...