๋ชฉ์ฐจ
๐ฅ Video
โ๏ธ Skill
Skill | ์ฌ์ฉ ์ด์ |
React | ์ฃผ ์ฌ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
Typescript | ํ์ ์์ ์ฑ |
Emotion | CSS in JS |
๐ Solution
๋๋ณด๊ธฐ๋ฅผ ๋๋ฅด์ธ์
์ ๋ต!
import { useEffect, useState } from 'react'
const Component = () => {
const [isFullScreen, setFullScreen] = useState(Boolean(document.fullscreenElement))
const toggleFullScreen = () => {
if (document.fullscreenElement) {
document.exitFullscreen()
} else {
document.documentElement.requestFullscreen()
}
setFullScreen((current) => !current)
}
useEffect(() => {
const fullscreenchangeHandler = () => {
setFullScreen(Boolean(document.fullscreenElement))
}
window.addEventListener('fullscreenchange', fullscreenchangeHandler)
return () => window.removeEventListener('fullscreenchange', fullscreenchangeHandler)
}, [])
return (
<button onClick={() => toggleFullScreen()}>
{isFullScreen ? '์ ์ฒดํ๋ฉด ๋ชจ๋์์' : '์ผ๋ฐ ๋ชจ๋์์'}
</button>
)
}
export default Component
๐ฌ Description
document API๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์ฒด ๋ชจ๋๋ก ๋ณ๊ฒฝํฉ๋๋ค.
1. document.fullscreenElement
document.fullscreenElement๋ ์ ์ฒดํ๋ฉด ๋ชจ๋ ์ผ๋, ์ ์ฒด Element๋ฅผ ๋ฐํํ๊ณ
์ ์ฒดํ๋ฉด ๋ชจ๋๊ฐ ์๋ ๋, null ๊ฐ์ ๋ฐํํฉ๋๋ค.
document.fullscreenElement
2. state๋ ๋จ์ํ ์ด๋ค ์ํ๋ฅผ ๋ฐ๊พธ๊ณ ์ ํจ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ ์ฒดํ๋ฉด ๋ชจ๋์ผ ๋, CSS๋ฅผ ์์ ํ๊ณ ์ถ๊ฒ ์ฃ ?
const [isFullScreen, setFullScreen] = useState(Boolean(document.fullscreenElement))
3. toggleFullScreen ํจ์๋ ์ ์ฒดํ๋ฉด ๋ชจ๋ ๋ฒํผ์ ํด๋ฆญํ์ ๋, ์คํํ๊ธฐ ์ํ ํจ์์ ๋๋ค.
์ ์ฒดํ๋ฉด ๋ชจ๋ ๋ฒํผ์ ์ฒ์ ํด๋ฆญํ ๋๋, ์ ์ฒดํ๋ฉด ๋ชจ๋๊ฐ ์๋๊ธฐ ๋๋ฌธ์ 2๏ธโฃ์ด ์คํ๋๊ณ ๋์์ 3๏ธโฃ์ด ์คํ๋ฉ๋๋ค.
document.documentElement.requestFullscreen()๋ ์ ์ฒด ํ๋ฉด ๋ชจ๋๋ฅผ ์คํํ๋ ๋ฉ์๋ ์
๋๋ค.
3๏ธโฃ์ CSS ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํจ์ ๋๋ค. ํ์ฌ์ ์ต์ ์ํ๋ฅผ ๊ฐ์ ธ์ ๋ฐ์ ์ํต๋๋ค.
๋ค์ ํ๋ฒ ์ ์ฒด๋ชจ๋ ๋ฒํผ์ ํด๋ฆญํ๋ฉด, 1๏ธโฃ์ด ์คํ๋๊ณ , ๋์์ 3๏ธโฃ์ด ์คํ๋ฉ๋๋ค.
document.fullscreenElement๋ ์ ์ฒดํ๋ฉด ๋ชจ๋์ผ ๋, Element๊ฐ ๋ฐํ๋์ด ํด๋น ์กฐ๊ฑด์ true ๊ฐ ๋ฉ๋๋ค.
const toggleFullScreen = () => {
if (document.fullscreenElement) {
1๏ธโฃ document.exitFullscreen()
} else {
2๏ธโฃ document.documentElement.requestFullscreen()
}
3๏ธโฃ setFullScreen((current) => !current)
}
4. useEffect ํ
์ ๋ง์ดํธ ๋ฌ์ ๋, fullscreenchange ์ด๋ฒคํธ๋ฅผ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋ฑ๋กํ๊ณ ,
์ธ๋ง์ดํธ ๋ฌ์ ๋, ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํจ์
๋๋ค.
์ ํํ๋ ์ ์ฒดํ๋ฉด ๋ชจ๋์ผ ๋, EscKey๋ฅผ ๊ฐ์งํ์ง ๋ชปํด์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋ฑ๋กํ๊ธฐ ์ํจ์ ๋๋ค.
useEffect(() => {
const fullscreenchangeHandler = () => {
setFullScreen(Boolean(document.fullscreenElement))
}
window.addEventListener('fullscreenchange', fullscreenchangeHandler)
return () => window.removeEventListener('fullscreenchange', fullscreenchangeHandler)
}, [])
5. ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ fullscreenchange ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, fullscreenchangeHandler ํจ์๋ฅผ ์คํ์์ผ์ค๋๋ค.
์ด ์ฝ๋๋ EscKey(escape)ํค๋ฅผ ๋๋ ์ ๋, ์ ์ฒดํ๋ฉด ๋ชจ๋๋ฅผ ํด์ ํ๊ธฐ ์ํ ์ฝ๋์ ๋๋ค.
const fullscreenchangeHandler = () => {
setFullScreen(Boolean(document.fullscreenElement))
}
โ๏ธ ์ ๋ฆฌ
1. ์ฌ์ฉ์๊ฐ ์ ์ฒดํ๋ฉด ๋ชจ๋ ๋ฒํผ์ ํด๋ฆญํ๋ฉด, ์๋์ 1-1๊ณผ 1-2๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
1-1. document.documentElement.requestFullScreen() ๋ฉ์๋๊ฐ ์คํ๋๋ฉฐ, isFullScreen์ ๊ฐ์ true๋ก ์ํ๋ฅผ ๋ฐ์ ์ํต๋๋ค.
1-2. ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋ฑ๋ก๋ fullscreenchangeHandler ํจ์๋ฅผ ์คํํ๊ณ , isFullScreen์ ์ํ๋ฅผ true๋ก ๋ณ๊ฒฝํฉ๋๋ค.
2. ์ฌ์ฉ์๊ฐ EscKey๋ฅผ ๋๋ฅด๊ฑฐ๋ ๋ค์ ๋ฒํผ์ ํด๋ฆญํ ์ ์์ต๋๋ค.
3. EscKey๋ฅผ ๋๋ฅด๋ฉด, ์๋์ 3-1๊ณผ 3-2๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
3-1. fullscreenchange ์ด๋ฒคํธ๊ฐ ๊ฐ์ง๋๊ณ ์ ์ฒดํ๋ฉด ๋ชจ๋๊ฐ ํด์ ๋ฉ๋๋ค.
3-2. fullscreenchangeHandler ํจ์๊ฐ ์คํ๋์ด isFullScreen๋ฅผ false ์ํ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
4. ์ฌ์ฉ์๊ฐ ๋ค์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด, 4-1๊ณผ 4-2, 4-3๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
4-1. toggleFullScreen ํจ์์ ๋ด๋ถ์์, document.exitFullScreen() ๋ฉ์๋๊ฐ ์คํ๋๋ฉฐ ์ ์ฒดํ๋ฉด ๋ชจ๋๊ฐ ํด์ ๋ฉ๋๋ค.
4-2. isFullScreen์ ๊ฐ์ false๋ก ์ํ๋ฅผ ๋ฐ์ ์ํต๋๋ค.
4-3. fullscreenchangeHandler ํจ์๋ ์คํ๋๋ฉฐ, isFullScreen์ ๊ฐ์ false๋ก ์ํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
'Language > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React ๋ฉ๋ชจ์ด์ ์ด์ ์คํ (0) | 2023.06.28 |
---|---|
React cloneElement (0) | 2022.12.29 |
React ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ์บ๋ฌ์ ๊ตฌํํ๊ธฐ (0) | 2022.11.28 |
React svg๋ฅผ ์ปดํฌ๋ํธ๋ก ์ฌ์ฉํ๊ธฐ (0) | 2022.11.27 |
React AWS Amplify DataStore Tutorial (0) | 2022.10.10 |