์ด์ ์ window์์ ์คํฌ๋กคํ ๋ ํน์ ์๋ ๋ฉํธ๊ฐ ๊ณ ์ ์ด ๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
์ด๋ฒ์๋ window๊ฐ ์๋ ํน์ div ์์ ์คํฌ๋กคํ์ ๋ div์์ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๊ณ ์ ์ด ๋๋๋ก ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค.
์ฌ์ค ๊ตฌํ ๋ฐฉ์์ ๋๊ฐ์ต๋๋ค.
๋จ์ง window ์๋ ๋ฌ๋ฆฌ ๊ฐ์ฒด์ scroll ๊ฐ์ ๊ตฌํ๊ธฐ ์ํด์๋ useRef๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ ๋ ์ด ๋ถ๋ถ์ ๊ตฌํํ๋๋ฐ ์์ด ๋ง์ ๊ณต๋ถ๊ฐ ๋์์ต๋๋ค. ๐
๊ฐ์ฒด์์ ๊ณ ์ ์ ์ํค๋ ค๋ฉด fixed ์๋ ๋ฌ๋ฆฌ absolute๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์น์ ๊ธฐ์ค์ด viewport ๊ฐ ๋๋ fixed์ ๋ค๋ฅด๊ฒ absolute๋ ์์ ๊ฐ์ฒด๋ค ์ค relative๊ฐ ๋๋ ๊ฐ์ ์ฐธ์กฐํ์ฌ ์์น๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
๊ทธ๋์ ์ ๊ฐ ์๊ฐํ ๋ฐฉ๋ฒ์ 2๊ฐ์ง ์ ๋๋ค. ๊ฑฐ์ ๊ฐ์ผ๋ฉด์๋ ํ์ฉ์ฑ์ด ์กฐ๊ธ ๋ค๋ฅผ ๊ฒ ๊ฐ์์ ๋ ๊ฐ์ง ๋ฐฉ์์ ๋ชจ๋ ์ ์ฉํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ถ์ฝํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๊ธฐ์กด ์ฒ๋ผ ํด๋์ค ํ๋๋ฅผ ๋ถ์ฌ ์์น๋ฅผ ์ปจํธ๋กคํ๋ค.
2. scroll๊ฐ์ ๊ฐ์ ธ์ ์ธ๋ผ์ธ ์คํ์ผ๋ก ์ค์๊ฐ ๋ฐ์ํ๋ค. (๋ค๋ฅธ css ๋ถ๋ถ์ ์ปจํธ๋กคํ๊ธฐ ์ํด ์ด์ฐจํผ ํด๋์ค๋ฅผ ๋ถ์ด๊ธด ํ ๊ฒ์ด๋ค.)
1. ํด๋์ค ํ๋๋ก๋ง ์ปจํธ๋กค ํ๊ธฐ
๊ตฌ์กฐ๋ฅผ ๋จผ์ ์ง๋ด ๋๋ค.
box๋ ์์น์ ๊ธฐ์ค์ด ๋ ๋ถ๋ชจ์ด๊ณ , ์ค์ ์คํฌ๋กค์ด ๋๋ ๋ ์์ boxInner์ ๋๋ค.
์ด boxInner์ ์คํฌ๋กค ๊ฐ์ ๋ถ๋ฌ์ 30 ์ด์์ด ๋๋ค๋ฉด ScrollActive์ ์ํ ๊ฐ์ด ๋ฐ๋๊ณ ,
ScrollActive ์ํ๊ฐ์ด ๋ฐ๋๋ฉด smallBox์๊ฒ ์ถ๊ฐ ํด๋์ค๊ฐ ๋ถ์ต๋๋ค.
// App.js
<div className="box" >
<div className={ScrollActive ? "smallBox fixed" : "smallBox"}>
{
ScrollActive ?
'I am fixed! โจ' :
'I will be fixed! ๐'
}
</div>
<div className="boxInner">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestiae impedit ducimus perferendis, fuga nobis nihil eius similique. Laboriosam fuga doloribus quibusdam cumque beatae! Quae omnis, explicabo possimus molestias nam tempore!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestiae impedit ducimus perferendis, fuga nobis nihil eius similique. Laboriosam fuga doloribus quibusdam cumque beatae! Quae omnis, explicabo possimus molestias nam tempore!
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestiae impedit ducimus perferendis, fuga nobis nihil eius similique. Laboriosam fuga doloribus quibusdam cumque beatae! Quae omnis, explicabo possimus molestias nam tempore!
{ ... }
</div>
</div>
// App.css
.box {
position: relative;
top: 30px;
right: 30px;
width: 400px;
height: 400px;
background: black;
color: white;
overflow: hidden;
margin-left: 100px;
}
.box .boxInner {
width: 100%;
height: 100%;
overflow: hidden;
overflow-y: auto;
padding: 10px;
}
.smallBox {
position: absolute;
top: 50px;
right: 40px;
z-index: 1;
padding: 10px;
background: rgb(236, 97, 218);
border-radius: 6px;
color: #fff;
border: 1px solid rgb(183, 81, 187);
text-align: left;
}
.smallBox.fixed {
width: 100%;
top: 0;
right: 0;
border-radius: 0;
text-align: center;
}
SPAํํ์ธ ๋ฆฌ์กํธ ์์์ ํ๋์ ํน์ ์๋ฆฌ๋จผํธ๋ฅผ ์ ํํ๋ ค๋ฉด useRef์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
ref๊ฐ ๊ฑธ๋ฆฐ ์๋ฆฌ๋จผํธ์ ์์ฑ์ ํ์ธํ ์๋ ์๊ณ , ๋ด์ฅ ํจ์๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด boxRef๋ฅผ div์ ์ฐ๊ฒฐํ ๋ค ์ฝ์๋ก ์ฐ์ด๋ณด๋ฉด ํด๋น ์๋ฆฌ๋จผํธ์ ์์ฑ ๊ฐ๋ค์ ํ์ธํด ๋ณผ ์ ์์ต๋๋ค.
import React, { useState, useEffect, useRef } from 'react'
const boxRef = useRef(null);
<div className="box">
{ ... }
<div className="boxInner" ref={boxRef}> {/* boxRef ์ค์ ํ๊ธฐ */}
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestiae impedit ducimus perferendis, fuga nobis nihil eius similique. Laboriosam fuga doloribus quibusdam cumque beatae! Quae omnis, explicabo possimus molestias nam tempore!
{ ... }
</div>
</div>
์คํฌ๋กค์ด ์์ฑ๋๋ div์ boxRef๊ฐ์ ์ ์ฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ boxRef์ ์คํฌ๋กค ๊ฐ์ ์ค์๊ฐ์ผ๋ก ๊ฐ์(๐) ํ์ฌ ๊ฐ์ ๋ฐ๋ผ ์ปจํธ๋กค์ ํ ์ ์์ต๋๋ค.
์ ๋ ScrollActive๋ฅผ ํ๋ ์์ฑํ์ฌ ์ปจํธ๋กค์ ํ๊ฒ ์ต๋๋ค.
- scroll ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ : boxRef.current.scrollTop
- scroll ํ์ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ : addEventListener
const [ScrollY, setScrollY] = useState(0)
const [ScrollActive, setScrollActive] = useState(false);
function logit() {
setScrollY(boxRef.current.scrollTop)
if(boxRef.current.scrollTop > 30) {
setScrollActive(true);
} else {
setScrollActive(false);
}
}
useEffect(() => {
function watchScroll() { boxRef.current.addEventListener("scroll", logit); }
watchScroll();
return () => { boxRef.current.removeEventListener("scroll", logit); };
})
<div className="box">
<div className={ScrollActive ? "smallBox fixed" : "smallBox"}>
{
ScrollActive ?
'I am fixed! โจ' :
'I will be fixed! ๐'
}
</div>
<div className="boxInner" ref={boxRef}> {/* boxRef ์ค์ ํ๊ธฐ */}
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Molestiae impedit ducimus perferendis, fuga nobis nihil eius similique. Laboriosam fuga doloribus quibusdam cumque beatae! Quae omnis, explicabo possimus molestias nam tempore!
{ ... }
</div>
</div>
์ ์ฒด ์์ค
'๊ฐ๋ฐ ๐พ > ReactJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์กํธ์์ setInterval์ ์ฌ์ฉํ์ฌ ํ์ดํ ํจ๊ณผ ์ฃผ๊ธฐ (0) | 2021.06.18 |
---|---|
React ์์ select ์ฌ์ฉํ๊ธฐ (6) | 2021.06.14 |
React ์คํฌ๋กค์ Fix ํ๊ธฐ (Window scroll) (4) | 2021.06.08 |
React์์ ๊ฐ๋ก ์คํฌ๋กค ๊ตฌํํ๊ธฐ (react-horizontal-scrolling-menu) (2) | 2021.06.03 |
[React][ํ๊ฒฝ์ธํ ] react-router-dom ์ฌ์ฉํ๊ธฐ (0) | 2021.05.25 |