탕스로그

[오류해결] Next.js에서 반응형 웹 만들기 본문

Front-end

[오류해결] Next.js에서 반응형 웹 만들기

taaang 2023. 6. 21. 14:15

반응형 웹을 만들기 위해 desktop, mobile 을 이름으로 한 css 속성을 정의하고 페이지 컴포넌트 내에서 필요한 부분에 사용함으로써 반응형 웹을 제작하려고 했었다.

❗️ 오류가 났었던 코드

 

1. desktop, mobile css 정의 - 기준 1024px

import { css } from '@emotion/react';

export const desktop = css`
  display: flex;
  @media (max-width: 1023px) {
    display: none;
  }
`;

export const mobile = css`
  display: none;
  @media (max-width: 1023px) {
    display: flex;
  }
`;

 

2. 원하는 부분에 CSS 적용

import { Flex, Text, desktop, mobile } from '@ceos-fe/ui';

export const Title = ({
  title,
  explain,
}: {
  title: string;
  explain: string[];
}) => {
	// ...
  return (
    <Flex direction="column" margin="80px 0" webGap={12} mobileGap={10}>
    {/* ... */}
      <Flex direction="row" css={desktop}>
        <Text webTypo="Body1">{webString}</Text>
      </Flex>
      <Flex direction="column" css={mobile}>
        {explain.map((ex) => {
          return <Text mobileTypo="Body1">{ex}</Text>;
        })}
      </Flex>
    </Flex>
  );
};

 

❗️ 오류 화면

위와 같이 작성하면, 첫 로딩 시에는

 

1. desktop

2. mobile

과 같이 잘 작동하지만,

새로고침 시에 다음과 같이 mobile 화면에서 desktop css 까지 보여지는 문제가 있었다.

 

 

❗️ 해결방법

css 속성으로 작성해버리면, Next.js에서는 재렌더링 시 css 정보를 캐싱해놓기 때문에 display:none 속성이 제대로 반영되지 않을 수 있다고 한다. 이에, styled를 이용해서 컴포넌트화를 함으로써 해결했다.

 

import styled from '@emotion/styled';

export const Desktop = styled.div`
  display: flex;
  @media (max-width: 1023px) {
    display: none;
  }
`;

export const Mobile = styled.div`
  display: none;
  @media (max-width: 1023px) {
    display: flex;
  }
`;
import { Desktop, Flex, Mobile, Text } from '@ceos-fe/ui';
export const Title = ({
  title,
  explain,
}: {
  title: string;
  explain: string[];
}) => {
// ...
  return (
    <Flex direction="column" margin="80px 0" webGap={12} mobileGap={10}>
      <Desktop>
        <Flex direction="row">
          <Text webTypo="Body1">{webString}</Text>
        </Flex>
      </Desktop>
      <Mobile>
        <Flex direction="column">
          {explain.map((ex) => {
            return <Text mobileTypo="Body1">{ex}</Text>;
          })}
        </Flex>
      </Mobile>
    </Flex>
  );
};

'Front-end' 카테고리의 다른 글

Recoil 과 Redux 중 뭘 쓰면 좋을까?  (2) 2023.05.02
모노레포(Monorepo) 구축기  (0) 2023.02.16
Comments