🖋️ 가상 클래스와 가상 요소로 구현하는 기능들
가상 클래스
.button:hover {
background-color: #007bff;
color: white;
}
.input:focus {
background-color: #007bff;
box-shadow: 0 0 0 0.2rem rgba(0,123,255,.25);
}
.checkbox:checked + label {
font-weight: bold;
}
가상 요소
1. 추가적인 HTML 마크업 없이 장식적 요소나 아이콘을 추가 가능
2. 마크업을 간결하게 유지하고, 재사용성을 높이는 데 유용
.link::before {
content: '🔗'; /* content 는 비어도 필수로 작성 */
margin-right: 8px;
}
.input::placeholder {
color: #007bff;
font-style: italic;
}
.article::first-letter {
float: left;
font-size: 200%;
font-weight: bold;
}
가상 요소 사용 예시
1. 디자인에 맞는 커스텀 불릿을 쉽게 추가 가능
2. 추가적인 HTML 마크업 없이 순수 CSS만으로 구현 가능
const CustomBulletList = () => {
return (
<ul className="custom-bullet-list">
<li>리스트 항목 1</li>
<li>리스트 항목 2</li>
<li>리스트 항목 3</li>
</ul>
);
};
.custom-bullet-list li::before {
content: '•'; /* 커스텀 불릿 텍스트 */
color: red; /* 불릿 색상 */
font-weight: bold; /* 불릿 스타일 */
display: inline-block; /* 불릿을 인라인 블록 요소로 표시 */
width: 1em; /* 불릿과 텍스트 간의 공간 */
margin-left: -1em; /* 불릿 위치 조정 */
}
입력 필드에 포커스 됐을 때, 테두리 아래에 애니메이션 효과를 추가하여 사용자의 주의
사용 이유
1. 사용자 인터랙션에 시각적 피드백을 제공하여 UX를 향상
2. 가상 요소를 사용하면, 추가적인 DOM 요소 없이도 이러한 효과를 구현
EX ) JSX 와 CSS CODE
const AnimatedInput = () => {
return <input type="text" className="animated-input" />;
};
.animated-input {
position: relative;
border-bottom: 2px solid #ccc; /* 기본 테두리 스타일 */
}
.animated-input:focus::after {
content: '';
position: absolute;
left: 0;
bottom: -2px;
width: 100%;
height: 2px;
background-color: blue; /* 애니메이션 테두리 색상 */
animation: animateBorder 0.5s forwards; /* 애니메이션 정의 */
}
@keyframes animateBorder {
from { width: 0; }
to { width: 100%; }
}
링크에 마우스를 올렸을 때 밑줄이 나타나는 애니메이션을 추가
사용 이유
EX ) JSX 와 CSS CODE
const AnimatedLink = () => {
return <a href="#" className="animated-link">링크</a>;
};
.animated-link {
position: relative;
text-decoration: none; /* 기본 밑줄 제거 */
}
.animated-link::after {
content: '';
position: absolute;
left: 0;
bottom: 0;
width: 0;
height: 2px;
background-color: blue; /* 밑줄 색상 */
transition: width 0.3s ease; /* 애니메이션 효과 */
}
.animated-link:hover::after {
width: 100%; /* 호버 시 밑줄 길이 */
}