Статьи

CSS font-display: будущее рендеринга шрифтов в Интернете

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

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

Использование Chrome DevTools для проверки шрифта -display

Введите дескриптор отображения шрифта для правила @font-face . Эта функция CSS представляет способ стандартизировать эти поведения и предоставляет больше контроля разработчикам.

Использование font-display

Прежде чем подробно рассмотреть различные функции, предоставляемые font-display , давайте кратко рассмотрим, как вы можете использовать эту функцию в своем CSS.

Прежде всего, font-display не является свойством CSS, но, как уже упоминалось во вступлении, это дескриптор @font-face at-rule. Это означает, что он должен использоваться внутри правила @font-face , как показано в следующем коде:

 @font-face { font-family: 'Saira Condensed'; src: url(fonts/sairacondensed.woff2) format('woff2'); font-display: swap; } 

В этом фрагменте я определяю значение swap для шрифта Saira Condensed .

Ключевые слова для всех доступных значений:

  • auto
  • block
  • swap
  • fallback
  • optional

Начальное значение для font-displayauto .

В последующих разделах я подробно рассмотрю каждое из этих значений. Но сначала давайте посмотрим на период времени, который браузер использует для определения шрифта, который будет отображаться. При обсуждении каждого из значений я объясню различные аспекты временной шкалы и то, как они ведут себя для каждого значения.

Временная шкала font-display

В основе этой функции лежит концепция временной шкалы отображения шрифтов . Время загрузки шрифта, начиная с его запроса и заканчивая его успешной загрузкой или неудачей, можно разделить на три последовательных периода, которые определяют, как браузер должен отображать текст. Эти три периода следующие:

  • Период блока . В течение этого периода браузер отображает текст невидимым резервным шрифтом. Если запрошенный шрифт успешно загружается, текст повторно отображается с этим запрошенным шрифтом. Невидимый резервный шрифт действует как пустой заполнитель для текста. Это уменьшает смещение макета при повторном рендеринге.
  • Период обмена . Если нужный шрифт еще не доступен, используется запасной шрифт, но на этот раз текст виден. Опять же, если загружается шрифт, он используется.
  • Период отказа . Если шрифт не станет доступным, браузер не будет ждать его, и текст будет отображаться с резервным шрифтом во время текущего посещения страницы. Обратите внимание, что это не обязательно означает, что загрузка шрифта прервана; вместо этого браузер может решить продолжить его, чтобы шрифт был готов к использованию при последующих посещениях страниц одним и тем же пользователем.

Регулировка длительности таких периодов позволяет настроить собственную стратегию рендеринга текста. В частности, эти длительности могут уменьшаться до нуля или расширяться до бесконечности, как я покажу вам в следующих разделах.

Но эти длительности не могут быть явно назначены разработчиком. Эта возможность была рассмотрена на ранней стадии спецификации, но была упущена . Вместо этого предоставляется набор предварительно определенных значений ключевых слов, которые могут обрабатывать большинство случаев использования, как описано в предыдущем разделе.

Давайте посмотрим, как каждое из этих ключевых слов управляет процессом загрузки и отображения шрифта.

font-display: auto

Это значение указывает браузеру принять режим отображения шрифта по умолчанию, выбранный браузером. Часто эта стратегия похожа на следующее значение, block .

font-display: block

С этим значением после короткого периода блокировки (спецификация рекомендует продолжительность в три секунды) период обмена увеличивается до бесконечности. Это означает, что в этом случае период отказа отсутствует.

Пока браузер ненадолго ждет запрошенного шрифта, он отображает текст невидимым резервным шрифтом; после этого, если шрифт еще не доступен, резервный шрифт становится видимым; и всякий раз, когда загрузка завершается, браузер повторно отображает текст с нужным шрифтом.

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

В начале загрузки страницы заголовок невидим, но он есть в DOM. Примерно через три секунды, если шрифт еще не доступен, текст становится видимым с помощью резервного шрифта. В демонстрации видео я имитирую плохие условия сети с помощью функции регулирования сети Chrome DevTools. Наконец, когда шрифт удается загрузить, заголовок перерисовывается вместе с ним.

font-display: swap

При этом значении период блока сокращается до 0, а период обмена увеличивается до бесконечности. Поэтому и здесь период отказа отсутствует.

Другими словами, браузер не ждет шрифта, а вместо этого немедленно отображает текст с резервным шрифтом; затем, когда шрифт доступен, текст перерисовывается вместе с ним.

Давайте проверим это:

font-display: fallback

Это первое значение, которое включает период отказа. После очень короткого периода блокировки (рекомендуется 100 мс) период смены теперь имеет короткую продолжительность (рекомендуется 3 с). В результате, если запрошенный шрифт не будет готов в конце этого периода, текст будет отображаться с использованием резервного шрифта на время посещения страницы. Это позволяет не беспокоить посетителя страницы поздним изменением макета, что может вызвать неудобства для пользователя.

В этом первом видео ниже шрифт загружается более чем через шесть секунд, поэтому он никогда не заменяется:

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

font-display: optional

Когда я впервые прочитал спецификацию, я обнаружил, что названия, назначенные стратегиям отображения шрифта, не очень ясны. Это даже указано в самой спецификации, которая предлагает будущие версии спецификации, использующие имена, которые лучше иллюстрируют предполагаемое использование каждой стратегии, предлагая следующие альтернативы:

  • requires для block
  • important для swap
  • preferable для fallback

