티스토리 뷰
토글 버튼 배경 색을 슬라이드처럼 가로로 미는 애니메이션을 주고 싶었다. 쉽지 않았다. 😨
react와 styled-components를 사용했다.
inner div 만들기
<ToggleContainer onClick={toggleHandler}>
<div className={`toggle-container ${isOn ? "toggle--checked" : ""}`}>
<div className="toggle-inner" />
</div>
<div className={`toggle-circle ${isOn ? "toggle--checked" : ""}`} />
</ToggleContainer>
토글 자체에서 배경색에 변화를 주는 애니메이션을 주는 것이 아니라 일종의 눈속임을 하는 것이다. 토글 안에 div(.toggle-inner)를 하나 더 만든다. 그리고 토글을 on/off할 때마다 각각 .toggle--checked가 추가되거나 삭제된다.
overflow: hidden;
> .toggle-container {
width: 60px;
height: 32px;
border-radius: 30px;
background-color: #8b8b8b;
overflow: hidden;
> .toggle-inner {
display: block;
width: 120px;
height: 32px;
margin-left: -100%;
background-color: red;
transition: margin-left 0.4s;
}
> .toggle-inner::before,
> .toggle-inner::after {
content: "";
display: inline-block;
width: 50%;
height: 32px;
}
> .toggle-inner::before {
background-color: var(--coz-purple-600);
}
> .toggle-inner::after {
background-color: #8b8b8b;
}
&.toggle--checked .toggle-inner {
margin-left: 0;
transition: margin-left 0.4s;
}
}
토글 버튼의 배경색에 슬라이드 효과를 주는 것은 사실 위 이미지처럼 색이 50%씩 다른 div의 margin-left에 변화를 주고 transition을 사용하여 부드럽게 한 후, 마치 창문을 통해서 보는 것과 같이 실제로 사용할 토글(.toggle-container) 부분만 보는 것이다. 그래서 토글에 overflow:hidden을 주어 해당 버튼 요소 밖으로 삐져나오는 컨텐츠들을 숨겨야 한다.
한 편, 구현 중 한가지 실수가 있었다. 클래스 .toggle--checked가 추가되었을 때 .toggle-inner에 변화를 주는 것이므로 이 .toggle-inner 안에 &.toggle--checked를 주었었다. 안됐다. 리액트 컴포넌트를 보면 .toggle-inner가 아닌 .toggle-container에 .toggle-checked 클래스를 추가하는 것이므로 해당 .toggle-container을 &선택자로 선택하고 .toggle-inner에 스타일링을 해주는 게 맞는 것 같다.
p.s. 토글 배경색 슬라이드를 구현하기 위해 구글링을 했더니 참고자료가 딱 한개가 나왔다. 왜 가상선택자를 사용하는지 잘 모르겠지만 해당 자료를 참고하고 원하는대로 되었다. 완성하고나서 다음과 같이 가상선택자를 없애고 단순하게 div스타일링을 배경색이 반반씩 되도록 바꿔보았는데 정상적으로 기능을 했다. 👍
> .toggle-container {
width: 60px;
height: 32px;
border-radius: 30px;
background-color: #8b8b8b;
overflow: hidden;
> .toggle-inner {
display: block;
width: 120px;
height: 32px;
margin-left: -100%;
background: linear-gradient(to right, var(--coz-purple-600) 50%, #8b8b8b 50%);
}
&.toggle--checked .toggle-inner {
margin-left: 0;
transition: margin-left 0.4s;
}
}
Reference
'개발 > HTML, CSS, Figma' 카테고리의 다른 글
웹 표준과 Semantic HTML (0) | 2023.04.28 |
---|---|
Figma🍭 GNB 만들기 (0) | 2023.04.22 |
CSS🎨 모달창 만들기, div 중앙에 배치하기 (0) | 2023.04.19 |
CSS🎨 grid 레이아웃, 형태 정의, 정렬 (0) | 2023.03.07 |
와이어프레임 / 목업 / CSS Flexbox (0) | 2023.03.05 |
- Total
- Today
- Yesterday
- 티스토리
- 공릉 카페
- 깃허브 데스크탑 로그아웃
- Til
- 롯데월드 키오스크
- 홍천 삼겹살
- 태릉 꼬치
- 공릉 꼬치
- 티스토리검색
- 태릉 이자카야
- 춘천맛집
- 롯데월드 보조배터리
- 공릉 술집
- 구글서치콘솔
- 을지로맛집
- 태릉맛집
- 이수 맛집
- 공릉맛집
- 춘천닭갈비
- 회고
- 맥 깃허브 데스크탑
- solo project
- 태릉 술집
- sitemap
- 태릉삼겹살
- 롯데월드 매직패스 프리미엄
- 공릉 맛집
- 공릉 밀크티
- 공릉 이자카야
- 신불당 술집
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |