DEV Community

Andrey Smirnov
Andrey Smirnov

Posted on • Edited on

9 3

Делаем свой Font Awesome шрифт

Обзор

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

Thumbs up
Нам достаточно написать небольшой HTML код, и картинка будет у нас на сайте:

<i class="fa-solid fa-thumbs-up"></i>
Enter fullscreen mode Exit fullscreen mode

Но почему просто нельзя разместить картинку с помощью тега img?

<img src="/thumbs-up.svg" />
Enter fullscreen mode Exit fullscreen mode

При таком размещении мы не сможем изменять цвет картинки, например, при наведении указателя мышки над картинкой, а так же применять css transitions к цвету. Конечно, есть решения на основе css filters https://stackoverflow.com/a/50942954, но это усложняет читаемость и поддержку кода.
Есть ещё один метод изменять цвет картинки - добавлять inline svg:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
    <path fill="#0000ff" d="M128 447.1V223.1c0-17.67-14.33-31.1-32-31.1H32c-17.67 0-32 14.33-32 31.1v223.1c0 17.67 14.33 31.1 32 31.1h64C113.7 479.1 128 465.6 128 447.1zM512 224.1c0-26.5-21.48-47.98-48-47.98h-146.5c22.77-37.91 34.52-80.88 34.52-96.02C352 56.52 333.5 32 302.5 32c-63.13 0-26.36 76.15-108.2 141.6L178 186.6C166.2 196.1 160.2 210 160.1 224c-.0234 .0234 0 0 0 0L160 384c0 15.1 7.113 29.33 19.2 38.39l34.14 25.59C241 468.8 274.7 480 309.3 480H368c26.52 0 48-21.47 48-47.98c0-3.635-.4805-7.143-1.246-10.55C434 415.2 448 397.4 448 376c0-9.148-2.697-17.61-7.139-24.88C463.1 347 480 327.5 480 304.1c0-12.5-4.893-23.78-12.72-32.32C492.2 270.1 512 249.5 512 224.1z"/>
</svg>
Enter fullscreen mode Exit fullscreen mode

Атрибут fill отвечает за цвет. Но проще всего изменять цвет css стилями:

.icon {
   color: red;
}
Enter fullscreen mode Exit fullscreen mode

Итак, в этой статье мы:

  1. Создадим свой шрифт, который будет состоять из трёх векторных изображений;
  2. Конвертируем наш шрифт в woff и woff2 форматы для оптимизации размера;
  3. Напишем css стили для удобного добавления символов шрифта на страницы сайта.

1. Создаём шрифт

Image description
Для создания шрифта нам понадобятся две open source программы:

  • FontForge - редактор шрифтов;
  • Inkscape - редактор векторной графики.

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

Обратите внимание на то, что большой палец и лицо с улыбкой имеют разрешение: 512x512, а чашка: 640x512. Для того чтобы символы шрифта были центрированы, нам необходимо привести их к единому разрешению. В этом примере мы выберем разрешение 512x512. Значит, разрешение чашки придётся изменить, а изображение вписать и центрировать в новое разрешение. Для этого нам понадобится Inkscape.

  1. Открываем нашу чашку в Inkscape;
  2. Заходим в меню File -> Document Properties...;
  3. Во вкладке Page в разделе Custom size выбираем Units: px - размер в пикселях. И там же устанавливаем разрешение Width и Height в 512; Image description В результате мы получим блюдце и ручку чашки, выступающие за поля изображения: Image description

Далее:

  1. Нажимаем на изображение чашки;
  2. В меню выбираем Object -> Transform -> Scale, устанавливаем единицы измерения в px, устанавливаем галочку Scale proportionally, Width устанавливаем в 512 и нажимаем Enter, после чего величина Height должна пропорционально измениться. Image description Результат: Image description

Теперь нам нужно расположить изображение по центру, для этого:

  1. В меню выбираем Object -> Align and Distribute...;
  2. Relative to выбираем Page, и нажимаем на значки выравнивания по центру, по горизонтали и вертикали. Image description

В результате получаем картинку по центру холста:
Image description

Осталось только сохранить результат в svg файле:

  1. Меню File -> Save As...;
  2. Выбираем формат Plain SVG (*.svg) и нажимаем кнопку Save.

В итоге у нас получилось изображение в svg формате с разрешением 512x512 пикселей. Все три картинки с одинаковым разрешением.

Теперь можно приступить к работе с FontForge:

  1. Открываем программу;
  2. Нажимаем на кнопку New для создания нового проекта; Image description
  3. Выбираем, например, букву s от слова smile и дважды кликаем мышкой на пустую клетку под буквой s. Должен открыться редактор символа. Image description
  4. Открываем меню File -> Import..., Format -> SVG, выбираем файл лицо с улыбкой и нажимаем OK.
  5. Закрываем редактор символа, после чего под буквой s мы увидим наше изображение с улыбкой.
  6. Повторяем действия для двух оставшихся картинок, для чашки я выбрал букву c, для пальца вверх букву t. В результате у нас под буквами s, c и t должны появиться изображения: Image description

Осталось только сохранить результат в файл шрифта:

  1. Меню File -> Generate Fonts...
  2. Выбираем название icons.ttf и нажимаем кнопку Generate, затем Yes.

Поздравляю, наш шрифт готов!

2. Конвертируем наш шрифт в woff и woff2 форматы

Для конвертации шрифта из формата ttf в woff и woff2 я написал небольшую консольную утилиту, которую вы можете скачать с https://github.com/druxax/font-conv.
Для установки необходимо скачать и в консоли перейти в каталог утилиты font-conv, затем выполнить команды:

npm pack
sudo npm install -g font-conv-cli-1.0.0.tgz
Enter fullscreen mode Exit fullscreen mode

После установки в консоли заходим в каталог со шрифтом и запускаем утилиту конвертации:

font-conv-cli
Enter fullscreen mode Exit fullscreen mode

После завершения работы утилита создаст каталог в той же папке с названием font-conv-res - в нём будут находиться два файла сконвертированных шрифтов с расширениями woff и woff2.
Переместите все 3 файла шрифта в одну папку fonts и мы приступим к последнему пункту - добавим шрифт на страницу сайта.

3. Добавляем шрифт на сайт

Подготовим html шаблон нашего сайта, создадим файл index.html.

<!DOCTYPE html>
<html>
   <head>
      <title>Font Excellent</title>
      <link rel="stylesheet" href="styles.css">
   </head>
   <body>
      <h1>Font Excellent</h1>
      <!-- TODO -->
   </body>
</html> 
Enter fullscreen mode Exit fullscreen mode

Создадим файл styles.css и подключим в нём наш шрифт.

@font-face {
    font-family: "Font Excellent";
    src: url("fonts/icons.woff2") format('woff2'),
         url("fonts/icons.woff") format('woff'),
         url("fonts/icons.ttf") format('truetype');
    font-weight: 400;
    font-style: normal;
}
Enter fullscreen mode Exit fullscreen mode

Добавим в styles.css стили для символов шрифта.

/* Общие настройки для всех символов шрифта */
.icon::before {
    display: inline-block;
    font-family: "Font Excellent";
    font-size: 8rem;
    font-weight: 400;
    font-style: normal;
    font-variant: normal;
    text-rendering: auto;
    -webkit-font-smoothing: antialiased;
}

/* Для лица с улыбкой */
.icon-smile::before {
    content: "\0073";
}
/* Для пальца вверх */
.icon-thumbs-up::before {
    content: "\0074";
}
/* Для чашки */
.icon-cup::before {
    content: "\0063";
}

/* Анимация цвета и другие стили */
body {
   display: flex;
   flex-direction: column;
   align-items: center;
}
.icon {
    margin: 0 1rem;
    animation: color-animation 4s linear infinite;
}
.icon-cup {
   --color-1: #df8453;
   --color-2: #4195b8;
   --color-3: #e4a3a2;
}
.icon-smile {
   --color-1: #dfaf48;
   --color-2: #aed4d0;
   --color-3: #bff2a7;
}
.icon-thumbs-up {
    --color-1: #aed4d0;
    --color-2: #e19c9b;
    --color-3: #a9cfcb;
}
@keyframes color-animation {
    0%    {color: var(--color-1)}
    32%   {color: var(--color-1)}
    33%   {color: var(--color-2)}
    65%   {color: var(--color-2)}
    66%   {color: var(--color-3)}
    99%   {color: var(--color-3)}
    100%  {color: var(--color-1)}
}
Enter fullscreen mode Exit fullscreen mode

Здесь мы выбрали общие настройки для icon класса и указали содержимое - кодировку символа для каждого класса наших картинок content: "\XXXX", где XXXX - CSS Entity значение. При создании шрифта, его символами мы выбрали буквы c, s и t, например, у знака s CSS Entity - 0073. Если в FontForge кликнуть на символ, то под строкой меню можно увидеть кодировку символов. Например, кликнув на t его код будет указан в виде U+0074, значит, в css мы запишем: content: "\0074";.

С css мы закончили, осталось только добавить в наш html шаблон наши картинки.

<!DOCTYPE html>
<html>
<head>
    <title>Font Excellent</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <h1>Font Excellent</h1>
    <div>
        <i class="icon icon-cup"></i>
        <i class="icon icon-smile"></i>
        <i class="icon icon-thumbs-up"></i>
    </div>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Теперь, открыв файл index.html в браузере, мы должны увидеть следующее:

Image description

Ставьте лайки, подписывайтесь на блог.
Спасибо за внимание.

Sentry blog image

How I fixed 20 seconds of lag for every user in just 20 minutes.

Our AI agent was running 10-20 seconds slower than it should, impacting both our own developers and our early adopters. See how I used Sentry Profiling to fix it in record time.

Read more

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More