[개인 포트폴리오] [트위터 클론 SNS Deli] 분석 Part. 4 'media-query-file.ts' & 'global-style.ts'
2024. 7. 8. 15:19ㆍ웹개발 포트폴리오
728x90
반응형
media-query-file.ts
// 화면 크기별 사이즈 정의
const sizes = {
mobile: 380, // 모바일 크기
tablet: 768, // 태블릿 크기
desktop: 1200 // 데스크탑 크기
};
// `media` 객체를 생성하여 각 사이즈에 대한 미디어 쿼리를 간편하게 적용할 수 있도록 합니다.
// sizes 객체의 키들을 배열로 반환합니다. 이 경우 ['mobile', 'tablet', 'desktop']가 됩니다.
// as Array<keyof typeof sizes> : TypeScript에게 sizes 객체의 키들이 특정 타입임을 명시합니다. 이는 TypeScript의 타입 추론을 돕기 위해 사용됩니다.
// reduce 메서드는 sizes 객체의 키 배열을 순회하며 media 객체를 생성합니다. 초기값은 빈 객체입니다.
export const media = (Object.keys(sizes) as Array<keyof typeof sizes>).reduce(
// reduce 메서드의 콜백 함수에서 acc는 누산기(반복적인 함수, 누적 계산)로, media 객체를 의미합니다.
// label은 sizes 객체의 각 키(예: 'mobile', 'tablet')입니다.
// acc[label]에 미디어 쿼리 함수를 추가합니다. 이 함수는 스타일을 받아 css 함수로 처리된 미디어 쿼리를 반환합니다.
(acc, label) => {
// 각 레이블에 대해 미디어 쿼리 함수를 추가
acc[label] = (style: string) =>
// 해당 레이블의 최대 너비에 대한 미디어 쿼리 문자열을 반환
`@media (max-width: ${sizes[label] / 16}em) { ${style} }`;
return acc;
},
// 초기값을 빈 객체로 설정
{} as { [index: string]: (style: string) => string }
);
- sizes 객체:
- 모바일, 태블릿, 데스크탑의 최대 너비를 정의합니다.
- 각 속성은 해당 장치의 최대 너비를 픽셀 단위로 지정합니다.
- media 객체:
- reduce 메서드를 사용하여 sizes 객체의 각 속성에 대한 미디어 쿼리 함수를 생성합니다.
- acc는 누적된 객체를 의미하며, 각 사이즈별 미디어 쿼리 함수를 추가합니다.
- 각 레이블에 대해 미디어 쿼리 문자열을 생성하고, 이를 템플릿 리터럴을 사용하여 반환합니다.
- 최종적으로 media 객체에는 모바일, 태블릿, 데스크탑 각 사이즈에 대한 미디어 쿼리 함수가 포함됩니다.
이 코드는 스타일링 시 화면 크기에 따라 다른 스타일을 적용할 수 있도록 도와줍니다. 예를 들어, 특정 요소를 모바일 화면에서는 다르게 스타일링하고 싶을 때 유용하게 사용할 수 있습니다.
global-style.ts
import { createGlobalStyle } from 'styled-components';
import { media } from '../media-query-file';
const GlobalStyle = createGlobalStyle`
@font-face {
font-family: 'Pretendard-Regular';
src: url('<https://fastly.jsdelivr.net/gh/Project-Noonnu/noonfonts_2107@1.1/Pretendard-Regular.woff>') format('woff');
font-weight: 400;
font-style: normal;
}
html, body {
margin: 0;
padding: 0;
box-sizing: border-box;
width: 100%;
overflow-x: hidden;
font-family: 'Pretendard-Regular', sans-serif;
}
input::placeholder {
font-size: 1.2rem; /* 기본 설정 */
}
${media.desktop(`
body {
padding: 0 50px !important;
}
input::placeholder {
font-size: 1.2rem; /* 일반적인 설정 */
}
`)}
${media.tablet(`
body {
padding: 0 30px !important;
}
input::placeholder {
font-size: 1rem; /* 태블릿 설정 */
}
`)}
${media.mobile(`
body {
padding: 0 10px !important;
}
input::placeholder {
font-size: 0.9rem; /* 모바일 설정 */
}
`)}
`;
export default GlobalStyle;
이 코드는 styled-components의 createGlobalStyle을 사용하여 글로벌 스타일을 설정합니다. Pretendard-Regular 폰트를 불러오고, html과 body 태그에 기본 스타일을 적용하며, input 요소의 placeholder 스타일을 디바이스 종류에 따라 다르게 설정합니다.
- @font-face:
- Pretendard-Regular 폰트를 외부 URL에서 불러와 사용합니다.
- html, body:
- 기본적인 마진과 패딩을 제거하고, 박스 모델을 보더 박스(box-sizing: border-box)로 설정합니다.
- 페이지의 너비를 100%로 설정하고, 가로 스크롤을 방지합니다.
- Pretendard-Regular 폰트를 기본 폰트로 설정합니다.
- input::placeholder:
- input 요소의 placeholder 텍스트 크기를 설정합니다.
- 미디어 쿼리:
- media 객체를 사용하여 디바이스 크기에 따라 다른 스타일을 적용합니다.
- 데스크탑, 태블릿, 모바일 각각의 환경에서 body의 패딩과 input::placeholder의 폰트 크기를 다르게 설정합니다.
728x90
반응형
'웹개발 포트폴리오' 카테고리의 다른 글
[개인 포트폴리오] [트위터 클론 SNS Deli] 분석 Part. 6 'protected-route.tsx' (0) | 2024.07.08 |
---|---|
[개인 포트폴리오] [트위터 클론 SNS Deli] 분석 Part. 5 'layout.tsx' & 'loading-screen.tsx' (0) | 2024.07.08 |
[개인 포트폴리오] [트위터 클론 SNS Deli] 분석 Part. 3 'main.tsx' (0) | 2024.07.08 |
[개인 포트폴리오] [트위터 클론 SNS Deli] 분석 Part. 2 'App.tsx' (0) | 2024.07.08 |
[개인 포트폴리오] [트위터 클론 SNS Deli] 분석 Part. 1 (0) | 2024.07.08 |