이 영역을 누르면 첫 페이지로 이동
자라자 블로그의 첫 페이지로 이동

자라자

페이지 맨 위로 올라가기

자라자

개발자를 준비하는 자라자의 블로그입니다.

디자이너의 요구사항에 맞춰 개발하기

  • 2022.02.05 15:23
  • Tech Note

들어가며

인테리어 컨설팅 중개 플랫폼 온룸을 개발하면서 가장 처음 부딛친 난관은, "어떻게 화면을 구성할 것인가" 였다. 그 말은 무슨 뜻이냐면, 디자이너의 요구사항을 어떤 식으로 충족시킬 것인지와 같은 말이다.

 

디자이너의 작업 결과물

디자인 팀에서 내게 넘겨준 작업 결과물은 두 가지로, Figma에 Zeplin을 연동하여 볼 수 있도록 작업해서 넘겨줬다.

ownroom Figma

position:absolute Eng

위치:절대
 
{"mean":["<dicbridgeLine>","오픈","<dicbridgeLine>","예제","<dicbridgeLine>","VLIVE 자막"],"word":"positionabsolute","basicWord":"positionabsolute","soundWord":"positionabsolute","phoneticSymbol":""}

ownroom Zeplin

 

Figma로 전체 화면 구조를 한 눈에 볼 수 있고, 세부적인 css를 제플린으로 알기가 쉽다. 그런데 css 요소를 다 알고 있다고 하더라도, 구현할 수 있는 방법은 천차만별이기 때문에 좀 더 효율적인 구조로 요소들을 배치하고 싶었다. 이전까지 개발을 할 때에는 간단한 SPA이고 순전히 나 혼자 개발을 했기 때문에 '모나보이지 않을 정도'로 css를 퉁칠 수 있었다. 그런데 디자인 요구사항이 생기니 css 요구사항이 픽셀단위로 정확히 구현되어야 했고, 디자이너가 요구하는 불규칙적인 규칙 속에서 나만의 규칙으로 요소들을 구현해야 했다.

디자인 시스템을 살펴보면 화면 요소는 8 Grid System을 "유연하게" 따른다(그래서 불규칙적인 규칙이라고 했다.) 그래서 아예 그리드를 fix해놓고 그 안에서만 컴포넌트를 구현하면 되는 것이 아니라, 종종 밖으로 벗어나는 녀석들에 대한 처리도 해야한다.

위 그림처럼 총 3가지 너비를 고려해야 했는데, 8 grid system의 너비인 1136px, 그리고 디자인어가 생각하는 100%의 크기인 1920px, 그리고 실제 브라우저의 innerWidth이다. 1920px과 브라우저 폭을 달리 구분한 이유는 1920px를 따로 구분하지 않게 되면 줌 아웃 했을 때 그림의 크기가 왜곡되어 보일 수 있기 때문이다. 또, 반응형을 고려하여 브라우저 폭이 작아질 때에 대한 대비도 해야했다. 그리고, 컴포넌트를 배치할 때 재사용할 수 있는 구조로 만들면 좋겠다는 생각이 들었다.

 

반응형 컨테이너 만들기

그래서 내가 선택한 방법은 반응형 컨테이너를 만드는 법이었다. 컨테이너의 코드는 아래와 같다.

import styled from 'styled-components';

interface IContainer {
  type?: 'column' | 'row';
  width?: string;
  height?: string;
  position?: 'static' | 'relative' | 'absolute' | 'fixed';
  justifyContent?:
    | 'start'
    | 'center'
    | 'right'
    | 'left'
    | 'space-between'
    | 'space-evenly';
  alignItems?: 'start' | 'center';
}

export const Container = styled.div<IContainer>`
  position: ${({ position }) => position || 'static'};
  width: ${({ width }) => width || '100%'};
  height: ${({ height }) => height || '100%'};

  display: flex;
  flex-direction: ${({ type }) => type || 'row'};
  justify-content: ${({ justifyContent }) => justifyContent || 'center'};
  align-items: ${({ alignItems }) => alignItems || 'center'};
  overflow: hidden;

  @media all and (max-width: 1136px) {
    width: 100%;
  }
  /* 
  border: 1px blue solid; */
`;

먼저 interface를 정의해서 옵션을 주면 컨테이너의 속성을 조작할 수 있도록 했고, 옵션이 없으면 특정 기본값을 가지도록 했다. 즉, 기본적으로는 너비높이 100%에 flrx, center를 만족하는 컨테이너지만 옵션 유무에 따라 정렬이나 너비 높이 등이 고정될 수 있는 조건이다. 이렇게 하면 컨테이너를 만들 때마다 따로 styled.div로 빼서 정의해주는 반복적인 작업을 없앨 수 있다. 그리고 주석 처리 해놓은 border로 컨테이너를 이따금씩 시각화해서 볼 수 있다.

 

구체적인 예시

border를 활성화 하면 다음과 같이 파란색으로 컨테이너가 어떤 식으로 배치되어있는 지 보인다. 참고로 아래 사진에서 하단 배너의 실질적인 폭이 위의 navbar나 최상단 배너보다 좁아지는 걸 볼 수 있는데, 이것은 디자이너의 수정요청에 의한 결과이다..

각각의 요소들은 컨테이너 내에서 position:absolute를 사용하여 위치를 맞춰 주었다. 조금 더 구체적인 예시를 들어보자. 만약 네비게이션 바를 배치하기 위한 컨테이너를 짜고싶다면, 네비게이션 바가 높이가 80px이기 때문에 80px짜리를 만든다. width를 입력하지 않으면 우선적으로 브라우저 폭 전체에 해당하는 컨테이너가 생긴다. 그리고 그 속에 width가 1920인 컨테이너와 1136인 컨테이너를 겹쳐서 넣는다. 코드로 보자면 아래와 같다.

const Navbar = ()=>{
	//코드 생략
    
 return (
    <>
      <Container height="80px" position="fixed" style={navbarCSS}>
        <Container width="1920px">
          <Container width="1136px" position="relative">
          	//...내부요소 구현
            //코드 생략
            )
            }

이렇게 컨테이너를 여러 겹으로 겹쳐 놓아도 반응형으로  브라우저 폭이 자기 너비보다 작을 경우 width가 100%가 되도록 설정했기 때문에 아래처럼 컨테이너들이 합쳐지면서 어느 정도 브라우저 폭 변화에 대응하는 움직임을 보여줄 수 있다.

위와 같은 방법을 통해 디자이너의 요구사항을 어떻게 처리해야할 지에 대한 답을 낼 수 있었다. 컨테이너의 재사용을 통해서 화면에 효율적으로 요소들을 배치할 수 있었다.

 
 
 
 
 
 
 
 

'Tech Note' 카테고리의 다른 글

잘하는 프론트엔드 개발자란?  (0) 2022.09.03
온룸 코드 리팩토링하기 - 1편 : 안티 닌자 코드  (0) 2022.06.24

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 잘하는 프론트엔드 개발자란?

    잘하는 프론트엔드 개발자란?

    2022.09.03
  • 온룸 코드 리팩토링하기 - 1편 : 안티 닌자 코드

    온룸 코드 리팩토링하기 - 1편 : 안티 닌자 코드

    2022.06.24
다른 글 더 둘러보기

정보

자라자 블로그의 첫 페이지로 이동

자라자

  • 자라자의 첫 페이지로 이동

검색

메뉴

  • 🏠 HOME
  • 💡 ABOUT
  • 💻 GITHUB

카테고리

  • 분류 전체보기 (91)
    • Tech Note (3)
    • Dev Log (11)
    • Study Log (11)
    • Settings (3)
    • PS (53)
      • Programmers (21)
      • BOJ (32)
    • Diary (10)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 리액트
  • 공식문서읽기
  • ㅣ

나의 외부 링크

정보

자라자의 자라자

자라자

자라자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 자라자. Designed by Fraccino.

티스토리툴바