当前位置: 首页 > news >正文

react js 查看字体效果

起因, 目的:

想查看某个字体,对中英文的支持情况。
效果图:
请添加图片描述

完整项目见这里, 需要积分下载,不然的话,显得太水了。

过程:

  1. AI 对话, 生成代码。
  2. 我检查运行, 来回修改。
  3. 写个博客,记录过程。
核心代码 App.js
import React, { useState, useEffect, useCallback } from 'react';
import { ToastContainer, toast } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import './App.css';
import Header from './components/Header';
import FontSelector from './components/FontSelector';
import TextDisplay from './components/TextDisplay';const fonts = [{ name: 'Arial' },{ name: 'Noto Sans' },{ name: 'SimSun' },{ name: 'Roboto' },{ name: 'Times New Roman' },{ name: 'Microsoft YaHei' },{ name: 'Consolas' },{ name: 'Open Sans' },{ name: 'Noto Sans SC' },{ name: 'Lora' },
];const defaultFont = 'Arial';function App() {const [selectedFont, setSelectedFont] = useState(defaultFont);const [englishFont, setEnglishFont] = useState(defaultFont);const [chineseFont, setChineseFont] = useState(defaultFont);const [searchTerm, setSearchTerm] = useState('');const checkFontSupport = async (fontName, text) => {try {const normalizedFontName = fontName.trim();if (['Arial', 'Microsoft YaHei', 'SimSun', 'Consolas', 'Times New Roman'].includes(normalizedFontName)) {if (normalizedFontName === 'Arial' || normalizedFontName === 'Consolas' || normalizedFontName === 'Times New Roman') {return text === 'A';}if (normalizedFontName === 'Microsoft YaHei') {return true;}if (normalizedFontName === 'SimSun') {return text === '中';}}await document.fonts.load(`20px "${normalizedFontName}"`);const isFontAvailable = document.fonts.check(`20px "${normalizedFontName}"`);if (!isFontAvailable) {console.log(`字体 ${normalizedFontName} 不可用`);return false;}return true;} catch (error) {console.error(`检测字体 ${fontName} 失败:`, error);return false;}};const handleFontChange = useCallback((fontName) => {const timer = setTimeout(async () => {setSelectedFont(fontName);const supportsEnglish = await checkFontSupport(fontName, 'A');const supportsChinese = await checkFontSupport(fontName, '中');const warnings = [];if (!supportsEnglish) {warnings.push('英文');setEnglishFont(defaultFont);} else {setEnglishFont(fontName);}if (!supportsChinese) {warnings.push('中文');setChineseFont(defaultFont);} else {setChineseFont(fontName);}if (warnings.length > 0) {toast.warn(`字体 ${fontName} 不支持${warnings.join('和')},将使用默认字体 ${defaultFont}`);}}, 100);return () => clearTimeout(timer);}, []);useEffect(() => {const link = document.createElement('link');link.href ='https://fonts.font.im/css2?family=Noto+Sans&family=Roboto&family=Open+Sans&family=Noto+Sans+SC&family=Lora&display=swap';link.rel = 'stylesheet';document.head.appendChild(link);return () => document.head.removeChild(link);}, []);const filteredFonts = fonts.filter((font) =>font.name.toLowerCase().includes(searchTerm.toLowerCase()));return (<div className="App"><Header /><FontSelectorfonts={filteredFonts}selectedFont={selectedFont}onFontChange={handleFontChange}searchTerm={searchTerm}onSearchChange={setSearchTerm}/><TextDisplay englishFont={englishFont} chineseFont={chineseFont} /><ToastContainer /></div>);
}export default App;

过程简述

初始:4 种字体,静态检测,单行文本。
扩展:10 种字体,动态检测(checkFontSupport),添加搜索框、Google Fonts 链接、中英文各 3 行。

问题:

  • 字体检测失败:改进 checkFontSupport,本地字体特殊处理。
  • Google Fonts 加载:切换到 fonts.font.im。
  • 重复警告:合并为单一警告。

运行:

npm install react-toastify
npm start

然后访问:http://localhost:3001

结论 + todo

  • 大体效果还可以。
  • 搜索框,还是有点问题。

相关文章:

  • 「Mac畅玩AIGC与多模态13」开发篇09 - 基于多插件协同开发智能体应用(天气+名言查询助手)
  • 从0到上线,CodeBuddy 如何帮我快速构建旅游 App?
  • 网络编程——Socket 编程详解(TCP / UDP)
  • 同质化的旅游内核
  • 跟韩学AiOps系列之2025学MySQL系列_如何在MySQL中开启和提交事务?!
  • 贪心算法解决会议安排问题
  • 【python】【UV】一篇文章学完新一代 Python 环境与包管理器使用指南
  • 【自然语言处理与大模型】使用Xtuner进行QLoRA微调实操
  • 【AI面试准备】AI误判案例知识库优化方案
  • MySQL基础关键_005_DQL(四)
  • 微信小程序
  • string--OJ1
  • [ Qt ] | 第一个Qt程序
  • 安装深度环境anaconda+cuda+cudnn+pycharm+qt+MVS
  • kaggle人工智能竞赛:通过声纹识别生物种类
  • 双链表详解
  • LeetCode[102]二叉树的层序遍历
  • 铸铁平台厂家:确保测试环境的高稳定性是试验铁地板的使命
  • 手机的数据楚门世界是如何推送的
  • 数据结构与算法:图论——最短路径
  • 成为中国骑手“孵化器”,环球马术冠军赛是最好的历练舞台
  • 准80后遵义市自然资源局局长陈清松任仁怀市委副书记、代市长
  • 因雷雨、沙尘等天气,这些机场航班运行可能受影响
  • 短剧迷|《权宠》一出,《名不虚传》
  • 五一假期上海口岸出入境客流总量预计达59.4万人,同比增约30%
  • 中方拟解除对5名欧洲议会议员制裁?外交部:望中欧立法机构相向而行