๋ชฉ์ฐจ

     

     

    ๐ŸŽฅ 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๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. 

     

    + Recent posts