reactjs 如何在没有.css文件的React中应用@font-face

clj7thdc  于 2023-06-22  发布在  React
关注(0)|答案(3)|浏览(178)

我生成了“@font-face { font-family:'RFDewiExpanded-Thin'; font-weight:100;字体样式:正常; src:........}".如何在没有外部文件的情况下在React中应用它?
我不知道如何解决这个问题。我知道动态CCS导入需要外部文件。

5sxhfpxr

5sxhfpxr1#

我不知道你是否可以在本机中完成这一任务,但是,如果使用CSS-in-JS库是可能的,你也许可以做到这一点,并将所有的东西保存在一个文件中。例如JSS、Emotion、Stylled JSX等
您无法导入单独的.css文件是否有原因?你可以用变量和CSS导入在CSS中做动态的事情。我用过/推荐的一个方法是postcss-import

q8l4jmvw

q8l4jmvw2#

你可以直接在React组件中定义@font-face规则。
在useEffect钩子中,创建了一个新的FontFace对象。然后将其添加到document.fonts集合中。要在卸载组件时清理字体资源,可以从useEffect钩子返回一个cleanup函数。

示例:

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;
zbdgwd5y

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);
  };

相关问题