
์ด์
์์ ๋ฌผ์ Preview ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ๋ฉด ํ๋๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ, ์ด๋ฏธ์ง๋ฅผ ๋ซ๊ณ ์๋ ํ์ด์ง๋ก ๋์์ค๋ฉด, ๋ธ๋ผ์ฐ์ ์๋จ์ผ๋ก ์ฌ๋ผ๊ฐ๋ ์ด์๊ฐ ์์๋ค. ๋ชจ๋ฐ์ผ ๋ทฐ์์๋ง ํด๋น ๋ฌธ์ ๊ฐ ์์์ง๋ง, ์ฌ์ฉํ๋ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๊ทธ ๋ฌธ์ ์ธ ๋ฏํ๋ค.
overlay๋ฅผ ์์ํ ๋ state๋ก ํ์ฌ window.scrollY ์์น ๊ฐ์ ์ ์ฅํ๊ณ , Close ๋ฒํผ์ ๋๋ฌ ๋ฅผ ๋น ์ ธ๋์ฌ ๋ ๊ทธ ์์น๋ก ๋์๊ฐ๋๋ก ํ๋ค.
ํด๊ฒฐ
function returnYOffset(y) { | |
if (window.pageYOffset === 0) { | |
window.scrollTo(0, y); | |
} | |
} | |
const Preview = (props) => { | |
const [show, setShow] = useState(); | |
const [yOffSet, setYOffSet] = useState(); | |
return ( | |
<Box tag='article' | |
direction='row' | |
flex | |
align='center' | |
margin={{top: 'small', bottom: 'small'}} | |
border={{side: 'all', color: 'dark-2'}} | |
round | |
pad='small' | |
style={{ | |
width: '100%', | |
height: 'auto', | |
display: 'flex', | |
justifyContent: 'center', | |
alignItems: 'center', | |
overflow: 'hidden', | |
}} | |
> | |
<Image | |
src={props.image.src} | |
alt={props.image.alt} | |
onClick={() => { | |
setYOffSet(window.pageYOffset); | |
setShow(true) | |
}} | |
style={{ | |
flexShrink: '0', | |
maxWidth: '100%', | |
maxHeight: '100%', | |
borderRadius: '12px', | |
}} | |
/> | |
{show && ( | |
<Layer | |
onEsc={() => { | |
setShow(false); | |
returnYOffset(yOffSet) | |
}} | |
onClickOutside={() => { | |
setShow(false) | |
returnYOffset(yOffSet) | |
}} | |
margin='xlarge' | |
> | |
<Box | |
pad='small' | |
direction='column' | |
flex | |
background='paper' | |
> | |
<Image | |
fit='contain' | |
src={props.image.src} | |
alt={props.image.alt} | |
style={{borderRadius: '12px', paddingTop: '1rem'}} | |
/> | |
<Box | |
pad='small' | |
alignSelf='end' | |
> | |
<Button | |
style={{ width: '100%'}} | |
primary | |
hoverIndicator='light-1' | |
color='logoGreen' | |
label='close' | |
onClick={(e) => { | |
setShow(false) | |
returnYOffset(yOffSet) | |
}} /> | |
</Box> | |
</Box> | |
</Layer> | |
)} | |
</Box> | |
)} |
article ํ๊ทธ ๋ด์ image ํ๊ทธ๊ฐ ์กด์ฌํ๋ค. preview ์ปดํฌ๋ํธ๋ useState๋ฅผ ์ด์ฉํด์ show, yOffSet๋ฅผ ๊ฐ์ง๋ค. show๊ฐ true์ผ ๊ฒฝ์ฐ overlay๋ฅผ ๋์ฐ๋๋ฐ, Grommet์ด ์ ๊ณตํ๋ <Layer>
๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.<Layer>
ํ๊ทธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก onEsc, onClickOutside๋ฅผ ํตํด ํ๋ฉด ๋ฐ๊นฅ๊ณผ ESC ํค๋ฅผ ์ด์ฉํด overlay๋ฅผ ๋น ์ ธ๋์ค๋๋ก ํ๋ค. ๋๋ ๋ฒํผ์ ํ๋ ๋ ๋ฃ์ด onClick ์ด๋ฒคํธ๋ ๋ง๋ค์ด์ฃผ์๋ค.
๊ฐ๊ฐ ๋น ์ ธ๋์ฌ ๋ show ๊ฐ์ false,๋ก, returnYOffset์ด๋ผ๋ ํจ์๋ฅผ ํธ์ถํ๋๋ก ํ๋ค.
์ฒ์ window.scrollY
๋ฅผ ์ฐ๋ ค๊ณ ํ๋๋ฐ MDN์ ํ์ธํด๋ณด๋, scrollY
์ ๋ค๋ฅธ ์ด๋ฆ์ ์์ฑ์ด์ง๋ง, ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ์ํด window.pageYOffset
์ ์ ์ํ๊ณ ์์๋ค. ๊ทธ๋ฌ๋ IE 9 ๋ฏธ๋ง์ ์ฌ๋ ๋ธ๋ผ์ฐ์ ์์๋ ๋ ์์ฑ ๋ชจ๋ ์ง์์ด ์ ๋๋ค.
window.scrollY / window.pageYOffset
์์ ์ผ๋ก๋ถํฐ ๋ฌธ์๋ฅผ ์์ง๋ฐฉํฅ์ผ๋ก ์คํฌ๋กคํ ํฝ์
์ ์๋ฅผ ๋ํ๋ด๋ ๊ฐ. ์์ ๊ฐ = ์์ชฝ ์คํฌ๋กค
๋ฌธ์๊ฐ ์๋ ์๋๋ก ์ ํ ์์ง์ด์ง ์์ ์ํ๋ผ๋ฉด 0์ ๋ฐํํ๋ค.
window.pageYOffset === window.scrollY // always returns true