일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- pushstate
- 호이스팅
- 실행 컨택스트
- localtunnel
- AbortController
- 유사배열
- webpack
- 이벤트 루프
- 넘블
- Lexical environment
- 비동기 작업
- 매클로태스크
- 번들러
- hoisting
- 함수형
- Call stack
- 이터러블
- 클론코딩
- 마이크로태스크
- 로드마크
- relatedTarget
- 호출 스택
- 렉시컬 환경
- debounce
- 화살표 함수
- 로컬터널
- JavaScript
- 웹팩
- 자바스크립트
- fetch 취소
- Today
- Total
내가 보려고 만든 개발 공부 일지
CSS - 애니메이션으로 로딩마크 만들기 본문
화면에 컨텐츠를 보여주기 위해선 API를 호출하고 데이터를 가져와서 해당 UI에 적절히 렌더링 해줘야 한다.
이때 API 요청에 대한 응답이 올때까지 사용자에게 "요청중" 이라는 상태를 보여주는게 좋은 사용자 경험일 것이다.
이 상태를 로딩마크로 보여주는데 (원이 빙글빙글 돌아간다던가 아니면 텍스트가 움직인다던가)
가장 무난한 모양의 로딩마크를 css로 구현하는 법을 끄적거려본다.
위 스타일1, 2 의 차이점은 1은 그냥 일정하게 회전만 하는 모습이고,
2는 뭔가 테두리가 늘어났다 줄었다 하면서 좀더 역동적으로 회전하는 모습이다.
스타일-1
/* style.scss */
.loading {
div {
border: 9px solid orange;
border-radius: 50%;
border-color: orange orange orange transparent;
width: 80px;
height: 80px;
animation: spinning 1s linear infinite;
}
}
@keyframes spinning {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
<div class='loading'>
<div></div>
</div>
스타일-1 은 사실 너무 간단하다.
그저 div를 linear 하게 무한회전 하면 끝난다.
하나 짚고갈 점은 아래 두줄 코드인데
border-radius: 50%;
border-color: orange orange orange transparent;
border-color 는 인자값을 1개만 받을 수도 있지만, 4개까지 받을 수 있다.
인자를 4개 취했을땐 [ 위 - 오른 - 아래 - 왼 ] 순서로 테두리 색이 적용된다.
위 코드에선 orange 색으로 3면을 칠하고 왼쪽면만 투명하게 해줬다.
그리고 border-radius를 둥글게 줘서 마치 도넛의 한쪽을 베어먹은 모양이 되는것이다.
스타일-2
.loading {
position: relative;
div {
position: absolute;
border: 9px solid orange;
border-radius: 50%;
border-color: orange transparent transparent transparent;
width: 80px;
height: 80px;
animation: spinning 1s infinite;
&:nth-child(1){
animation-delay: -0.3s;
}
&:nth-child(2){
animation-delay: -0.2s;
}
&:nth-child(3){
animation-delay: -0.1s;
}
}
}
@keyframes spinning {
from {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
<div class='loading'>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
스타일-2 는 1과 비교했을때 코드가 좀 더 추가되었다.
먼저 <div>가 4개가 되었고 position 값이 absolute 로 바뀌었다.
이렇게 되면 한입 베어문 도넛 4개가 한곳에 겹쳐진 모습이 될것이다.
이제 중요한건 마치 테두리가 늘었다 줄었다 하듯이 회전하는 모습을 구현하는 것인데
이를 구현하기 위해서 animation-delay 를 첫번째, 두번째, 세번째 div 에 다른 값을 주어 조금씩 다른 타이밍이에
애니메이션이 실행되도록 했다.
여기서 animation-delay 값을 음수로 줬다. animation-delay 값이 음수라는건 무엇을 의미할까 ?
만약 animation-duration : 5s 인 애니메이션이 있다고 해보자.
이는 애니메이션이 5초동안 실행된다는 뜻인데 animation-delay : -1s 이렇게 딜레이를 -1초로 주면
애니메이션을 1초 빨리 시작하겠다는 뜻이다. 즉 UI 가 화면에 그려졌을때 0초 부터 시작하는게 아니라
1초일때 모습부터 시작하겠다는 뜻이다.
위에서 <div>에 animation-delay에 각각 다른 음수값을 준것은 UI 가 화면에 렌더링 되었을때 부터
"이미 돌아가고 있는 상태" 로 보이도록 만들고 싶어서다.
딜레이 시간을 만약 양수 값으로 줬다면, UI가 렌더링 됐을때 모습은 그제서야 딜레이만큼 하나씩 돌아가는 모습일 것이다. (이 부분은 직접 해보면 바로 알 수 있는 부분이다.)
마지막으로 animation 에 linear 값을 뺐는데 그렇게되면 기본값인 ease 가 적용된다.
ease 는 일정한 속도가 아닌 속도가 서서히 줄어드는 효과를 주는 값이다.
4개의 div 에 각각 다른 색을 부여해서 어떻게 움직이는지 아래 모습을 보면 좀더 이해가 빠를 것이다.
이렇게 간단한 로드마크를 css로 구현해 보았다.
'CSS' 카테고리의 다른 글
SCSS 와 Sass 의 차이 간단 요약 (0) | 2021.07.16 |
---|---|
css - 꽉찬 화면 만들고 활용하기 (0) | 2021.07.03 |
CSS flex 속성 활용으로 레이아웃 배치 (0) | 2021.07.02 |
JS 에서 css 변수값 접근 , 수정 (0) | 2021.07.02 |