Популярный пост
Подключение шрифтов из папки.
CSS свойство @font-face
Есть разные способы подключения нестандартных шрифтов к сайту: скриптом, с помощью сервиса Google fonts или из
локальной папки сайта. Для реализации последнего из способов используют CSS-правило @font-face.
Подключение из локальной папки сайта
Одинаковые шрифты подключаются с одним именем, различающуюся жирность и стиль пишут в font-weight и font-style.
Для современных (с 2017 года) браузеров нужен единственный формат: woff2.
@font-face {
font-family: "OpenSans";
src: url("fonts/open-sans.woff2") format("woff2");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "OpenSans";
src: url("fonts/open-sans-bold.woff2") format("woff2");
font-weight: 700;
font-style: normal;
font-display: swap;
}
Если нужна поддержка браузеров с ~2011 года выпуска, то им потребуются форматы woff2 и woff. Вначале указывается путь к файлу woff2, затем к woff. Таким образом, если браузер умеет работать с более современным форматом шрифтов, то он применит его. Если нет, то возьмет формат woff.
@font-face {
font-family: "OpenSans";
src: url("fonts/open-sans.woff2") format("woff2"),
url("fonts/open-sans.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "OpenSans";
src: url("fonts/open-sans-bold.woff2") format("woff2"),
url("fonts/open-sans-bold.woff") format("woff");
font-weight: 700;
font-style: normal;
font-display: swap;
}
Форматы ttf, eot, svg нужны только очень древним браузерам. Сейчас нет нужды их использовать.
Теперь этот шрифт можно применять к нужным блокам. Для разной жирности или начертания браузер будет подтягивать нужные файлы для правильного отображения.
div {
font-family: OpenSans, Arial, sans-serif;
font-weight: bold;
}
Обязательно указывайте запасной веб-безопасный шрифт и семейство.
Почему не указываем local
Казалось бы, поискали есть ли шрифт у пользователя локально и используем его, не нужно ничего загружать. Но дело в том, что неизвестно откуда пользователь взял шрифт и насколько он ровный. То есть локальный шрифт может отличаться от того, который мы предлагаем пользователю. Причем, иногда с таким же названием может быть кардинально другой шрифт.
Стоит ли использовать Google fonts?
Раньше был аргумент, что файлы шрифтов, загруженные из Google fonts кешируются и с большой долей вероятности уже будут в наличии у пользователя. Но теперь (2025) это не так. Вот подробная статья на Хабре: До свидания, Google Fonts. Последний аргумент
font-weight - соответствие слов и чисел
100 - Thin (Hairline)
200 - Extra Light (Ultra Light)
300 - Light
400 - Normal (Regular)
500 - Medium
600 - Semi Bold (Demi Bold)
700 - Bold
800 - Extra Bold (Ultra Bold)
900 - Black (Heavy)
Что будет, если нет файла с нужной жирностью
Алгоритм следующий:
- Если задано значение выше
500, будет использовано первое доступное более жирное начертание (если такого не окажется, то первое доступное более светлое). - Если задано значение менее
400, будет использовано первое доступное более светлое начертание (если такого не окажется, то первое доступное более жирное). - Если задано значение
400, будет применено500. Если500недоступно, то будет использован алгоритм для подбора значений менее400. - Если задано значение
500, будет применено400. Если400недоступно, то будет использован алгоритм для подбора значений менее400.
https://drafts.csswg.org/css-fonts/#font-weight-prop
Относительные значения bolder и lighter
| Наследуемое значение | bolder |
lighter |
|---|---|---|
| 100 | 400 | 100 |
| 200 | 400 | 100 |
| 300 | 400 | 100 |
| 400 | 700 | 100 |
| 500 | 700 | 100 |
| 600 | 900 | 400 |
| 700 | 900 | 400 |
| 800 | 900 | 700 |
| 900 | 900 | 700 |
Свойство unicode-range
CSS свойство unicode-range задает определенный диапазон символов для шрифта, определенного в @font-face и доступного для использования на странице. Если на странице нет символов из указанного диапазона, то шрифт не загружается. Если же есть хоть один символ, то загрузится весь шрифт.
То есть, если у вас есть несколько файлов шрифта с заданными диапазонами, то загрузятся только те файлы, которые нужны для отображения набора символов на странице.
Обратите внимание, что unicode-range не разбивает сам шрифтовой файл, он только показывает нужно ли загружать этот файл, есть ли соответствующие ему символы.
Зачем может понадобиться это свойство? Например, для мультиязычных сайтов. Чтобы не грузить пользователю шрифт, в котором есть символы для всех нужных языков, можно сделать шрифтовые файлы под каждый.
Для подключения кириллицы:
@font-face {
font-display: swap;
font-family: "Lato";
src: url("/fonts/lato-light.cyrillic.woff2") format("woff2");
font-weight: 300;
font-style: normal;
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; // только кириллица
}
Как это работает? Браузер анализирует ваш DOM и понимает, какие символы используются на сайте и, если есть совпадение,
то шрифт закачивается. В данном примере, если на сайте есть кириллица, то lato-light.cyrillic.woff2 будет загружен и
применится, а шрифт lato-light.latin.woff2 даже не закачается.
Или другой пример: вот таким способом можно применить другой шрифт только к цифровым символам:
@font-face {
font-family: Georgia;
src: url("fonts/georgia.woff2") format("woff2");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "drevodel";
src: url("fonts/drevodel.woff2") format("woff2");
font-weight: normal;
font-style: normal;
unicode-range: U+30-39;
}
Примечание: unicode-range не работает со шрифтами подключенными через Google Fonts, необходимо локальное подключение.
Список диапазонов
- 0020 — 007F
- Basic Latin
- 2580 — 259F
- Block Elements
- 00A0 — 00FF
- Latin-1 Supplement
- 25A0 — 25FF
- Geometric Shapes
- 0100 — 017F
- Latin Extended-A
- 2600 — 26FF
- Miscellaneous Symbols
- 0180 — 024F
- Latin Extended-B
- 2700 — 27BF
- Dingbats
- 0250 — 02AF
- IPA Extensions
- 27C0 — 27EF
- Miscellaneous Mathematical Symbols-A
- 02B0 — 02FF
- Spacing Modifier Letters
- 27F0 — 27FF
- Supplemental Arrows-A
- 0300 — 036F
- Combining Diacritical Marks
- 2800 — 28FF
- Braille Patterns
- 0370 — 03FF
- Greek and Coptic
- 2900 — 297F
- Supplemental Arrows-B
- 0400 — 04FF
- Cyrillic
- 2980 — 29FF
- Miscellaneous Mathematical Symbols-B
- 0500 — 052F
- Cyrillic Supplementary
- 2A00 — 2AFF
- Supplemental Mathematical Operators
- 0530 — 058F
- Armenian
- 2B00 — 2BFF
- Miscellaneous Symbols and Arrows
- 0590 — 05FF
- Hebrew
- 2E80 — 2EFF
- CJK Radicals Supplement
- 0600 — 06FF
- Arabic
- 2F00 — 2FDF
- Kangxi Radicals
- 0700 — 074F
- Syriac
- 2FF0 — 2FFF
- Ideographic Description Characters
- 0780 — 07BF
- Thaana
- 3000 — 303F
- CJK Symbols and Punctuation
- 0900 — 097F
- Devanagari
- 3040 — 309F
- Hiragana
- 0980 — 09FF
- Bengali
- 30A0 — 30FF
- Katakana
- 0A00 — 0A7F
- Gurmukhi
- 3100 — 312F
- Bopomofo
- 0A80 — 0AFF
- Gujarati
- 3130 — 318F
- Hangul Compatibility Jamo
- 0B00 — 0B7F
- Oriya
- 3190 — 319F
- Kanbun
- 0B80 — 0BFF
- Tamil
- 31A0 — 31BF
- Bopomofo Extended
- 0C00 — 0C7F
- Telugu
- 31F0 — 31FF
- Katakana Phonetic Extensions
- 0C80 — 0CFF
- Kannada
- 3200 — 32FF
- Enclosed CJK Letters and Months
- 0D00 — 0D7F
- Malayalam
- 3300 — 33FF
- CJK Compatibility
- 0D80 — 0DFF
- Sinhala
- 3400 — 4DBF
- CJK Unified Ideographs Extension A
- 0E00 — 0E7F
- Thai
- 4DC0 — 4DFF
- Yijing Hexagram Symbols
- 0E80 — 0EFF
- Lao
- 4E00 — 9FFF
- CJK Unified Ideographs
- 0F00 — 0FFF
- Tibetan
- A000 — A48F
- Yi Syllables
- 1000 — 109F
- Myanmar
- A490 — A4CF
- Yi Radicals
- 10A0 — 10FF
- Georgian
- AC00 — D7AF
- Hangul Syllables
- 1100 — 11FF
- Hangul Jamo
- D800 — DB7F
- High Surrogates
- 1200 — 137F
- Ethiopic
- DB80 — DBFF
- High Private Use Surrogates
- 13A0 — 13FF
- Cherokee
- DC00 — DFFF
- Low Surrogates
- 1400 — 167F
- Unified Canadian Aboriginal Syllabics
- E000 — F8FF
- Private Use Area
- 1680 — 169F
- Ogham
- F900 — FAFF
- CJK Compatibility Ideographs
- 16A0 — 16FF
- Runic
- FB00 — FB4F
- Alphabetic Presentation Forms
- 1700 — 171F
- Tagalog
- FB50 — FDFF
- Arabic Presentation Forms-A
- 1720 — 173F
- Hanunoo
- FE00 — FE0F
- Variation Selectors
- 1740 — 175F
- Buhid
- FE20 — FE2F
- Combining Half Marks
- 1760 — 177F
- Tagbanwa
- FE30 — FE4F
- CJK Compatibility Forms
- 1780 — 17FF
- Khmer
- FE50 — FE6F
- Small Form Variants
- 1800 — 18AF
- Mongolian
- FE70 — FEFF
- Arabic Presentation Forms-B
- 1900 — 194F
- Limbu
- FF00 — FFEF
- Halfwidth and Fullwidth Forms
- 1950 — 197F
- Tai Le
- FFF0 — FFFF
- Specials
- 19E0 — 19FF
- Khmer Symbols
- 10000 — 1007F
- Linear B Syllabary
- 1D00 — 1D7F
- Phonetic Extensions
- 10080 — 100FF
- Linear B Ideograms
- 1E00 — 1EFF
- Latin Extended Additional
- 10100 — 1013F
- Aegean Numbers
- 1F00 — 1FFF
- Greek Extended
- 10300 — 1032F
- Old Italic
- 2000 — 206F
- General Punctuation
- 10330 — 1034F
- Gothic
- 2070 — 209F
- Superscripts and Subscripts
- 10380 — 1039F
- Ugaritic
- 20A0 — 20CF
- Currency Symbols
- 10400 — 1044F
- Deseret
- 20D0 — 20FF
- Combining Diacritical Marks for Symbols
- 10450 — 1047F
- Shavian
- 2100 — 214F
- Letterlike Symbols
- 10480 — 104AF
- Osmanya
- 2150 — 218F
- Number Forms
- 10800 — 1083F
- Cypriot Syllabary
- 2190 — 21FF
- Arrows
- 1D000 — 1D0FF
- Byzantine Musical Symbols
- 2200 — 22FF
- Mathematical Operators
- 1D100 — 1D1FF
- Musical Symbols
- 2300 — 23FF
- Miscellaneous Technical
- 1D300 — 1D35F
- Tai Xuan Jing Symbols
- 2400 — 243F
- Control Pictures
- 1D400 — 1D7FF
- Mathematical Alphanumeric Symbols
- 2440 — 245F
- Optical Character Recognition
- 20000 — 2A6DF
- CJK Unified Ideographs Extension B
- 2460 — 24FF
- Enclosed Alphanumerics
- 2F800 — 2FA1F
- CJK Compatibility Ideographs Supplement
- 2500 — 257F
- Box Drawing
- E0000 — E007F
- Tags
ascent-override, descent-override и line-gap-override
Обязательно проверяйте поддержку этих свойств на caniuse.com
Дескрипторы ascent-override и descent-override определяют высоту над базовой линией шрифта и под ней соответственно.
Пример написания:
@font-face {
font-family: 'FontName';
src: url("font.woff2")format("woff2");
ascent-override: 90%;
}
See the pen (@Websitio) on CodePen.
При обычном подключении видно, что есть расстояние между буквами и ограничительной рамкой.
В первом примере шрифт поднят с помощью дескриптора ascent-override так, чтобы он касался верхней границы.
Во втором, аналогично, опущен до нижней границы с помощью descent-override.
Дескриптор line-gap-override переопределяет межстрочный промежуток для шрифта.
По умолчанию этот промежуток равен нулю (розовая граница). У голубого элемента значение переопределено на 50%, что создало дополнительное пространство сверху и снизу букв.
See the pen (@Websitio) on CodePen.
Конечно, напрашивается идея объединить три дескриптора и убрать все промежутки.
See the pen (@Websitio) on CodePen.