March 29, 2020
์คํ๋์ ํ๋ฉด๊ณผ ๋ฐ์ดํฐ ๋ก๋ฉ ์ฐฝ์ ๊ตฌํํ ํฌ๋กค๋ง์ด๋ฏธ์ง ์ด๋ ์ดํ๋ฆฌ์ผ์ด์
ํฌ๋กค๋ง์ ์๋ง๋ฒ ํ๋ก์ ํธ - 4 (crawling)์ ์๋ ํฌ๋กค๋ง ํจ์๋ฅผ ์ฌ์ฌ์ฉํ์๋ค.
LOADING ํ ์คํธ์ ์ ๋๋ฉ์ด์ ์ ์ฃผ์๋ค.
ํ์ ํ๋ ์ํ ์๋ฆฌ๋จผํธ ์ ๋๋ฉ์ด์ ..
โHello cats!โ
<BackgroundContainer>
<ContentsMenubar name="loading" />
<MainLoader id="main_loader">
<MainLoaderText transX="12px" delay="0.35s" color="firebrick">
LOADING
</MainLoaderText>
<MainLoaderText transX="10px" delay="0.28s" color="darkgoldenrod">
LOADING
</MainLoaderText>
<MainLoaderText transX="8px" delay="0.21s" color="darkolivegreen">
LOADING
</MainLoaderText>
<MainLoaderText transX="6px" delay="0.14s" color="darksalmon">
LOADING
</MainLoaderText>
<MainLoaderText transX="4px" delay="0.07s" color="cornflowerblue">
LOADING
</MainLoaderText>
<MainLoaderText delay="0s" color="white">
LOADING
</MainLoaderText>
</MainLoader>
<Loader id="first_loader"></Loader>
<Description>
<p
style={{
fontSize: '20px',
fontFamily: 'escore7',
color: 'pink',
textShadow: '2px 2px 4px black',
textAlign: 'center',
}}
>
๋ฒํผ์ ํด๋ฆญํ์ฌ ํฌ๋กค๋ง๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค์ธ์
</p>
<p style={{ fontSize: '10px', fontFamily: 'escore5', marginTop: '10px' }}>
Image data from{' '}
<a href="https://wall.alphacoders.com/" target="_blank">
alphacoders.com
</a>
</p>
</Description>
<ButtonContainer>
<button id="cat_button">๊ณ ์์ด(default)</button>
<button id="dog_button">๊ฐ์์ง</button>
</ButtonContainer>
<TextContainer id="myDiv" style={{ display: 'none' }}>
{imgArr.map((item, i) => {
return <img key={i} src={item.img}></img>
})}
</TextContainer>
</BackgroundContainer>
๋ชจ๋ ์ปดํฌ๋ํธ๋ styled-component
๋ก ๊ตฌ์ฑํ์๋ค.
ํ๋์ ๋ณด๊ธฐ ์ข์ง ์์์ ์ฝ๋์คํ๋ฆฌํ ์ด ํ์ํด๋ณด์ ใ ใ setTimeout() ๋ฉ์๋๋ก 3์ด๊ฐ ์ง์๋๊ฒ ํด์ฃผ์๋ค.
๋ก๋ฉํ๋ฉด์ div ํ๊ทธ๋ก ๊ตฌ์ฑํ๊ณ fetch์ then ์ฒด์ด๋์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฌ์์ง๋ฉด ๋ก๋ฉํ๋ฉด์ด ์ฌ๋ผ์ง๊ณ ๋ฐ์ดํฐ์ด๋ฏธ์ง๊ฐ ๋ณด์ฌ์ง๋๋ก ํด์ฃผ์๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ค๋ช ์ฐฝ
๊ณ ์์ด์ ๊ฐ์์ง ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ค๋ ํฌ๋กค๋งํจ์๋ฅผ ์คํํ๋ ๋ฒํผ 2๊ฐ Container
ํฌ๋กค๋งํ ๊ณ ์์ด์ ๊ฐ์์ง ์ด๋ฏธ์ง๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ทฐ Container
์ด๊ธฐ style ๊ฐ์ผ๋ก
display:none
์ ์ค์ ํด์ฃผ์๋ค.
const [imgLoadToggle, setImgLoadToggle] = useState(false)
const [imgArr, setImgArr] = useState([])
์ํ๊ด๋ฆฌ๋ ๋ฆฌ์กํธ hooks๋ฅผ ์ด์ฉํ๋ค.
์ด๊ธฐ DOM ๋ก๋์, ํ๋ฒ๋ง ํฌ๋กค๋ง ํจ์๋ฅผ ์คํํ๊ธฐ ์ํด boolean ๋ณ์๋ฅผ ๋์๋ค.
ํฌ๋กค๋ง๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋๋ ๋ฐฐ์ด
์นํ์ด์ง ์ด๊ธฐ ์ง์ ์, ์คํ๋๋ ์คํ๋์ ํ๋ฉด.
const showFull = () => {
document.getElementById('main_loader').style.display = 'none'
}
useEffect(() => {
if (!imgLoadToggle) {
crawling('cat')
setImgLoadToggle(true)
setTimeout(showFull, 3000)
}
})
useEffect๋ก DOM์ด ๋ก๋๋๋ฉด setTimeout()์ผ๋ก 3์ด๊ฐ ์คํ๋์ ํ๋ฉด์ด ์คํ๋๋๋ก ํด์ฃผ์๋ค.
3์ด๊ฐ ์ง๋๋ฉด, main_loader ์๋ฆฌ๋จผํธ๋ฅผ display:none ํ์๋ค.
๊ทธ๋ฆฌ๊ณ setImgLoadToggle(true)
๋ฅผ ์คํํ๋๋ก ํ๋ค.
document.getElementById('cat_button').addEventListener('click', e => {
e.stopImmediatePropagation()
loadPage()
crawling('cat')
})
document.getElementById('dog_button').addEventListener('click', e => {
e.stopImmediatePropagation()
loadPage()
crawling('dog')
})
์ฐ์ click ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ๋กํ๊ณ ์ธ๊ฐ์ ํจ์ ๋ฐ ๋ฉ์๋๋ฅผ ์คํ์ผ ํ์๋ค.
event.preventDefault()
// ํ์ฌ ์ด๋ฒคํธ์ ๊ธฐ๋ณธ ๋์์ ์ค๋จํฉ๋๋ค.
event.stopPropagation()
// ํ์ฌ ์ด๋ฒคํธ๊ฐ ์์๋ก ์ ํ๋์ง ์๋๋ก ์ค๋จํฉ๋๋ค.
event.stopImmediatePropagation()
// ํ์ฌ ์ด๋ฒคํธ๊ฐ ์์๋ฟ ์๋๋ผ ํ์ฌ ๋ ๋ฒจ์ ๊ฑธ๋ฆฐ ๋ค๋ฅธ ์ด๋ฒคํธ๋ ๋์ํ์ง ์๋๋ก ํฉ๋๋ค.
์ถ์ฒ: https://programmingsummaries.tistory.com/313
์ค์
useEffect๊ฐ ์ฌ๋ฌ๋ฒ ์คํ๋๋ฉฐ addEventListener๋ ์ฌ๋ฌ๋ฒ ์คํ๋์ ํฌ๋กค๋งํจ์๊ฐ ์ฌ๋ฌ๋ฒ ์คํ๋์๋ค.
๊ทธ๋์ stopImmediatePropagation()
๋ฅผ ํตํด ๋์ผ ํจ์๋ฅผ ํ๋ฒ๋ง ์คํํ๊ฒ๋ ํด์ฃผ์๋ค.
const loadPage = () => {
document.getElementById('first_loader').style.display = 'block'
document.getElementById('myDiv').style.display = 'none'
}
const showPage = () => {
document.getElementById('first_loader').style.display = 'none'
document.getElementById('myDiv').style.display = 'flex'
}
ํฌ๋กค๋ง ํจ์ ์์์ loadPage()
๋ฅผ ์คํํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ฉด showPage()
๋ฅผ ์คํํ๊ฒ ํ์๋ค.
๊ฐ๊ฐ์ ํจ์๋ฅผ ํตํด ๋ก๋ฉ๋ฐ ์๋ฆฌ๋จผํธ์ ๋ฐ์ดํฐ ๋ทฐ ์๋ฆฌ๋จผํธ display๋ฅผ ์กฐ์ ํด์ฃผ์๋ค.
AJAX๋ fetch๋ฅผ ์ฌ์ฉํ๊ณ , ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ then ๋ฉ์๋ ์ฒด์ด๋์ ์ฌ์ฉํ๋ค.
ํฌ๋กค๋งํจ์๋ ์ด์ ์ ๋ฐฐ๊ฒฝํ๋ฉด ํฌ๋กค๋ง ์ดํ๋ฆฌ์ผ์ด์ ์ crawling()ํจ์๋ฅผ ์ฌ์ฌ์ฉํ์๋ค.
์๋ง๋ฒ ํ๋ก์ ํธ - 4 (crawling)
fetch(url)
.then //...
()
.then(json => {
setImgArr(json)
showPage()
})
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ฝ์ด์ง๋ฉด, hooks๋ฅผ ํตํด imgArr์ ์ด๋ฏธ์ง๋ค์ ์ ์ฅํ๊ณ showPage()๋ฅผ ์คํํ๋๋ก ํ์๋ค.
css ์ ๋๋ฉ์ด์ ์ styled-components์ keyframes๋ฅผ ์ด์ฉํ๋ค.
์คํ๋์ ํ๋ฉด
, ๋ฐ์ดํฐ ๋ก๋ฉ๋ฐ
, ์ด๋ฏธ์ง ์ปจํ
์ด๋ ๋ทฐ
์ด 3๊ฐ์ ์๋ฆฌ๋จผํธ์ ์ ๋๋ฉ์ด์
์ ์ฃผ์๋ค.
ํคํ๋ ์
const customAni = keyframes`
0%, 100% {
transform: translatey(0);
}
50% {
transform: translatey(20px);
}
`
์คํ์ผ
const MainLoaderText = styled.div`
position: absolute;
font-size: 32px;
text-shadow: 2px 2px 4px black;
font-family: escore9;
color: ${props => {
return props.color
}};
animation: ${customAni} 1.5s ease-in-out infinite;
animation-delay: ${props => {
return props.delay
}};
margin-left: ${props => {
return props.transX
}};
`
์ปดํฌ๋ํธ
<MainLoaderText transX="12px" delay="0.35s" color="firebrick">
LOADING
</MainLoaderText>
styled-components ์ props๋ก transX, delay, color๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ animation์ transform: translatey()
๋ฅผ ์ฌ์ฉํ๋ค.
ํคํ๋ ์
const spin = keyframes`
0% {
transform: translate(-50%, -50%) rotate(0deg);
}
100% {
transform: translate(-50%, -50%) rotate(360deg);
}
`
์คํ์ผ
const Loader = styled.div`
position: fixed;
top: 50%;
left: 50%;
border: 8px solid #f3f3f3;
border-top: 8px solid #3498db;
border-radius: 50%;
width: 60px;
height: 60px;
transform: translate(-50%, -50%);
animation: ${spin} 2s linear infinite;
`
์ปดํฌ๋ํธ
<Loader id="first_loader"></Loader>
๋จผ์ top:50%, left:50%์ transform: translate(-50%, -50%)๋ฅผ ํตํ์ฌ ์๋ฆฌ๋จผํธ๊ฐ ํ๋ฉด ์ค์์ ์ค๊ฒ ํ์๋ค.
๊ทธ๋ฆฌ๊ณ animation์ transform: rotate()
๋ฅผ ์ฌ์ฉํ๋ค.
ํคํ๋ ์
const positionbottom = keyframes`
from{ margin-top:150px; opacity:0 }
to{ margin-top:100px; opacity:1 }
`
์คํ์ผ
const TextContainer = styled.div`
margin-top: 100px;
width: 100vw;
justify-content: center;
flex-wrap: wrap;
animation: ${positionbottom} 1s linear;
`
์ปดํฌ๋ํธ
<TextContainer id="myDiv" style={{ display: 'none' }}>
{imgArr.map((item, i) => {
return <img key={i} src={item.img}></img>
})}
</TextContainer>
animation์ margin๊ฐ๊ณผ opacity๋ฅผ ์ฌ์ฉํด์ ์์ฐ์ค๋ฝ๊ฒ ์ค๋ฅด๋ฅต ์ฌ๋ผ์ค๋ ํจ๊ณผ๋ฅผ ์ฃผ์๋ค.