Как функционирует FontFace?

Добрый день! 

Я изучаю шрифты, чтобы внедрить возможность выбора шрифтов в своем веб-редакторе. Я выбрал гарнитуру Roboto, которую можно найти по следующей ссылке: <a href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&amp;display=swap" rel="nofollow">https://fonts.googleapis.com/css2?family=Roboto:it...</a>. 

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

<pre><code class="css">/* latin */
@font-face {
  font-family: 'Roboto';
  font-style: normal;
  font-weight: 100 900;
  font-stretch: 100%;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBHMdazQ.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}</code></pre>

Вот как я добавляю шрифт в документ: 

<pre><code class="javascript">loadFontToDocument(fontFamily: string, src: string) {
        return new Promise&lt;FontFace&gt;(function(resolve, reject) {
            const font = new FontFace(fontFamily, "url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBHMdazQ.woff2)");
            font.load().then(function(loadedFont) {
                document.fonts.add(loadedFont);
                resolve(font);
            }).catch(function(_error) {
                reject("document font loading error. Source " + src);
            });

            setTimeout(() =&gt; {
                reject("d...

В связи с этим, как правильно интегрировать несколько шрифтов из одной гарнитуры в мой веб-редактор, чтобы пользователи могли их выбирать?
  • 23 января 2025 г. 10:24
Ответы на вопрос 1
Для интеграции нескольких шрифтов из одной гарнитуры (например, Roboto) в ваш веб-редактор с возможностью выбора пользователями, вам нужно следовать нескольким шагам. Я объясню, как правильно это сделать.

### 1. Определите необходимые шрифты

Сначала определите, какие именно стили и веса шрифта вы хотите сделать доступными для пользователей. Например, вам могут понадобиться:
- Roboto Thin (100)
- Roboto Light (300)
- Roboto Regular (400)
- Roboto Medium (500)
- Roboto Bold (700)
- Roboto Black (900)

### 2. Реализация @font-face

Для каждого из выбранных вами стилей и весов добавьте `@font-face` в ваш CSS (или в ваш CSS-поддерживаемый код). Используйте URL для соответствующих файлов шрифтов. Пример для нескольких шрифтов:

```css
@font-face {
    font-family: 'Roboto';
    font-style: normal;
    font-weight: 100;
    src: url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aG4FRHsn8U.woff2) format('woff2');
}

@font-face {
    font-family: 'Roboto';
    font-style: normal;
    font-weight: 300;
    src: url(https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aG8FR1aK8U.woff2) format('woff2');
}

/* Добавьте другие стили аналогичным образом */
```

### 3. Загружайте шрифты с помощью JavaScript

Теперь вы можете использовать `FontFace` API для загрузки шрифтов программно:

```javascript
function loadFontToDocument(fontFamily, fontWeight, src) {
    return new Promise(function(resolve, reject) {
        const font = new FontFace(fontFamily, `url(${src})`, {
            style: 'normal',
            weight: fontWeight
        });
        
        font.load().then(function(loadedFont) {
            document.fonts.add(loadedFont);
            resolve(loadedFont);
        }).catch(function(error) {
            reject(`Font loading error for ${fontFamily} ${fontWeight}: ${error}`);
        });
    });
}

// Пример загрузки шрифтов
Promise.all([
    loadFontToDocument('Roboto', '100', 'https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aG4FRHsn8U.woff2'),
    loadFontToDocument('Roboto', '300', 'https://fonts.gstatic.com/s/roboto/v47/KFO7CnqEu92Fr1ME7kSn66aG8FR1aK8U.woff2'),
    // добавьте загрузку других шрифтов
]).then(function() {
    console.log('All fonts loaded');
}).catch(function(error) {
    console.error(error);
});
```

### 4. Рендеринг и выбор шрифтов

Создайте пользовательский интерфейс (например, выпадающий список), который позволит пользователю выбирать разные стили шрифтов. При выборе нового стиля изменяйте CSS-стили вашего текстового поля или элемента, где применяются шрифты.

Пример HTML:

```html
<select id="fontSelector">
    <option value="100">Roboto Thin</option>
    <option value="300">Roboto Light</option>
    <option value="400">Roboto Regular</option>
    <option value="500">Roboto Medium</option>
    <option value="700">Roboto Bold</option>
    <option value="900">Roboto Black</option>
</select>

<div id="textSample">Пример текста</div>
```

Добавьте обработчик событий для изменения шрифта:

```javascript
document.getElementById('fontSelector').addEventListener('change', function(event) {
    const selectedWeight = event.target.value;
    document.getElementById('textSample').style.fontFamily = 'Roboto';
    document.getElementById('textSample').style.fontWeight = selectedWeight;
});
```

### Заключение

Следуя этим шагам, вы сможете интегрировать несколько шрифтов из одной гарнитуры в ваш веб-редактор и позволить пользователям выбирать нужный им стиль. Убедитесь, что все необходимые `@font-face` правила определены и загружаются через JavaScript, а также что вы правильно обновляете интерфейс при выборе пользователем нового шрифта.
Похожие вопросы