티스토리 뷰
인프런 React 강의 듣고 사이트 만들기 _ Front 작업 02. wifi 애니메이션 만들기 (styled-components)
주섬이 2021. 1. 19. 21:48(강의내용과 큰 상관없습니다. 강의 듣고 결과물 만드는 작업 중입니다.)
작업물에 wifi 애니메이션이 필요해서 제작해보기로했습니다.
뭐 대충 이런거..
딱히 기능은 없고 css 애니메이션으로만..
codepen.io에서 간단한 코드를 발견해서 크기만 수정해서 사용하기로 했습니다.
감사합니다 ㅎㅎ
코드 출처입니다.
https://codepen.io/roncallyt/pen/GymuE
Wifi signal, pure CSS
Português: Fazendo um sinal de wifi usando somente CSS e animações CSS3 através da regra @keyframes. English: Making a wifi signal using only CSS and ...
codepen.io
일단 styled-components를 통해 작업하는데, keyframe을 어떻게 처리할까 하고 찾아보다가 발견했고 참고글을 읽고 작업했습니다^^.
공식문서에도 있겠지요. 쉽게 설명해주셨습니다.
리액트 styled components 애니메이션 구현
웹에서 애니메이션을 구현할 때 transition과 animation을 사용합니다. transition은 엘리먼트의 상태변화에 쉽게 사용할 수 있으며, 정해진 시작점과 종료점을 가지고 있습니다. 예로, hover 상태시 엘리
medium.com
공식문서도 확인해봅시다.
styled-components.com/docs/basics#animations
styled-components: Basics
Get Started with styled-components basics.
styled-components.com
별도로 keyframes를 제공해줍니다.
import styled, { keyframes } from 'styled-components';
이건 완성 코드!
import React from 'react';
import PropTypes from 'prop-types';
import styled, { keyframes } from 'styled-components';
const lineDefaultStyle = `
border: 2px solid transparent;
border-radius: 100%;
`;
const appearIn = (themeColor) => keyframes`
0%{ border-top-color: transparent; }
25%{ border-top-color: ${themeColor}; }
75%{ border-top-color: ${themeColor}; }
100%{ border-top-color: ${themeColor}; }
`;
const appearMiddle = (themeColor) => keyframes`
0%{ border-top-color: transparent; }
25%{ border-top-color: transparent; }
75%{ border-top-color: ${themeColor}; }
100%{ border-top-color: ${themeColor}; }
`;
const appearOut = (themeColor) => keyframes`
0%{ border-top-color: transparent; }
25%{ border-top-color: transparent; }
75%{ border-top-color: transparent; }
100%{ border-top-color: ${themeColor}; }
`;
const OutLine = styled.div`
${lineDefaultStyle}
margin: 1px auto;
width: 25px;
height: 30px;
border-top-color: ${props => props.themeColor};
animation: ${props => appearOut(props.themeColor)} 1.5s infinite linear
`;
const MiddleLine = styled.div`
${lineDefaultStyle}
margin: 1px auto;
width: 18px;
height: 25px;
border-top-color: ${props => props.themeColor};
animation: ${props => appearMiddle(props.themeColor)} 1.5s infinite linear
`;
const InLine = styled.div`
${lineDefaultStyle}
margin: 1px auto;
width: 14px;
height: 23px;
border-top-color: ${props => props.themeColor};
animation: ${props => appearIn(props.themeColor)} 1.5s infinite linear
`;
const Dot = styled.div`
${lineDefaultStyle}
margin: 2px auto;
width: 3px;
height: 3px;
border: 0;
background: ${props => props.themeColor};
`;
const Wifi = (({ themeColor }) => {
return(
<OutLine themeColor={themeColor}>
<MiddleLine themeColor={themeColor}>
<InLine themeColor={themeColor}>
<Dot themeColor={themeColor} />
</InLine>
</MiddleLine>
</OutLine>
);
});
Wifi.propTypes = {
themeColor: PropTypes.string,
};
Wifi.defaultProps = {
themeColor: '#333',
};
export default Wifi;
테마색으로 라인을 그려주려고 외부에서 props를 전달받습니다.
뭔가 중복되는 코드들을 줄일 수 있을 것 같은데, 최적화는 추후에..^^;;
완성된 와이파이!
근데 왜 노트북에서는 잘 되던게, 데탑오니까 애니메이션 반복이 안되는지는 봐야겠습니다~
infinite가 빠졌군요. ㅎ 코드는 수정해두었습니다.~
여튼 약간 엉성하긴 한데, 좋습니다. 굿굿
'React' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 브라우저
- 제이쿼리
- css
- 자바스크립트
- VUE
- 기초
- frontend
- 프론트엔드
- Method
- 통신
- 메서드
- 프로젝트
- 강의
- JS
- Article
- 코딩애플
- 제로초
- html
- 차이
- JavaScript
- 타입스크립트
- React
- 뷰
- 공부
- vue.js
- Study
- TypeScript
- jQuery
- 리액트
- 아티클
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |