React 반응 형 웹 | [코딩 독학] 반응형웹을 적용하기 전 고려해야 할 것들 | 반응형 웹 만들기 | Viewport | Media Query 답을 믿으세요

당신은 주제를 찾고 있습니까 “react 반응 형 웹 – [코딩 독학] 반응형웹을 적용하기 전 고려해야 할 것들 | 반응형 웹 만들기 | viewport | media query“? 다음 카테고리의 웹사이트 https://you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: https://you.tfvp.org/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 타모디자인TAMO 이(가) 작성한 기사에는 조회수 9,659회 및 좋아요 237개 개의 좋아요가 있습니다.

react 반응 형 웹 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [코딩 독학] 반응형웹을 적용하기 전 고려해야 할 것들 | 반응형 웹 만들기 | viewport | media query – react 반응 형 웹 주제에 대한 세부정보를 참조하세요

반응형을 만병통치약쯤으로 남용하는 부분에 대하여
신중해야 할 것을 강조하는 이야기다 보니,
다소 주관적인 부분이 있습니다.

#반응형웹 #웹만들기 #viewport

react 반응 형 웹 주제에 대한 자세한 내용은 여기를 참조하세요.

[React] React-Responsive / 반응형 웹 만들기 – 허도경, limewhale

반응형 웹이란 태블릿, PC, 모바일 등 다양한 디바이스의 해상도로 접근할 때 불편함이 없는 서비스를 제공하기 위해 디바이스에 맞는 해상도에 …

+ 여기에 표시

Source: whales.tistory.com

Date Published: 9/8/2021

View: 3360

리액트 반응형 웹 (react-responsive)

반응형 웹. 테블릿과 스마트폰에서도 인터넷을 사용할수 있게 되자 각 기기 별 *뷰 포트에 따라 사용자들에게 보기 쉽게 하기 위해 웹페이지의 크기가 ‘재조정’ 되는 …

+ 여기에 더 보기

Source: intrepidgeeks.com

Date Published: 2/25/2022

View: 8131

반응형 웹페이지란? (with 간단한 반응형 애플사이트 navBar …

하지만 이번 예제에서는 react-icons를 사용하려고 한다. 레이아웃을 잠시 설명하자면,. 왼쪽이 기본, 오른쪽이 화면이 작아졌을 때에 …

+ 여기에 표시

Source: hong-jh.tistory.com

Date Published: 12/16/2021

View: 3657

[React] 반응형 웹 사이트(홈페이지) 만드는 법

React, 반응형 웹, react-media, 반응형 모바일, 반응형 사이트 반응형 웹페이지(홈페이지)란 사용자의 화면 크기에 반응(Response) 한다고 해서 반응 …

+ 여기에 자세히 보기

Source: dev-guardy.tistory.com

Date Published: 10/26/2022

View: 3248

[React/Typescript] 반응형 네비게이션 만들기

반응형 웹이란 하나의 웹사이트에서 PC, 태블릿/패드, 모바일 등 디스플레이의 종류에 따라 화면의 크기가 자동으로 변하도록 만든 웹페이지 접근 기법을 …

+ 여기에 더 보기

Source: jeewonscript.tistory.com

Date Published: 7/20/2022

View: 7558

리액트 반응형 모듈 사용하기 (react-responsive) – N잡하는 개발자

리액트 프로젝트를 할 때 반응형 을 좀 더 쉽게 사용할 수 있는 반응형 모듈에 … 반응형 모듈 선정 결론부터 말씀드리면 react-. … 웹 개발/React …

+ 여기에 보기

Source: twojobui.tistory.com

Date Published: 7/21/2022

View: 5944

주제와 관련된 이미지 react 반응 형 웹

주제와 관련된 더 많은 사진을 참조하십시오 [코딩 독학] 반응형웹을 적용하기 전 고려해야 할 것들 | 반응형 웹 만들기 | viewport | media query. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[코딩 독학] 반응형웹을 적용하기 전 고려해야 할 것들 | 반응형 웹 만들기 | viewport | media query
[코딩 독학] 반응형웹을 적용하기 전 고려해야 할 것들 | 반응형 웹 만들기 | viewport | media query

주제에 대한 기사 평가 react 반응 형 웹

  • Author: 타모디자인TAMO
  • Views: 조회수 9,659회
  • Likes: 좋아요 237개
  • Date Published: 2021. 2. 15.
  • Video Url link: https://www.youtube.com/watch?v=MKBWugYsk88

[React] React-Responsive / 반응형 웹 만들기

제 글이 조금이라도 유익하였거나 도움이 되었다면 광고 클릭 한번씩만 부탁드릴게요. 제 사이트에 오신 모든 분들에게 감사드립니다.

반응형

1. Responsive Web

반응형 웹이란 태블릿, PC, 모바일 등 다양한 디바이스의 해상도로 접근할 때 불편함이 없는 서비스를 제공하기 위해 디바이스에 맞는 해상도에 따라서 레이아웃과 스타일에 최적화를 해주어 사용자에게 편의성이 높은 UI 화면을 제공합니다.

1-1. Media Query

CSS 2.1부터 미디어 타입으로 단말기 종류에 따라서 다른 스타일을 적용시키는 것이 가능했는데 기기의 특성을 정확히 판단하기가 어려워 많이 사용되지는 않았습니다. CSS 3은 미디어 타입을 개선하여 구체적인 조건을 필요한 스타일을 적용할 수 있도록 확장하였는데 이를 미디어 쿼리라고 합니다.

Syntax

only|not only : 뒤의 조건에서 만 not : 뒤의 조건을 제외한

미디어 타입 all : 모든 미디어 타입 aural : 음성 합성 장치 braille : 점자 표시 장치 handheld : 손으로 들고 다니면서 볼 수 있는 작은 스크린에 대응 print : 인쇄 용도 projection : 프로젝터 screen : 컴퓨터 스크린 tty : 디스플레이 능력이 한정된 릴랙스, 터미널, 수동 이동 장치 등 고정된 글자를 사용하는 미디어 tv : 음성과 영상이 동시 출력되는 장치 embrossed : 페이지에 인쇄된 점자 표시 장치

속성 width : 웹 페이지의 가로길이 height : 웹 페이지의 세로 길이 device-width : 단말기의 가로길이 device-height : 단말기의 세로 길이 orientation : width와 height을 구해

width > height 일 경우 landscape

height > width 일 경우 portrait aspect-ratio : width / height 비율 device-aspect-ratio : 단말기의 물리적인 화면 비율 color-index : 단말기에서 사용하는 최대 색상 수 monochrom : 흑백 컬러만을 사용하는 단말기에서 흰색과 검은색 사이의 단계 resolution : 지원하는 해상도를 판단 color : 단말기에서 사용하는 최대 색상 수의 비트 수

(2의 지수를 뜻한다) ex) 1 은 2, 2는 4, 3 은 8

