我生成了“@font-face { font-family:'RFDewiExpanded-Thin'; font-weight:100;字体样式:正常; src:........}".如何在没有外部文件的情况下在React中应用它?我不知道如何解决这个问题。我知道动态CCS导入需要外部文件。
5sxhfpxr1#
我不知道你是否可以在本机中完成这一任务,但是,如果使用CSS-in-JS库是可能的,你也许可以做到这一点,并将所有的东西保存在一个文件中。例如JSS、Emotion、Stylled JSX等您无法导入单独的.css文件是否有原因?你可以用变量和CSS导入在CSS中做动态的事情。我用过/推荐的一个方法是postcss-import
q8l4jmvw2#
你可以直接在React组件中定义@font-face规则。在useEffect钩子中,创建了一个新的FontFace对象。然后将其添加到document.fonts集合中。要在卸载组件时清理字体资源,可以从useEffect钩子返回一个cleanup函数。
document.fonts
示例:
import { useEffect, useRef } from 'react'; const MyComponent = () => { const elementRef = useRef(null); useEffect(() => { const fontFace = new FontFace( 'RFDewiExpanded-Thin', 'url(pathToYourFontFile.woff2)' ); document.fonts.add(fontFace); fontFace.load() .then(() => { if (elementRef.current) { elementRef.current.style.fontFamily = 'RFDewiExpanded-Thin'; elementRef.current.style.fontWeight = 100; elementRef.current.style.fontStyle = 'normal'; } }); return () => { fontFace.loaded.then(() => { document.fonts.remove(fontFace); }); }; }, []); return ( <div ref={elementRef}> My Component Here </div> ); }; export default MyComponent;
zbdgwd5y3#
export function loadFont(fontStyle) { var newStyle = document.createElement('style'); newStyle.appendChild(document.createTextNode(fontStyle)); document.body.appendChild(newStyle); } const uploadFile = (event) => { const file = event.target.files[0]; const fileName = file.name; const fileNameL = fileName.toLowerCase(); const fontName = fileName.split('.')[0]; const fileExtension = fileName.split('.')[1]; let fontWeight = 'normal'; let fontStyle = 'normal'; if (fileNameL.includes('bold')) { if (fileNameL.includes('semibold')) { fontWeight = '600'; } else { fontWeight = 'bold'; } } else if (fileNameL.includes('medium')) { fontWeight = '500'; } else if (fileNameL.includes('thin')) { fontWeight = '100'; } if (fileNameL.includes('italic')) { fontStyle = 'italic'; } const reader = new FileReader(); reader.onload = (event) => { const fontData = event.target.result; const base64 = _arrayBufferToBase64(fontData, (base64data) => base64data); const fontCSS = `@font-face { font-family: '${fontName}';`enter code here` src: url('data:${fileExtension};base64,${base64}') format('${fileExtension}'); font-weight: ${fontWeight}; font-style: ${fontStyle}; }`; const data = { css: fontCSS, fontName, fileName }; loadFont(fontCSS); save(fontName, data); }; reader.readAsArrayBuffer(file); };
3条答案
按热度按时间5sxhfpxr1#
我不知道你是否可以在本机中完成这一任务,但是,如果使用CSS-in-JS库是可能的,你也许可以做到这一点,并将所有的东西保存在一个文件中。例如JSS、Emotion、Stylled JSX等
您无法导入单独的.css文件是否有原因?你可以用变量和CSS导入在CSS中做动态的事情。我用过/推荐的一个方法是postcss-import
q8l4jmvw2#
你可以直接在React组件中定义@font-face规则。
在useEffect钩子中,创建了一个新的FontFace对象。然后将其添加到
document.fonts
集合中。要在卸载组件时清理字体资源,可以从useEffect钩子返回一个cleanup函数。示例:
zbdgwd5y3#