Но optional значение, как ожидается, останется неизменным. Действительно, это значение прекрасно отражает суть поведения, которое оно вызывает. В этом случае шрифт считается необязательным для визуализации страницы, по сути говоря, сообщая браузеру: если шрифт уже доступен, используйте его, в противном случае это не имеет значения, воспользуйтесь резервным шрифтом; шрифт может быть готов к использованию при последующих посещениях страницы .

При этом значении временная шкала отображения шрифта имеет короткий период блокировки (опять же, спецификация рекомендует интервал времени 100 мс) и период замены нулевой продолжительности. Следовательно, период сбоя следует сразу за периодом блокировки, что означает, что если шрифт недоступен, он не будет использоваться во время посещения страницы. Но шрифт в конечном итоге может быть полностью загружен в фоновом режиме, и он станет доступным для немедленного рендеринга при будущих загрузках страницы.

Но я должен отметить, что, особенно в плохих условиях сети, пользовательский агент может прервать или даже не начинать загрузку шрифта. Это сделано для того, чтобы не излишне влиять на качество сетевого соединения. Поэтому сайт по-прежнему можно использовать, но шрифт не будет сразу же доступен при последующих загрузках страницы.

На видео ниже тестовая страница загружается без регулирования сети. Шрифт загружается быстро, но только после короткого периода блокировки, поэтому текст отображается с резервным шрифтом в течение всей продолжительности посещения.

В следующем видео страница перезагружается при тех же условиях сети, но на этот раз с включенным кешем для имитации второго посещения:

И вот, у вас это есть, заголовок теперь отображается с нужным веб-шрифтом.

Прежде чем двигаться дальше, обратите внимание на чрезвычайно короткую продолжительность около 100 мс, рекомендованную для периода block при использовании fallback и optional значений. Это делается для того, чтобы на короткое время отображался шрифт с быстрой загрузкой (или одна загрузка из кэша), прежде чем использовать резервный шрифт, что позволяет избежать «вспышки нестандартного текста» или FOUT.

Мне действительно было интересно, почему период блока сокращается до нуля при использовании font-display: swap вместо того же короткого интервала, что и optional . Оказывается, в репозитории GitHub спецификации есть проблема с тем, чтобы «своп» использовал тот же «период крошечного блока», что и другие.

О резервном шрифте

В приведенном выше обсуждении я несколько раз упоминал запасной шрифт. Но откуда это?

Резервный шрифт — это первый доступный шрифт в стеке шрифтов, определенный с помощью свойства font-family для рассматриваемого элемента.

Например, на тестовой странице значение font-family для заголовка:

 h1 { font-family: 'Saira Condensed', Arial, "Helvetica Neue", Helvetica, sans-serif; } 

Это можно проверить (см. Видео выше для optional ), например, на компьютере с Windows, который использует Arial в качестве визуализированного шрифта.

Служба поддержки

На момент написания поддержка дескриптора font-display выглядит следующим образом:

Пожалуйста, обратитесь к caniuse.com для получения актуальной информации о поддержке.

Стоит отметить, что поддержка font-display не может быть проверена запросами функций, потому что, как упоминалось выше, это не свойство CSS, а дескриптор шрифта. В этом выпуске GitHub вы найдете обсуждение того, как правильно определить эту функцию.

Как только было обнаружено, что font-display не поддерживается, возможны несколько альтернативных стратегий, но это выходит за рамки этой статьи. В статье «Всеобъемлющее руководство по стратегиям загрузки шрифтов » Зака ​​Лезермана представлен исчерпывающий обзор доступных решений.

Использование с Google Fonts

Возможно, вы заметили, что шрифт, используемый на демонстрационной странице, взят из Google Fonts, но он загружается не обычным способом, то есть со ссылкой на таблицу стилей, предоставленную поставщиком шрифтов. Вместо этого я просто скопировал URL шрифта, найденного в этой таблице стилей, и использовал этот URL в своем собственном правиле @font-face . Я должен был сделать это, потому что, как видно из раздела об использовании, font-display должно быть указано внутри правила font-face .

Есть ли лучший и более удобный для Google Fonts способ? Собираются ли шрифты Google и другие сторонние производители шрифтов для поддержки font-display ?

В репозитории Google Fonts GitHub есть открытый вопрос, где это обсуждается. Добавьте +1, чтобы проявить интерес к этой функции!

Кроме того, стоит упомянуть, что в модуле уровня 4 шрифтов CSS предлагается использование font-display в качестве дескриптора для @ font-feature-values , чтобы позволить разработчикам устанавливать политику отображения для правил @font-face , которые не находятся непосредственно под ними. контроль. Но это еще не реализовано ни одним пользовательским агентом.

Заключительные слова

Я надеюсь, что это даст вам хороший обзор дескриптора font-display и того, как эта функция предвещает большое будущее для рендеринга шрифтов в Интернете.

Хотя в этой статье не обсуждались конкретные варианты использования для различных стратегий, реализованных с помощью font-display , в спецификации иллюстрируются варианты использования с некоторыми наглядными примерами, и некоторые из цитируемых ссылок подробно раскрывают эту тему. Таким образом, в дополнение к основам, которые я рассмотрел здесь, у вас есть еще что посмотреть в ресурсах, на которые я ссылался.