1-2. Fluid Grid

그리드의 폭을 고정 값이 아닌 em 또는 % 의 값으로 설정하는 것을 뜻하며 가로 폭의 길이의 변화에 따라서 칼럼의 크기가 상대적으로 변하게 하는 방법입니다. 레이아웃에는 변화가 없을 수 있으므로 폭이 많이 좁은 모바일에서 큰 효과를 볼 수 없을 수 있습니다.

1-3. Liquid Layouts

유동형 그리드와 같이 반응형 웹 기법 중 하나로 레이아웃 크기를 유동형 그리드와 같이 상대적 단위로 지정하여 웹의 크기에 따라 유동적으로 변화를 줍니다. 반응형 그리드와 같이 미디어 쿼리를 사용하여 일정 크기가 되면 레이아웃 구조를 바꾸어 줍니다.

2. in React

React에서도 반응형을 대응하기 위해 Medai Query를 이용하여 대응할 수도 있지만 보다 React에서는 보다 편리한 npm인 react-responsive을 제공하기에 react-responsive의 훅을 이용해 구현하는 방법을 알아보려고 합니다.

2-1. react-responsive

타입스크립트를 사용할 경우 : npm install –save @types/react-responsive

react-responsive 모듈 설치

npm install react-responsive

typescript를 사용하는 경우 추가 설치

npm install @types/react-responsive

2-2. useMediaQuery

import React from ‘react’ import { useMediaQuery } from ‘react-responsive’ const Example = () => { const isDesktopOrLaptop = useMediaQuery({ minDeviceWidth: 1224 }) const isBigScreen = useMediaQuery({ minDeviceWidth: 1824 }) const isTabletOrMobile = useMediaQuery({ maxWidth: 1224 }) const isTabletOrMobileDevice = useMediaQuery({ maxDeviceWidth: 1224 }) const isPortrait = useMediaQuery({ orientation: ‘portrait’ }) const isRetina = useMediaQuery({ minResolution: ‘2dppx’ }) return (

) }

react-responsive에서 제공하는 useMediaQuery 훅으로 공식 문서의 예제와 같이 위의 내용을 작성해서 변수를 사용할 수 있습니다. 해당 변수는 조건에 맞는지 아닌지에 대한 true / false 가 들어가게 되는데. 특정 상황에서만 출력을 하도록 하고 싶다면 아래와 같은 예제를 만들 수 있습니다.

import { useMediaQuery } from ‘react-responsive’ const Example = () => { const isDesktopOrLaptop = useMediaQuery( { minDeviceWidth: 1224 }, { deviceWidth: 1600 } // `device` prop ) return (

{isDesktopOrLaptop &&

this will always get rendered even if device is shorter than 1224px, that’s because we overrode device settings with ‘deviceWidth: 1600’.

}

) }

Easy Mode

공식 문서에 Context를 사용하는 방법 / onChange callback을 사용하는 방법이 있으므로 보는 것도 좋을 것 같습니다.

맨 아래에 있는 내용 중 제일 유용할 것 같은 예제입니다.

import { useMediaQuery } from ‘react-responsive’ const Desktop = ({ children }) => { const isDesktop = useMediaQuery({ minWidth: 992 }) return isDesktop ? children : null } const Tablet = ({ children }) => { const isTablet = useMediaQuery({ minWidth: 768, maxWidth: 991 }) return isTablet ? children : null } const Mobile = ({ children }) => { const isMobile = useMediaQuery({ maxWidth: 767 }) return isMobile ? children : null } const Default = ({ children }) => { const isNotMobile = useMediaQuery({ minWidth: 768 }) return isNotMobile ? children : null } const Example = () => (

Desktop or laptop Tablet Mobile Not mobile (desktop or laptop or tablet)

) export default Example

