Category/Note
styled-components를 활용한 다양한 스타일 속성 예제와 설명
Corinee
2024. 11. 13. 16:02
728x90
이 예제에서는 styled-components를 사용하여 다양한 CSS 속성을 적용하는 방법을 보여줍니다. 이 예제 코드를 통해 배경, 배치, 정렬, 글꼴, 애니메이션 등 여러 스타일링 속성을 이해할 수 있습니다.
주석이 포함된 styled-components 로그인 폼 예제
import React, { useState } from "react";
import styled from "styled-components"
// 전체 화면의 중앙에 폼을 배치하는 컨테이너
const Wrapper = styled.div`
display: flex; // Flexbox를 사용하여 중앙 정렬
align-items: center; // 수직 중앙 정렬
justify-content: center; // 수평 중앙 정렬
height: 100vh; // 화면 전체 높이를 사용
background-color: #f7f8fa; // 밝은 회색 배경
`;
// 폼을 감싸는 컨테이너 스타일
const FormContainer = styled.div`
width: 100%;
max-width: 400px; // 폼의 최대 너비를 설정
padding: 40px; // 폼 안쪽 여백
background-color: white; // 흰색 배경
border-radius: 8px; // 모서리를 둥글게
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); // 그림자로 입체감 추가
`;
// 제목 스타일
const Title = styled.h1`
font-size: 24px; // 글자 크기
font-weight: bold; // 글자 굵기
margin-bottom: 20px; // 아래 여백
color: #333; // 어두운 색 텍스트
text-align: center; // 가운데 정렬
`;
// 입력 필드 스타일
const Input = styled.input`
width: 100%; // 전체 너비
padding: 12px 20px; // 상하 12px, 좌우 20px 여백
margin: 8px 0; // 위아래 간격
border: 1px solid #ddd; // 얇은 테두리
border-radius: 4px; // 둥근 모서리
font-size: 16px; // 글자 크기
&:focus {
border-color: #0073e6; // 포커스 시 파란색 테두리
outline: none; // 기본 포커스 아웃라인 제거
}
`;
// 버튼 스타일
const Button = styled.button`
width: 100%; // 전체 너비
padding: 12px; // 안쪽 여백
font-size: 16px; // 글자 크기
color: white; // 흰색 글자
background-color: #0073e6; // 파란색 배경
border: none; // 테두리 없음
border-radius: 4px; // 둥근 모서리
cursor: pointer; // 클릭 가능한 커서
transition: background-color 0.3s ease; // 배경색 변경 효과
&:hover {
background-color: #005bb5; // 호버 시 짙은 파란색
}
&:disabled {
background-color: #ccc; // 비활성화 시 회색
cursor: not-allowed; // 클릭 불가 커서
}
`;
// 오류 메시지 스타일
const ErrorMessage = styled.p`
color: tomato; // 빨간색 텍스트
font-size: 14px; // 작은 글자 크기
margin: 8px 0; // 위아래 여백
text-align: center; // 중앙 정렬
`;
export default function LoginForm() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
// 폼 제출 이벤트 핸들러
const handleSubmit = (e) => {
e.preventDefault();
if (email === "" || password === "") {
setError("All fields are required.");
} else {
setError("");
alert("Logged in successfully!");
// 실제 로그인 로직을 처리하는 위치
}
};
return (
<Wrapper>
<FormContainer>
<Title>Login</Title>
<form onSubmit={handleSubmit}>
<Input
type="email"
placeholder="Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<Input
type="password"
placeholder="Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
{error && <ErrorMessage>{error}</ErrorMessage>}
<Button type="submit" disabled={!email || !password}>
Login
</Button>
</form>
</FormContainer>
</Wrapper>
);
}
속성 설명 요약
- display: flex: 요소를 플렉스 컨테이너로 만들어 자식 요소의 정렬과 배치를 관리합니다.
- align-items와 justify-content: 플렉스 컨테이너에서 자식 요소의 수직 및 수평 정렬을 설정합니다.
- background-color: 배경 색상을 설정합니다.
- border-radius: 요소의 모서리를 둥글게 합니다.
- box-shadow: 요소에 그림자를 추가해 입체감을 줍니다.
- transition과 hover: 스타일 변화를 부드럽게 전환하고 마우스를 올렸을 때 스타일을 바꾸는 효과를 추가합니다.
- disabled와 not-allowed: 버튼이 비활성화되었을 때 스타일과 커서를 설정합니다.
728x90