frontend/오답노트

NextJS + StyledComponents : Font Flickering Issue (최초 로딩 시 폰트 깜빡임 문제 해결)

NERD는 한글로 류호진 2022. 8. 31. 14:26

문제 : NextJS와 StyledComponents로 작업한 프로젝트에서 createGlobalStyle 이라는 StyledComponents의 함수를 사용하여 전역 폰트를 지정하였을 때 폰트 깜빡임 현상이 발생

- GlobalFonts.tsx

import { createGlobalStyle } from "styled-components";

const GlobalFonts = createGlobalStyle`
    @font-face {
        font-family: 'NotoSansKR';
        src:local('NotoSansKR'),
        url('/assets/fonts/NotoSansKR-Black.woff2') format('woff2'),
        url('/assets/fonts/NotoSansKR-Black.woff') format('woff'),
        url('/assets/fonts/NotoSansKR-Black.otf') format('opentype');
        font-weight: 900;
        font-style: normal;
    }

    @font-face {
        font-family: 'NotoSansKR';
        src:local('NotoSansKR'),
        url('/assets/fonts/NotoSansKR-Bold.woff2') format('woff2'),
        url('/assets/fonts/NotoSansKR-Bold.woff') format('woff'),
        url('/assets/fonts/NotoSansKR-Bold.otf') format('opentype');
        font-weight: 700;
        font-style: normal;
    }
`;

export default GlobalFonts;

- Root.tsx

import { ThemeProvider } from "styled-components";
import GlobalFonts from "styles/GlobalFonts";
import GlobalStyles from "styles/GlobalStyles";
import { lightTheme } from "styles/Theme";
const Root = ({ children }: any) => {
  return (
    <>
      <ThemeProvider theme={lightTheme}>
        <GlobalFonts />
        <GlobalStyles />
        {children}
      </ThemeProvider>
    </>
)}
export default Root;

위와 같은 방식으로 전역 폰트를 설정하게 되면 최초 로딩시에 폰트가 설정되는 시점에 의해서 폰트깜빡임이 발생한다.

 

해결방법 : 

 

- fonts.css

@font-face {
    font-family: 'NotoSansKR';
    src: local('NotoSansKR'),
        url('/assets/fonts/NotoSansKR-Black.woff2') format('woff2'),
        url('/assets/fonts/NotoSansKR-Black.woff') format('woff'),
        url('/assets/fonts/NotoSansKR-Black.otf') format('opentype');
    font-weight: 900;
    font-style: normal;
}

@font-face {
    font-family: 'NotoSansKR';
    src: local('NotoSansKR'),
        url('/assets/fonts/NotoSansKR-Bold.woff2') format('woff2'),
        url('/assets/fonts/NotoSansKR-Bold.woff') format('woff'),
        url('/assets/fonts/NotoSansKR-Bold.otf') format('opentype');
    font-weight: 700;
    font-style: normal;
}

_app.tsx

import Root from "components/common/Root";
import type { AppProps } from "next/app";

import '../styles/fonts.css'

function MyApp({ Component, pageProps }: AppProps) {
  return (
    <>
        <Root>
          <Component {...pageProps} />
        </Root>
    </>
  );
}

export default MyApp;

위와 같은 방식으로 css파일 형식으로 font를 설정하여 주고 이를 최상단 _app.js에 import하여 사용하면 폰트깜빡임 현상이 해결된다.

반응형