위와 같은 방법도 있지만, 사실 가장 좋은 방법은 hooks로 하나의 컴포넌트 파일을 만들어서 사용할 수도 있습니다.

import React from “react” import { useMediaQuery } from “react-responsive” export const Mobile = ({ children }) => { const isMobile = useMediaQuery({ query: “(max-width:768px)” }); return <>{isMobile && children} } export const Pc = ({ children }) => { const isPc = useMediaQuery({ query: “(min-width:769px)” }); return <>{isPc && children} }

function App() { return ( <> mobile pc ) }

출처 :

반응형

리액트 반응형 웹 (react-responsive)

반응형 웹

테블릿과 스마트폰에서도 인터넷을 사용할수 있게 되자 각 기기 별 *뷰 포트에 따라 사용자들에게 보기 쉽게 하기 위해 웹페이지의 크기가 ‘재조정’ 되는 것을 말합니다.

react-responsive 셋팅 npx create-react-app 작업폴더명 ※ 작업폴더 이름을 react-responsive로 하면 오류가 나니 라이브러리 이름과 다르게 만들자.

cd 작업폴더명 (작업폴더로 이동)

npm install react-responsive npm install @types/react-responsive

(typescript를 사용하는 서비스이기 때문에 아래 모듈도 설치 해줍니다.

useMediaQuery 문법 const 변수명 = useMediaQuery ( { query : “(최소or최대-width : px)” } ) const isPc = useMediaQuery ( { query : “(min-width : 1024px) and (max-width :1920px)” } ) ; Hooks

react-responsive 에서는 useMediaQuery라는 Hook 을 제공합니다.

작동 되는 방식은 useMediaQuery에 media-query조건을 넣어주면 해당 조건에 따라 true , false 를 return 해 줍니다.

코드 참고

import React from “react” import { useMediaQuery } from “react-responsive” function App ( ) { const isPc = useMediaQuery ( { query : “(min-width:1024px)” } ) ; const isTablet = useMediaQuery ( { query : “(min-width:768px) and (max-width:1023px)” } ) ; const isMobile = useMediaQuery ( { query : “(max-width:767px)” } ) ; return ( < div > { isPc && < p > HI PC < / p > } { isTablet && < p > HI Tablet < / p > } { isMobile && < p > HI Mobile < / p > } < / div > ) ; } export default App ;

Hooks가 필요한 이유

Hooks 가 필요한 이유는 아래와 같은 상황에서 유용하게 사용됩니다.

PC에서는 “웹페이지”라는 텍스트를 , 모바일에서는 “모바일” 이라는 텍스트를 보여주려고 할 때 단순 CSS Media-Query로 작성 하려면 매번 두가지 케이스를 작성해서 display : none, block; 으로 나눠서 처리를 해야하는 번거로움이 있습니다.

하지만 Hooks를 사용하면 아래처럼 해결이 가능합니다.

코드참고 (Hooks가 필요한이유)

import React from “react” import { useMediaQuery } from “react-responsive” const isPc = useMediaQuery ( { query : “(min-width:768px)” } ) ; const languageText = isPc ? “웹페이지” : “모바일” return ( < div > { languageText } < / div > ) ; } export default App ;

useMediaQuery 응용 (컴포넌트)

위처럼 사용도 가능하지만 , 따로 하나의 파일에 useMediaQuery를 몰아 놓고 해당 컴포넌트만 import 해서 사용도 가능합니다.

import React from “react” import { useMediaQuery } from “react-responsive” const Mobile : React . FC = ( { children } ) => { const isMobile = useMediaQuery ( { query : “(max-width:767px)” } ) ; return < React . Fragment > { isMobile && children } < / React . Fragment > } const PC : React . FC = ( { children } ) => { const isPc = useMediaQuery ( { query : “(min-width:768px) ” } ) ; return < React . Fragment > { isPc && children } < / React . Fragment > } export { Mobile , PC } ;

import React from “react” import { Mobile , PC } from “./MediaQuery” import “./App.css” function App ( ) { return ( < > < div > < Mobile > < div className = "mobile_container" > 이건 모바일 ! ! < / div > < / Mobile > < / div > < div className = "pc_container" > < PC > 요건 PC ! ! ! < / PC > < / div > < / > ) } export default App ;

결과화면

참고 : N잡하는 개발자

react-responsive

반응형 웹페이지란? (with 간단한 반응형 애플사이트 navBar만들기!)

728×90

우리가 웹사이트를 만들 때 화면이 작아지면 구성요소가 깨지는 현상을 많이 겪어봤을 것이다.

나 또한 그랬고 이를 해결하기 위해서는 반응형 웹페이지로 만들어야 한다는 설루션이 있었다.

또, 모바일 , 테블릿 등에서 웹페이지를 접속할 때, 각기 다른 페이지를 보여줘야 하는데, 반응형을 사용하지 않는다면 각 페이지마다 새로운 파일을 만들어서 각기 다른 버전으로 관리해야 하는데, 그렇게 되면 번거로울 수 있기 때문에 한 파일에서 pc , 모바일 , 태블릿 등을 고려한 웹사이트를 만들 수 있게 반응형 웹페이지를 만드는 것이다.

우리는

미디어 쿼리

라는것을 사용해서 반응형 웹페이지를 만들어 볼 것이다.

미디어 쿼리의 개념은, 각 화면의 비율마다 각각 다른 화면을 보여주자 라는 개념이다.

스타일 시트 내에서

@media

라는 기능이 있는데 이 기능을 사용해서 미디어 쿼리를 구현할 수 있다.

간단한 nav bar을 만들어보면서 반응형 웹페이지는 어떤 식으로 만들어지는지 개념을 알아보도록 하자.

시작하기에 앞서, fontawesome이라는 웹사이트를 추천해주도록 하겠다.

다양한 icon들을 제공하며, 이 icon들의 특징은 바로 font라는 점이다.

fontawesome.com/

하지만 이번 예제에서는 react-icons를 사용하려고 한다.

레이아웃을 잠시 설명하자면,

왼쪽이 기본, 오른쪽이 화면이 작아졌을 때에 레이아웃이다.

파란색 영역이 로고,

주황색 영역이 메뉴,

분홍색 영역은 facebook이나 github로 이동하는 아이콘들이 있는 곳이다.

이제 html을 짜 보도록 하자

대강 이렇게 작성을 하였고,

이제 css로 레이아웃을 구성해보도록 하겠다

똑같진 않지만 느낌을 살려서 구성해보았다.

애플 사이트에서 화면이 작아짐을 감지하면,

이렇게 화면을 바꾸고, 저 작대기 두 개를 누르면

이런 식으로 나오게 된다.

이제 이것을 구현해보도록 하겠다. 참고로 이번 예제는 리액트를 사용하였기 때문에 state를 이용한

메뉴 토글을 구현해보도록 하겠다.

.navBar { background-color: #333333; display: flex; justify-content: space-around; align-items: center; padding: 12px; } .navBar_toggleBtn { display: none; } .navBar_menus { display: flex; list-style: none; justify-content: space-around; width: 50%; } .navBar_menus_menu a { color: #d6d6d6; text-decoration: none; } @media screen and (max-width: 768px) { .navBar { justify-content: space-between; } .navBar_menus { display: none; } .navBar_toggleBtn { display: flex; } .navBar_icons .search { display: none; } }

이렇게 간단하게 미디어 쿼리로 반응형 웹사이트를 만들어보았다.

여기서부터는 외람된 주제이므로 주의!

하지만 우리에게 남은 숙제가 하나 있는데 바로 토글 되는 버튼을 누르면 촤라락! 하게 해 주는 것이다.

그것을 리액트에서 구현하려면 state를 이용하는 방법이 있다.

const [isToggled, setIsToggled] = useState(false);

상태를 선언하고

클릭할 때마다 상태의 부정을 해주자 이제 촤르륵 거릴 것을 navBar밑에 만들어야 한다.

그다음 리액트의 조건부 렌더링을 사용해서 토글이 되는지 확인해보자.

아마 , 정상적으로 토글이 되는 모습을 볼 수 있을 것이다.

이제, 토글 되어 보이는 부분을 사용자가 꾸미는 작업을 해주어야 한다.

뿅!

그런데 apple사이트의 border를 보면 아마…

1px보다 작은 border 같다… 하지만 크롬에서는 1px보다 작은 border를 그릴 수가 없다.

그래서 이걸 어떡하지… 어떡하지 하다가

좀 더 굵긴 하지만, 색깔을 칙칙한 색으로 해서 착시! 효과를 주었다 (ㅋㅋㅋ

아무튼 구현은 여기까지이며 이제 점점 포트폴리오 사이트를 만들 수 있겠다는 자신감이 생기고 있다…!

그럼 뿅!

>> 최종 완성

728×90

[React] 반응형 웹 사이트(홈페이지) 만드는 법

728×90

React, 반응형 웹, react-media, 반응형 모바일, 반응형 사이트

반응형 웹페이지(홈페이지)란 사용자의 화면 크기에 반응(Response) 한다고 해서 반응형 홈페이지라고 합니다.

즉 홈페이지 요소들의 사이즈가 사용자의 화면 크기에 따라 줄었다가 늘었다가 하는 것입니다.

React에서 반응형 웹 페이지를 구성하는 방법은 다음과 같습니다.

우선 react-media를 import 해줍니다. react-media에서 Media를 사용할 것입니다.

import Media from ‘react-media’

그 다음 MEDIA_QUERIES를 작성해준다. 필자는 pc와 mobile로 나누었다.

const MEDIA_QUERIES = { pc: ‘(min-width: 1200px)’, mobile: ‘(max-width: 1199px)’, }

그 다음 Desktop에 대한 html과 Mobile에 대한 html을 작성해주고 export할 html에 가져온다.

import Media from ‘react-media’ const MEDIA_QUERIES = { pc: ‘(min-width: 1200px)’, mobile: ‘(max-width: 1199px)’, } const Desktopmode = (props, context) => (

this is desktop

) const Mobilemode = (props, context) => (

this is mobile

) const test = (props, context) => (

{matches=>{ return( <> {matches.pc && } {matches.mobile && } ) }}

); export default test;

다음은 테스트한 결과이다. 이처럼 react-media만으로 쉽게 반응형 모바일을 만들 수 있다.

반응형 웹사이트

반응형 모바일 만드는법이 도움이 되셨으면 공감 부탁드립니다. 모르시는 부분들은 댓글로 남겨주세요.

728×90

[React/Typescript] 반응형 네비게이션 만들기

[React/Typescript] 반응형 네비게이션 만들기 (Navigation with CSS media queries)

안녕하세요! 지원스크립트입니다 🙂

이번 포스팅에서는 React 라이브러리와 Typescript로 화면 크기에 따라 배치가 바뀌는 반응형 네비게이션을 만들어보겠습니다.

반응형 웹이란 하나의 웹사이트에서 PC, 태블릿/패드, 모바일 등 디스플레이의 종류에 따라 화면의 크기가 자동으로 변하도록 만든 웹페이지 접근 기법을 말합니다.

위키백과 : 반응형 웹 디자인

Overview

우선 최종 결과가 어떤 식으로 나오는지 보시면 좋을 것 같습니다!

풀 스크린 사이즈 웹페이지

최종적으로 코드를 적용하고 실행한 웹 페이지의 모습입니다.

iPhoneX 사이즈 반응형 웹

iPhoneX 기준의 디스플레이 사이즈를 적용한 모습입니다.

반응형이 잘 적용되어 상단 메뉴들은 사라지고, 네비게이션 왼쪽에 있는 메뉴 아이콘을 볼 수 있습니다.

메뉴 아이콘을 클릭한 후 화면

메뉴 아이콘을 누르면 x모양으로 변하고 사이드 바가 열립니다.

그럼 이제 반응형 네비게이션 구현 코드들을 살펴보겠습니다~

폴더구조

코드 구현에 앞서서 제가 구현한 반응형 네비게이션의 폴더 구조를 보여드리겠습니다. 꼭 제 방법이 정답은 아니며, 폴더 구조는 프로젝트나 디자인 패턴 등에 따라 제각각이기 때문에 참고만 해주세요~

src 폴더의 구조는 아래와 같습니다.

src 폴더구조

components 폴더에서 navigation.tsx 와 navItem.tsx 가 따로 있는 이유는 navigation 컴포넌트 내에서 배열 데이터에 따라 navItem 컴포넌트를 map 시켜주기 위해서 입니다.

이렇게 구조를 짜게 되면 추후 메뉴가 추가될 때 태그나 엘리먼트 내용들을 일일이 작성하지 않아도, 배열 데이터에 오브젝트 하나만 추가하면 되기 때문입니다.

자세한 내용은 뒤에서 설명하겠습니다.

pages 폴더의 각 페이지는 페이지 이름만을 h1 태그로 반환하도록 작성을 해두었으며, 가독성을 위해 따로 css를 적용해 두었습니다.

App.tsx

이번 프로젝트의 상위 파일인 App.tsx 에 작성한 코드입니다.

페이지의 이동을 위해 react-router-dom 의 BrowserRouter , Switch , Route 를 사용하였습니다.

(반응형 웹을 제작하기 위한 포스팅이기 때문에 이번 포스팅에서는 다루지 않겠습니다 ㅎㅎ)

import { BrowserRouter, Switch, Route } from “react-router-dom”; import Navigation from “./components/navigation”; import { Home, Menu1, Menu2, Menu3, Menu4 } from “./pages”; export default function App() { return ( ); }

Navigation 컴포넌트가 항상 페이지내에 고정되어있고, 특정한 조건(주소 변경)에 따라 Navigation 아래의 다른 컴포넌트들만 Switch 해주는 구조입니다.

components/navigation.tsx

우선 네비게이션 컴포넌트의 전체 코드를 한번 보고 설명하도록 하겠습니다.

import “./styles/navigation.css”; import { useState } from “react”; import { withRouter } from “react-router-dom”; import NavItem from “./navItem”; function Navigation(): JSX.Element { const [menuToggle, setMenuToggle] = useState(false); const menu = [ { name: “Home”, address: “/” }, { name: “Menu-1”, address: “/menu1” }, { name: “Menu-2”, address: “/menu2” }, { name: “Menu-3”, address: “/menu3” }, { name: “Menu-4”, address: “/menu4” }, ]; return (

); } export default withRouter(Navigation);

리액트 개발에 익숙하지 않으신 분들은 뭔가 복잡해 보일수 있지만, 생각보다 간단합니다.

하나씩 훑어보겠습니다~

const [menuToggle, setMenuToggle] = useState(false); const menu = [ { name: “Home”, address: “/” }, { name: “Menu-1”, address: “/menu1” }, { name: “Menu-2”, address: “/menu2” }, { name: “Menu-3”, address: “/menu3” }, { name: “Menu-4”, address: “/menu4” }, ];

우선 위 코드의 첫번째 줄은 useState 훅을 이용하여 menuToggle 이라는 상태값을 false 로 초기화 해 준 것입니다. 배열의 두번째에 있는 setMenuToggle 을 이용하여 menuToggle 에 변화를 줄 수 있습니다.

React 라이브러리에서는 상태값을 직접적으로 변경하면 안되기 때문에, 이런 함수형 컴포넌트에서는 useState 와 같은 훅을 사용하여 상태값을 변경합니다.

menuToggle 은 화면의 크기가 작아졌을 때 생기는 버거(?)아이콘을 클릭하면, 메뉴바가 사이드에서 보이도록 하기 위한 토글이라고 보시면 됩니다.

다음 줄의 menu 배열은 메뉴에 들어갈 이름과 주소값을 정의한 배열입니다. 앞서 언급한 것처럼 이 배열에 오브젝트 하나만 추가하면 손쉽게 메뉴를 추가할 수 있게됩니다.

menuToggle ? setMenuToggle(false) : setMenuToggle(true) } >

위 코드는 버거 아이콘을 위해 작성했습니다.

menuToggle 이 false 라는 뜻은 컴포넌트가 처음 마운트되었거나, 열려있는 버거 아이콘을 닫기 위해 클릭한 후일 것입니다.

이때는 burger__menu 라는 클래스 이름을 적용하고, menuToggle 가 true 일 때는 x__menu 라는 클래스 이름을 적용하도록 삼항연산자를 사용했습니다.

onClick 에는 메뉴를 눌렀을때 menuToggle 의 상태값을 변경해주는 함수를 작성했습니다.

그 아래의 div 세개는 버거메뉴를 css로 그리기 위해 작성한 태그들입니다.

{menu.map((data) => ( setMenuToggle(false)} /> ))}

이 코드에서는 첫번째 줄에 작성된 div 가 헷갈릴 수 있습니다만, 별로 어렵지 않습니다.

우리가 일반적으로 작성하는 html 문서에서는 태그 내 class 이름을 띄어쓰기(스페이스바)로 연결하여 복수적용 할 수 있습니다.

하지만 위와 같이 작성한 jsx 문법에서는 띄어쓰기를 인식하지 못합니다. 그렇기 때문에 배열에 데이터를 넣은 후 join 문법을 사용하여 연결해 준 것입니다.

아래 예시를 보겠습니다.

배열내의 요소들 A와 B를 join 함수 파라미터 안에 있는 ” ” , 즉 띄어쓰기로 연결한다는 의미입니다.

className 내 두번째 배열요소에 해당하는 삼항연산자는 menuToggle 값에 따라 메뉴박스의 보여짐을 결정하기 위해 작성하였습니다. 버거 아이콘을 눌렀을 때 메뉴박스가 열리거나 닫힐 예정입니다.

그 다음 div 에서는 처음에 정의한 menu 배열요소에 따라 map 함수로 메뉴 각각에 데이터와 offNav라는 함수를 뿌려주는 코드입니다. map 함수를 사용했기 때문에 나중에 다른 페이지가 추가되더라도 손쉽게 수정할 수 있습니다.

components/navItem.tsx

NavItem 컴포넌트는 복잡한 내용이 없기 때문에 한번에 보도록 하겠습니다~

import “./styles/navigation.css”; import { Link } from “react-router-dom”; interface NavProps { data: { name: string; address: string; }; offNav: Function; } export default function NavItem({ data, offNav }: NavProps): JSX.Element { const { name, address } = data; return ( offNav()}> {name} ); }

NavItem 컴포넌트가 상위 컴포넌트에서 받아오는 props는 재사용할 일이 없기 때문에, 따로 types 파일 등에 정의하거나 하지 않고 바로 interface로 선언해두겠습니다. interface 대신 type으로 작성해도 됩니다.

NavItem 컴포넌트는 Link 태그(a 태그에 해당) 한개 만을 반환합니다. 그 이유는 상위 컴포넌트에서 map 함수로 받은 1개 분량의 배열요소에 해당하는 값만 보여주면 되기 때문입니다.

Link 태그 내에 붙는 to 는 경로/주소 값을 나타냅니다. Navigation 컴포넌트의 menu 배열에서 props로 받아온 주소를 바로 적용할 수 있습니다.

Link 태그 onClick 에 offNav 라는 함수를 적용한 이유는 메뉴를 클릭했을때 사이드 메뉴를 닫고 바로 페이지를 보이기 위함입니다. 페이지로 이동한 후 사이드 바를 닫기 위해 한번 더 메뉴를 클릭하는 수고를 덜기 위해서 넣어두었습니다.

해당 함수는 상위 컴포넌트에서 setMenuToggle 을 항상 false 상태로 받아오도록 작성했습니다.

components/styles/navigation.css

css 파일의 전체 코드입니다.

(네비게이션 내의 a 태그 메뉴들은 따로 텍스트 스타일을 기본 텍스트와 동일하게 적용해 두었습니다.)

스타일시트는 모든 코드를 설명하기엔 무리가 있기 때문에, 간단히 미디어 쿼리만 짚고 넘어가겠습니다.

.navigation__wrapper { width: 100%; height: 75px; position: fixed; display: flex; align-items: center; top: 0; z-index: 9999; background-color: white; border-bottom: 1px solid rgba(44, 44, 44, 0.233); box-shadow: 0px 2px 3px rgba(44, 44, 44, 0.137); } .menu__list { display: flex; justify-content: center; } @media (max-width: 1099px) { .burger__menu, .x__menu { display: block; margin-left: 40px; cursor: pointer; } .burger__menu > div, .x__menu > div { width: 25px; height: 3px; background-color: black; margin: 5px; transition: all 0.3s ease; } .x__menu > .burger_line1 { transform: rotate(-45deg) translate(-5px, 6px); } .x__menu > .burger_line2 { opacity: 0; } .x__menu > .burger_line3 { transform: rotate(45deg) translate(-5px, -6px); } .menu__box__visible { width: 220px; height: 100%; position: fixed; left: 0; top: 76px; background-color: white; box-shadow: 2px 0px 1px rgba(44, 44, 44, 0.137); } .menu__box__hidden { display: none; } .menu__list { position: relative; top: 50px; left: 50px; flex-direction: column; } .menu__item { margin: 15px 0; } } @media (min-width: 1100px) { .navigation__wrapper { flex-direction: row; align-items: center; justify-content: center; } .burger__menu, .x__menu { display: none; } .menu__box { width: 50%; height: fit-content; } .menu__list { flex-direction: row; align-items: center; } }

저는 미디어쿼리를 활용하여 화면의 가로 1100px을 기준으로 반응형 웹을 적용하였습니다. 미디어 쿼리를 작성할 때는 어느 사이즈에도 공통으로 적용되는 부분은 따로 디폴트로 작성해두고, 변화가 생기는 부분만 미디어 쿼리 내에 작성하면 좋습니다.

이상으로 “반응형 네비게이션 만들기” 포스팅을 마치겠습니다!

추가적으로 사이드바에 대한 애니메이션이나 각각의 선택메뉴에 대한 색상 변화 기능을 추가해보아도 좋을것 같습니다 🙂

리액트 반응형 모듈 사용하기 (react-responsive)

반응형

리액트 프로젝트를 할 때 반응형 을 좀 더 쉽게 사용할 수 있는 반응형 모듈에 대해서 정리해보려고 합니다.

선정 이유 부터 셋팅까지 정리해보도록 하겠습니다.

1. 반응형 모듈 선정

결론부터 말씀드리면 react-responsive 를 선택하였는데, 그 이유를 react-responsive 와 react-media 두가지 모듈을 비교하며 정리해보려합니다.

1.1 대중성 및 꾸준한 업데이트

npm trends 사이트에서 react-media와 react-responsive의 트렌드를 비교해볼 수 있습니다.

최근 업데이트 날짜를 제외하고는 react-responsive가 다운로드 수도 2배가량 앞서고 있고, 2년 먼저 만들어졌으며, Git의 좋아요인 star 개수도 많은 것을 확인할 수 있습니다.

이런 수치들이 절대적이지는 않지만 오랫동안 문제없이 사용돼 왔다는 반증이기 때문에 결과적으로 대중성 및 꾸준한 업데이트 면에서는 react-responsive 모듈이 좀 더 좋은 수치를 보이는 것 같습니다.

2.2 편의성

react-media

react-media는 render , children(function) childrend(react element) 이 세가지 props를 이용해 내용을 렌더링 할 수 있습니다.

render

I matched!

} />

children(function)

{matches => matches.mobile ?(

I matched!

) : (

I didn’t match

) }

childrend(react element)

I matched!

queries에는 css 방식 혹은 camelCase를 이용해 작성할 수 있습니다. px 를 작성하지 않아도 자동으로 픽셀로 계산합니다.

그래서 V/v-web에서 사용할 반응형 가이드를 토대로 작성해보면 아래처럼 사용할 수 있습니다.

import React from “react”; import Media from “react-media”; const GLOBAL_MEDIA_QUERIES = { pc: “(min-width: 1024px) and (max-width: 1279px)”, tablet: “(min-width: 768px) and (max-width: 1023px)”, tablet_pc: “(min-width: 768px) and (max-width: 1279px)”, mobile_tablet: “(max-width: 1023px)”, mobile: “(max-width: 767px)” }; function App() { return (

{matches => { console.log(matches); return ( <> {matches.pc &&

pc

} {matches.tablet &&

tablet

} {matches.tablet_pc &&

tablet_pc

} {matches.mobile_tablet &&

mobile_tablet

} {matches.mobile &&

mobile

} ); }}

); } export default App;

react-responsive

react-responsive에서 위와 같은 구간으로 나누면 아래처럼 작성할 수 있습니다. react-media와 다르게 각 조건들이 props로 존재하는 형태입니다.

import React from “react”; import MediaQuery from “react-responsive”; function App() { return (

pc

tablet

tablet_pc

mobile_tablet

mobile

); } export default App;

이것까지만 보면 react-media와 react-responsive는 취향에 따라 선택해서 사용하면 되겠지만, react-responsive에서는 Hooks를 제공하고 있습니다.

2.3 Hooks

Hooks 는 개발자가 라이브러리의 특정 라이프사이클 과정에 갈고리로 낚아채는 것처럼 훅(hook)! 할 수 있는 api를 제공해 준 것이라 생각하면 이해하기 쉬울 것 같습니다.

react-responsive에서는 useMediaQuery 라는 Hook을 제공합니다. 아래 코드처럼 현재 useMediaQuery 에 media-query 조건을 넣어주면 해당 조건에 따라서 true, false를 리턴해주게 됩니다. 변수를 통해 조건 제어를 하여 렌더링 하는 것이 위에서 사용하던 방식들 보다 깔끔하다고 생각이 됩니다.

import React from “react”; import “./App.css”; import MediaQuery from “react-responsive”; import { useMediaQuery } from “react-responsive”; function App() { const isPc = useMediaQuery({ query: “(min-width: 1024px) and (max-width: 1279px)” }); const isTablet = useMediaQuery({ query: “(min-width: 768px) and (max-width: 1023px)” }); const isTabletPC = useMediaQuery({ query: “(min-width: 768px) and (max-width: 1279px)” }); const isMobileTablet = useMediaQuery({ query: “(max-width: 1023px)” }); const isMobile = useMediaQuery({ query: “(max-width: 767px)” }); return (

{isPc &&

pc

} {isTablet &&

tablet

} {isTabletPC &&

tablet_pc

} {isMobileTablet &&

mobile_tablet

} {isMobile &&

mobile

}

); } export default App;

– 브라우저 사이즈별 가변 텍스트 대응

Hooks가 필요한 이유는 V/v-web에서 브라우저 사이즈별 가변 텍스트를 제공이 가능하기 때문입니다.

PC에서는 English 라는 텍스트를 모바일에서는 EN 이라는 텍스트를 보여주려고 할 때 단순 CSS Media-Query 만으로는 작업이 불가능합니다.

매번 두 가지 케이스를 작성해서 display : none,block; 으로 분기 처리를 해야 합니다. 하지만 Hooks를 사용하면 아래처럼 해결할 수 있을 것 같습니다.

import React from “react”; import “./App.css”; import MediaQuery from “react-responsive”; import { useMediaQuery } from “react-responsive”; function App() { const isTabletPC = useMediaQuery({ query: “(min-width: 768px) and (max-width: 1279px)” }); const languageText = isTabletPC ? “English” : “EN”; return (

{languageText}

); } export default App;

2. react-responsive 셋팅

설치typescript를 사용하는 서비스이기 때문에 아래의 @types 모듈도 설치해줘야합니다.

npm install @types/react-responsive

npm install react-responsive

반응형 컴포넌트 파일 생성 MediaQuery.tsx

import React from ‘react’; import { useMediaQuery } from ‘react-responsive’; const Mobile: React.FC = ({ children }) => { const isMobile = useMediaQuery({ query: ‘(max-width: 767px)’, }); return {isMobile && children}; }; const Tablet: React.FC = ({ children }) => { const isTablet = useMediaQuery({ query: ‘(min-width: 768px)’, }); return {isTablet && children}; }; const PC: React.FC = ({ children }) => { const isPc = useMediaQuery({ query: ‘(min-width: 1024px)’ }); return {isPc && children}; }; const PCwide: React.FC = ({ children }) => { const isPCwide = useMediaQuery({ query: ‘(min-width: 1280px)’ }); return {isPCwide && children}; }; export { Mobile, Tablet, PC, PCwide };

위에서 알아본 Hooks를 이용해서 아래와 같이 좀 더 깔끔한 방식으로 분기 처리를 할 수도 있습니다. 아래처럼 하게 될 경우 다른 props가 들어가지 않고 네이밍이 직관적이기 때문에 좀 더 효율적일 것이라고 생각합니다. 따로 하나의 파일에 분리해놓고 필요시 해당 컴포넌트만 import 해서 사용하면 될 것 같습니다.

3. 사용 방법

pc 일 경우에만 보여주기

PC일 경우에만 보여야하기 때문에 아래와 같이 태그 안에 원하는 요소를 넣어주면 됩니다.

Gnb.tsx

import React from ‘react’; import { PC } from ‘@components/common/MediaQuery’; // …중략 const Gnb = () => { const { isActive, isExpanded, moreList, languageList } = DEMO_PROPS; return (

{/*PC에서만 보일 요소를 넣으면 됩니다. */}

); }; export default Gnb;

키워드에 대한 정보 react 반응 형 웹

다음은 Bing에서 react 반응 형 웹 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [코딩 독학] 반응형웹을 적용하기 전 고려해야 할 것들 | 반응형 웹 만들기 | viewport | media query

  • TAMO
  • 타모
  • #viewport
  • #mediaquery
[코딩 #독학] #반응형웹을 #적용하기 #전 #고려해야 #할 #것들 #| #반응형 #웹 #만들기 #| #viewport #| #media #query


YouTube에서 react 반응 형 웹 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [코딩 독학] 반응형웹을 적용하기 전 고려해야 할 것들 | 반응형 웹 만들기 | viewport | media query | react 반응 형 웹, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment