You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中如何通过HTTP请求加载二进制TTF字体到DOM

加载字节数组形式的字体到DOM的实现方法

核心步骤说明

要将API返回的字节数组字体加载到DOM,需要依次完成请求字节数组、转换为可访问资源、注入字体样式三个核心环节,以下是具体实现代码:


1. Angular环境(使用HttpClient)

如果是在Angular项目中,利用HttpClient请求并处理的代码如下:

import { HttpClient } from '@angular/common/http';

constructor(private http: HttpClient) {}

async loadFontFromAPI() {
  // 1. 发送GET请求获取字节数组,指定响应类型为arraybuffer
  const fontArrayBuffer = await this.http.get('/api/your-font-endpoint', {
    responseType: 'arraybuffer'
  }).toPromise();

  // 2. 将数组缓冲区转换为Blob,注意指定正确的字体MIME类型(如woff2/woff/ttf)
  const fontBlob = new Blob([fontArrayBuffer], { type: 'font/woff2' });
  const fontUrl = URL.createObjectURL(fontBlob);

  // 3. 动态创建style标签,注入@font-face规则
  const styleElement = document.createElement('style');
  styleElement.textContent = `
    @font-face {
      font-family: 'CustomFont';
      src: url(${fontUrl}) format('woff2');
      font-weight: normal;
      font-style: normal;
    }
  `;
  document.head.appendChild(styleElement);

  // 4. 为目标DOM元素应用字体
  document.body.style.fontFamily = 'CustomFont, sans-serif';

  // 可选:页面卸载时释放ObjectURL,避免内存泄漏
  window.addEventListener('unload', () => {
    URL.revokeObjectURL(fontUrl);
  });
}

2. 原生JavaScript环境

如果是纯前端项目,使用原生fetchAPI替代HttpClient的实现:

async loadFontFromAPI() {
  try {
    // 1. 请求字节数组
    const response = await fetch('/api/your-font-endpoint');
    if (!response.ok) throw new Error('Font request failed');
    const fontArrayBuffer = await response.arrayBuffer();

    // 2. 转换为Blob并生成ObjectURL
    const fontBlob = new Blob([fontArrayBuffer], { type: 'font/woff2' });
    const fontUrl = URL.createObjectURL(fontBlob);

    // 3. 注入字体样式
    const style = document.createElement('style');
    style.innerHTML = `
      @font-face {
        font-family: 'CustomFont';
        src: url(${fontUrl}) format('woff2');
      }
    `;
    document.head.appendChild(style);

    // 4. 应用字体
    document.querySelector('.target-element').style.fontFamily = 'CustomFont';

    // 清理资源
    window.addEventListener('beforeunload', () => {
      URL.revokeObjectURL(fontUrl);
    });
  } catch (err) {
    console.error('加载字体失败:', err);
  }
}

关键注意事项

  • MIME类型匹配:根据字体实际格式设置正确的MIME类型,常见值:
    • WOFF2: font/woff2
    • WOFF: font/woff
    • TTF: font/ttf
  • 跨域问题:确保API接口配置了正确的CORS头,允许前端域名跨域请求
  • 内存管理:使用URL.revokeObjectURL在合适时机释放资源,避免内存泄漏

内容的提问来源于stack exchange,提问作者user2132124

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:24:57