April 07, 2020
ํ์ด์ง ๋ก๋ ์, ์ด๋ฏธ์ง๋ ๋์์ ๊ฐ์ ์ฉ๋์ด ํฐ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ๋ถ๋ฌ์ค๋ ๊ฒ ์๋๋ผ ์ฌ์ฉ์์ ๋ทฐ ์์ญ์ ๋๋ฌ ํ์ ๋, ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ์ง์ฐ๋ก๋ฉ (lazy loading)์ ์ด์ฉํด๋ณด์๋ค.
์ฐ์ฐํ ์๋ณธ ์ด๋ฏธ์ง์ blur๋ ์ด๋ฏธ์ง ๋ชจ๋ ์ฐํ๋คโฆ!
<Contents style={{ marginTop: '100px' }}>
<p>1์ด์ ์ง์ฐ๋ก๋ฉ(lazy loading) ๊ตฌํ</p>
<div>ํ๋ฆฐ ์ด๋ฏธ์ง๋ก ์ง์ฐ</div>
{obj.map(item => {
return item
})}
<div>๋จ์ ์ด๋ฏธ์ง๋ก ์ง์ฐ</div>
{obj2.map(item => {
return item
})}
</Contents>
Contents ๋ผ๋ styled-component๋ฅผ ์ฌ์ฉํด์, Container ๋ฟ๋ง ์๋๋ผ ๋ด๋ถ p๋ div์ ์คํ์ผ๋ ์กฐ์ ํด์ฃผ์๋ค.
<img className="lazy" src="๋ก๋ฉ์ ์ด๋ฏธ์งURL" data-src="URL" alt="Some tacos." />
data-src
์์ฑ ๊ฐ์๋ ์๋ณธ ์ด๋ฏธ์ง URL์ ๋ฃ๊ณ , src
์์ฑ ๊ฐ์๋ ๋น๊ต์ ์ฉ๋์ด ๋ฎ์ ๋์ฒด ์ด๋ฏธ์ง URL์ ๋ฃ์ด์ค๋ค.
let lazyImages = [].slice.call(document.querySelectorAll('img.lazy'))
// or
let lazyImages = Array.slice.call(document.querySelectorAll('img.lazy'))
querySelectorAll
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด DOM ์๋ฆฌ๋จผํธ๋ค์ด ๋ฐฐ์ดํํ๊ฐ ์๋๋ผ ๋
ธ๋๋ฆฌ์คํธ ํํ๋ก ๋ถ๋ฌ์์ง๋ค.
๊ทธ๋์ ๋ฐฐ์ด์ ํํ๋ก ๋ณํํด์ฃผ์ด์ผํจ.
๋ฐฐ์ด ๋ฉ์๋์ slice
๋ฅผ ์ฌ์ฉํ๊ณ call()
์ ํตํด ๋ฐ์ธ๋ฉ ํด์ฃผ๋ฉด ๋จ.
const lazyLoad = () => {
if (active === false) {
active = true
setTimeout(() => {
// image lazy loading ๋ถ๋ถ
// ...
active = false
}, 1000)
}
}
document.addEventListener('scroll', lazyLoad)
์คํฌ๋กค ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๊ณ , ๋ด๋ถ์ image lazy loading ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ์๋๋ฐ,
lazy loading์ด ์ง๊ด์ ์ผ๋ก ๋ณด์ด์ง ์์์ setTimeout() ํจ์๋ก 1์ด๊ฐ ๊ฐ์ ๋ก ์ง์ฐ์์ผ์ฃผ์๋ค. ๐
lazyImages.map(lazyImage => {
if (
lazyImage.getBoundingClientRect().top <= window.innerHeight &&
lazyImage.getBoundingClientRect().bottom >= 0 &&
getComputedStyle(lazyImage).display !== 'none'
) {
lazyImage.src = lazyImage.dataset.src
lazyImage.classList.remove('lazy')
lazyImages = lazyImages.filter(function(image) {
return image !== lazyImage
})
if (lazyImages.length === 0) {
document.removeEventListener('scroll', lazyLoad)
}
}
})
๋จผ์ getBoundingClientRect()
๋ฅผ ํตํ์ฌ ์ด๋ฏธ์ง์ ํฌ๊ธฐ์์๋ฅผ ๊ตฌํ๊ณ , ์กฐ๊ฑด๋ฌธ์ ํตํด ์คํฌ๋ฆฐ์ ๋ฑ์ฅํ ๋ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋๋ก ํด์ฃผ์๋ค.
getComputedStyle()
๋ DOM element์ style ์์ฑ๊ณผ ์์ฑ๊ฐ์ ๊ฐ์ฒด ํํ๋ก ๊ฐ์ ธ์ค๋ window ๋ด๋ถ ๋ฉ์๋์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์กฐ๊ฑด๋ฌธ์ ํต๊ณผํ๋ฉด src๊ฐ์ ๋ฐ๊พธ๋๋ก ํ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ฉด class๋ฅผ ์ญ์ ํ๊ณ ๋ฐฐ์ด์ ๋น์ ๊ณ , ๋ชจ๋ ๋ฐฐ์ด์ด ๋น์์ง๋ฉด ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ์ญ์ ํ๋ ๋ฑ ์ต์ ํ ์์ ๋ ํด์ฃผ์๋ค.
<img src="cat.jpg" loading="lazy" />
์ด๋ฐ ๋ฐฉ์๋ ์ธ ์ ์๋ค๊ณ ํ๋ค..!