/HBD-SJY

๐Ÿฅณ๋™์ƒ์˜ 15๋ฒˆ์งธ ์ƒ์ผ์„ ์ถ•ํ•˜ํ•˜๋Š” ์›น์‚ฌ์ดํŠธ๐Ÿฅณ

Primary LanguageJavaScript

HBD-SHY


๐Ÿฅณ Happy Birthday, SJY!

2024๋…„ 2์›” 25์ผ์€ ์ œ ๋™์ƒ์˜ 15๋ฒˆ์งธ ์ƒ์ผ์ด ๋˜๋Š” ๋‚ ์ž…๋‹ˆ๋‹ค!
๋™์ƒ๊ณผ ๋‚˜์ด ์ฐจ์ด๊ฐ€ ๋งŽ์ด ๋‚˜์„œ ๊ทธ๋Ÿฐ์ง€, ์„œ๋กœ ์ธ์‚ฌํ•˜๋Š” ๊ฒƒ๋„ ์„œ๋จนํ•œ ์‚ฌ์ด์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ๋ถ€ํ„ฐ๋ผ๋„ ์นœํ•ด์ง€๊ณ ์ž(??) ์ •์„ฑ๊ณผ ๋งˆ์Œ์ด ๋‹ด๊ธด ์†ํŽธ์ง€์™€ ํ‰์ƒ ๊ฐ„์งํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ฃผ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๊ธ€์— ์„ ๋ฌผ๋กœ ์ƒ์ผ ์ถ•ํ•˜ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์ด ์žˆ์„๊นŒ? ํ•˜๊ณ  ์ฐพ์•„๋ดค๋Š”๋ฐ ๊ทธ๋Ÿฐ ์‚ฌ๋ก€๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์•„์„œ ์ฐธ๊ณ ๋„ ๋งŽ์ด ํ–ˆ์–ด์š” ๐Ÿคฃ๐Ÿคฃ


์š”์ฆ˜ ์‹œ๋Œ€์— SPA ๋Œ€์‹  ์ œ์ด์ฟผ๋ฆฌ๋ฅผ?

์‚ฌ์‹ค ์š”์ฆ˜ ๋Œ€์„ธ์ธ ๊ธฐ์ˆ ์€ React, Vue ๊ฐ™์€ SPA ํ”„๋ ˆ์ž„์›Œํฌ ์•„๋‹ˆ๋ฉด ์•„์˜ˆ ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐ€๋Š” ์ถ”์„ธ์ง€๋งŒ,
์ •ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ ์“ฐ๋Š” ๋Š๋‚Œ๋„ ์•„๋‹ˆ๊ณ  ๋”์กฐ์ž‘์ด ๋” ์‰ฌ์›Œ์„œ ์ œ์ด์ฟผ๋ฆฌ๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.


๊ฐœ๋ฐœ ํด๋” ๊ตฌ์กฐ

image

ํด๋”๊ตฌ์กฐ๋Š” ๋ฃจํŠธ์— index.html์ด ์žˆ๊ณ , images , scss , js ํด๋”๋กœ ๊ฐ๊ฐ ๋‚˜๋ˆ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

script module

import { hash } from '../js/modules/hash.js';
import { view } from '../js/modules/view.js';
import { favi } from '../js/modules/favi.js';
import { kakao } from '../js/modules/config/kakao.js';

$(function () {
    kakao();
    hash();
    view();
    favi();
});

ํ‰์†Œ์™€ ๋‹ค๋ฅธ ์ ์ด์žˆ๋‹ค๋ฉด, ๊ถ๊ธˆํ•ด์„œ script module ํ˜•์‹์œผ๋กœ ์ž‘์—…ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๊ธฐ์กด์—” ํ•œ js ํŒŒ์ผ์— ๋‹ค ๋•Œ๋ ค๋ฐ•์•˜๋Š”๋ฐ (...) ๋ฆฌ์•กํŠธ์ฒ˜๋Ÿผ ์—ญํ• ๋ณ„๋กœ ๋ถ„๋ฆฌ ์‹œ์ผœ๋†“์œผ๋‹ˆ๊นŒ
๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„  ์ด ๋ฐฉ๋ฒ•์ด ๋” ๊ดœ์ฐฎ์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


ํŽ˜์ด์ง€ ์†Œ๊ฐœ

ํŽ˜์ด์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด 4๊ฐœ๋กœ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”์ธ : ์ƒ์ผ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„์„ ํƒ€์ด๋จธ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ํŽธ์ง€ : ์ง์ ‘ ์“ด ์ƒ์ผ ํŽธ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ƒ์ผ ๋‹น์‚ฌ์ž๋งŒ)
  • ๋„ˆ์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€ : ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ๋ž˜๊ฐ€ ์žฌ์ƒ๋จ๊ณผ ํ•จ๊ป˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ๊ณต์œ  ๋ฐ ๋Œ“๊ธ€ : ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ SNS (์นดํ†ก, ํŽ˜์ด์Šค๋ถ, ํŠธ์œ„ํ„ฐ) ์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ณ , ์ƒ์ผ ์ถ•ํ•˜ ๋Œ“๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์ธ ํŽ˜์ด์ง€ (๋””๋ฐ์ด ํƒ€์ด๋จธ)

11

๋””๋ฐ์ด ๊ณ„์‚ฐ ํƒ€์ด๋จธ๋Š” ์ด ๊ฒŒ์‹œ๊ธ€ ์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค!
์ƒ์ผ ์ „ , ์ƒ์ผ ๋‹น์ผ, ์ƒ์ผ ์ดํ›„๋ฅผ ๊ตฌํ•˜์—ฌ ๋ฌธ๊ตฌ์™€ ๋ฒ„ํŠผ ์ƒํƒœ๋ฅผ ๊ฐ๊ฐ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

const dDayDate = new Date("Feb 25, 2024, 0:00:00").getTime();

//setInterval ์•ˆ์—์žˆ๋Š” timeDifference ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ๋ณ€์ˆ˜๋กœ
let globalDifference;
// let globalDays;

setInterval(() => {
    // ํ˜„์žฌ ๋‚ ์งœ์™€ ๋””๋ฐ์ด ๋‚ ์งœ์˜ ์ฐจ์ด ๊ณ„์‚ฐ
    let currentDate = new Date().getTime();
    const timeDifference = dDayDate - currentDate;

    globalDifference = timeDifference;

    // ๋‚จ์€ ์ผ์ˆ˜, ์‹œ๊ฐ„, ๋ถ„, ์ดˆ ๊ณ„์‚ฐ
    let days = Math.ceil(timeDifference / (1000 * 60 * 60 * 24));
    let hours = Math.ceil((timeDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    let minutes = Math.ceil((timeDifference % (1000 * 60 * 60)) / (1000 * 60));
    let seconds = Math.ceil((timeDifference % (1000 * 60)) / 1000);

    hours = (hours < 10) ? `0${hours}` : `${hours}`;
    minutes = (minutes < 10) ? `0${minutes}` : `${minutes}`;
    seconds = (seconds < 10) ? `0${seconds}` : `${seconds}`;

    $('#dDay').html(`D-${days}`);
    $('#time').html(`${hours}:${minutes}:${seconds}`);

    days = Math.abs(days);
    // globalDays = days;

    // ๋””๋ฐ์ด๊ฐ€ ์ง€๋‚ฌ์„ ๊ฒฝ์šฐ
    if (timeDifference < 0) {
        $('#dDay').html(`์ƒ์ผ์ด ์ง€๋‚ฌ๋„ค์š”!<br/>D+${days}`);
        $('#dayCountPage #desc').text('์–ด์„œ ์„ ๋ฌผ์„ ์—ด์–ด๋ด์š”!');
        $('#time').remove();
        $btnGift.removeClass('disabled');
    } else {
        $('#dayCountPage #desc').text('์ƒ์ผ์„ ๋ฌผ ์˜คํ”ˆ๊นŒ์ง€...');
    }

    //๋””๋ฐ์ด ์ผ๊ฒฝ์šฐ
    if (days === 0) {
        $('#dDay').html(`๋“œ๋””์–ด ์˜ค๋Š˜์ด๋„ค์š”! ์ƒ์ผ ์ถ•ํ•˜ํ•ด์š”<br/>D-day`);
    }
}, 1000);

timeDifference ๊ฐ’์„ setInterval ๊ตฌ๋ฌธ ๋ฐ–์—์„œ ์‚ฌ์šฉํ•ด์•ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ „์—ญ ๋ณ€์ˆ˜ (globalDifference) ๋ฅผ ๋”ฐ๋กœ ์„ ์–ธํ•ด์„œ
๊ฐ’์„ ์ „์—ญ ๋ณ€์ˆ˜์— ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ € ์•ž/๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ์™€ btnGift ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ๊ฐ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

setTimeout์„ ์ค€ ์ด์œ ๋Š”, ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋€” ๋•Œ ๊ธฐ์กด ์ฝ˜ํ…์ธ ๋Š” ์ง€์›Œ์ง€๊ณ  ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ,
๊ทธ ๊ณผ์ •์—์„œ #btnGift ์…€๋ ‰ํ„ฐ๋ฅผ ์ฆ‰์‹œ ๋ชป์ฐพ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์•ฝ๊ฐ„์˜ ๋”œ๋ ˆ์ด๋ฅผ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

window.addEventListener('popstate', function() {
    // ๋””๋ฐ์ด๊ฐ€ ์ง€๋‚œ๊ฒฝ์šฐ
    if (globalDifference < 0) {
        setTimeout(() => {
            $('#btnGift').removeClass('disabled');
        }, 1);
    }
});

$(document).on('click', '#btnGift', function(e) {
    // ๋””๋ฐ์ด๊ฐ€ ์ง€๋‚˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ
    if (globalDifference > 0) {
        alert('2024๋…„ 2์›” 25์ผ์— ์˜คํ”ˆํ•  ์ˆ˜ ์žˆ์–ด์š”.');
        e.preventDefault();
    }
});

ํŽธ์ง€ ํŽ˜์ด์ง€

22

ํŽธ์ง€ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ dribble envelope open ๊ธ€์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํŽธ์ง€๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ฃผ์˜ ํŒ์—…์ด ๋œจ๊ณ , ์•Œ์•˜์–ด์š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋งํฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์ผ ํŽธ์ง€๋ฅผ ๊ตฌ๊ธ€๋“œ๋ผ์ด๋ธŒ์— pdf ํ˜•์‹์œผ๋กœ ์—…๋กœ๋“œํ•˜๊ณ , ์•„๋ฌด๋‚˜ ์—ด๋žŒํ•˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต์œ  URL์„
LOCK.PUB - URL ๋‹จ์ถ• ์•”ํ˜ธํ™” ์„œ๋น„์Šค ๋กœ ์ •ํ•ด์ง„ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์•ผ๋งŒ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ๋กœ ๊ฐ€์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.


๋…ธ๋ž˜ ๋ฉ”์‹œ์ง€ ํŽ˜์ด์ง€

33

<div class="lyricsWrapper">
    <div class="lyricsRow">
        <p>์ž ์‹œ ๋„˜์–ด์กŒ์ง€ ๊ดœ์ฐฎ์•„ ์žก์•„์ค„๊ฒŒ ๋„ˆ ๋งŽ์ด ๊ฑฑ์ •ํ–ˆ๋‹ˆ</p>
        <p>No no no ์•„์ง ์ฒ˜์Œ์ด์ž–์•„<br />
            ๊ทธ๊ฒƒ์ฏค์€ ๋‹ค ๊ดœ์ฐฎ์•„ ๋‹ค ๊ทธ๋Ÿฐ ๊ฑฐ์ง€</p>
        <p>์›๋ž˜ ๊ทธ๋ž˜ ๋‹ค ์–ด๋ฅธ๋“ค๋„ ์šฐ๋ฆฌ ๋‚˜์ด ๋• ๋‹ค ์‹ค์ˆ˜ํ•˜๊ณ  ์—ฐ์Šตํ•˜๋ฉฐ ์„ฑ์žฅํ–ˆ์—ˆ๋Œ€</p>
        <p>์šฐ๋ฆฐ ์•„์ง ์ฒ˜์Œ์ธ ๊ฒƒ๋“ค์ด ๋งŽ์ž–์•„ <br />
            ๊ดœ์ฐฎ์•„ ์šฐ๋ฆฌ๋„ ๊ฒช์–ด๋ณด๋ฉฐ ํฌ๋ฉด ๋˜์ž–์•„ ์šธ์ง€๋งˆ</p>
        <p>์ž ์‹œ ๋’ค์ฒ˜์ง€๋ฉด ์กฐ๊ธˆ ์‰ฌ์–ด๊ฐ€๋ฉด ๋ผ <br />
            ๋„ˆ๋Š” ์ž˜ ํ•˜๊ณ  ์žˆ์–ด ๋„ˆ ์ž ์‹œ ํž˜๋“ค ๋•Œ</p>
        <p>๋‚ด๊ฐ€ ๊ฐ™์ด ๋›ฐ์–ด์ค„๊ฒŒ ๊ฑฑ์ • ์ ‘๊ณ  <br />
            ์ผ์–ด๋‚˜ ํŒ”์„ ๊ฑท์–ด ์˜ฌ๋ ค ํฌ๊ธฐ ๋”ฐ์œˆ ์ ‘์–ด</p>
        <p>๋„Œ ์ž˜ ํ•˜๊ณ  ์žˆ์–ด oh</p>
        <p>๋„Œ ์ž˜ ํ•˜๊ณ  ์žˆ์–ด yeah</p>
        <p>ํž˜๋‚ด ์ข€ ์ฐธ์œผ๋ฉด ๋ผ ๋‚ด๊ฐ€ ๊ณ์— ์žˆ์„๊ฒŒ</p>
        <p>๋„Œ ์ž˜ ํ•˜๊ณ  ์žˆ์–ด oh, ๋„Œ ์ž˜ ํ•˜๊ณ  ์žˆ์–ด</p>
        <p>You gotta take your time ํ•  ์ˆ˜ ์žˆ์ž–์•„<br />
            ๋„ˆ๋Š” ์ž˜ ํ•  ์ˆ˜ ์žˆ์–ด
        </p>
    </div>
</div>

html์—์„œ ๋ณด์—ฌ์ค„ ๋…ธ๋ž˜ ๊ฐ€์‚ฌ๋“ค์„ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ , js์—์„œ ๊ฐœ์ˆ˜๋ž‘ ์‹œ๊ฐ„์„ ๋ฐฐ์—ด๋กœ ๋‹ด์•„์„œ
for๋ฌธ๊ณผ setTimeout์„ ํ†ตํ•ด ์ง€์ •ํ•œ ์‹œ๊ฐ„๋Œ€๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ๊ตฌํ•˜๋Š”๊ฑด ๋…ธ๋ž˜ ํƒ€์ด๋ฐ์— ๋งž์ถฐ์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋ž˜ ๋“ค์œผ๋ฉด์„œ ์ง์ ‘ ๋งž์ท„์Šต๋‹ˆ๋‹ค... ๐Ÿ˜‚๐Ÿ˜‚

const timerIndexArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
const timerMsArr = [24500, 29100, 34500, 39800, 46300, 51500, 57500, 60200, 62800, 68800, 74500];

setTimeout(() => {
    $('#musicLoader').addClass('active');
}, 1500);

setTimeout(() => {
    $('#musicLoader').removeClass('active');
}, 23500);

setTimeout(() => {
    handleOpacity('#btnNext', 1, 1);
}, 84000);

for (let i = 0; i < timerIndexArr.length; i++) {
    const index = timerIndexArr[i];
    const ms = timerMsArr[i];

    setTimeout(() => {
        $(`.lyricsRow p:nth-child(${index})`).addClass('active');
    }, ms);
}

๊ณต์œ  ๋ฐ ๋Œ“๊ธ€ ํŽ˜์ด์ง€

44

sns ๊ณต์œ ๋Š” ์นด์นด์˜ค ๊ณต์œ  api๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ  ํŽ˜์ด์Šค๋ถ์ด๋ž‘ ํŠธ์œ„ํ„ฐ๋Š” ๊ณต์œ  url์„ ๋”ฐ๋กœ ์ œ๊ณตํ•˜๊ธธ๋ž˜
์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค~

๋Œ“๊ธ€์˜ ๊ฒฝ์šฐ๋Š” ์ง์ ‘ ๋งŒ๋“ค ์ž์‹ ์ด ์—†์–ด์„œ Disqus ๋ผ๋Š” ํ•ด์™ธ ๋ฌด๋ฃŒ ๋Œ“๊ธ€ ์„œ๋น„์Šค๊ฐ€
์žˆ๊ธธ๋ž˜ ์ด ์นœ๊ตฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š

function sendTwitter() {
    const text = 'blabla';
    const sendUrl = `https://twitter.com/intent/tweet?text=${text}&url=${location.href}`;

    window.open(sendUrl, "_blank");
}

function sendFacebook() {
    const sendUrl = `https://www.facebook.com/sharer/sharer.php?u=${location.href}`;

    window.open(sendUrl, "_blank");
}

์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ํŒŒ๋น„์ฝ˜ ๋ฐ”๊พธ๊ธฐ

๋„ค์ด๋ฒ„์ฝ”๋“œ ์‚ฌ์ดํŠธ ๊ฐ€๋ณด๋‹ˆ, ํŒŒ๋น„์ฝ˜์ด ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ๋ฐ”๋€Œ๊ธธ๋ž˜ ์ข‹์€ ์•„์ด๋””์–ด์ธ ๊ฒƒ ๊ฐ™์•„์„œ ์ €๋„ ๋”ฐ๋ผํ•ด๋ดค์Šต๋‹ˆ๋‹ค (?)
๋„ค์ด๋ฒ„ ์ฝ”๋“œ์—์„œ๋Š” svg ์ฝ”๋“œ๋ฅผ data URI ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์“ฐ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, ์•„๋ฌด๋ฆฌ ํ•ด๋ด๋„ ์•ˆ๋˜์„œ ๊ทธ๋ƒฅ png๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ๋Š” ํŒŒ๋น„์ฝ˜ ๋•Œ๋ฌธ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜, ์‚ฌ์ดํŠธ ์ž์ฒด๊ฐ€ ๋Š๋ ค์ง€๋Š” ๊ฒƒ ๊ฐ™์•„์„œ
ํ•ด์ƒ๋„๊ฐ€ 768 ์ด์ƒ์ผ๋•Œ๋งŒ ํŒŒ๋น„์ฝ˜์„ ๋ฐ”๊พธ๋„๋ก ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค.

<link rel="shortcut icon" id="favi" href="./images/ico/ico-favicon01.png" />
if (window.matchMedia('(max-width: 768px)').matches) {
    return;
} else {
    const f = document.getElementById('favi');
    let i = 0;

    setInterval(() => {
        i = (i + 1) % 4;
        f.href = `../images/ico/ico-favicon0${i + 1}.png`;
    }, 2000);
}

๋!

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ 8์ผ ์ค‘ ์ ˆ๋ฐ˜ ์ด์ƒ์€ ๋‚ด์šฉ ๊ตฌ์ƒ๊ณผ ๋””์ž์ธ ๊ณ ๋ฏผ๋งŒ ๋” ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋„ค์š” ๐Ÿ˜…๐Ÿ˜…
๋‹ค ๋งŒ๋“ค๊ณ  ๋ฐฐํฌ ํ›„ ์ญ‰ ๋‘˜๋Ÿฌ๋ณด๋‹ˆ๊นŒ ๋ฟŒ๋“ฏํ•˜๊ณ , ์ƒ‰๋‹ค๋ฅธ ๊ฒฝํ—˜์„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ์•„์‰ฌ์šด์ ์€, ๊ทธ๋ƒฅ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฆฌ์•กํŠธ (Next.js) ๋กœ ํ• ๊ฑธ? ์ด๋ž€ ์ƒ๊ฐ์ด ๋“ค์—ˆ์–ด์š”.
์—ฌ๋Ÿฌ ๊ฐœ์˜ HTML์„ ๋งŒ๋“ค์–ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋งํฌ ์‹œํ‚ค์ง€ ์•Š๊ณ , ํŽ˜์ด์ง€ ์ด๋™์„ ํ•ด์‰ฌ (#) ๋กœ ์ง€์ •ํ•œ ๋‹ค์Œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ
ํŠน์ • hash๋กœ ์ด๋™ํ•˜๋ฉด ํ•ด๋‹น div๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ˜•์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ,

ex)
localhost:3000/#main => 1๋ฒˆ div ๋ณด์—ฌ์คŒ
localhost:3000/#intro => 1๋ฒˆ div๋Š” ์—†์• ๊ณ  2๋ฒˆ div ๋ณด์—ฌ์คŒ

์ด๋Ÿฐ๊ฑฐ ์ง์ ‘ ๊ตฌํ˜„ ํ•  ์‹œ๊ฐ„์— ๊ทธ๋ƒฅ SPA๋กœ ํ•˜๋Š”๊ฒŒ ๋” ๊น”๋”ํ•˜์ง€ ์•Š์•˜์„๊นŒ.. ์‹ถ์—ˆ์–ด์š”.

๊ทธ๋ž˜๋„ ์ด ๊ณผ์ •์—์„œ ๋ฐฐ์šด๊ฑด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ˆœ์ˆ˜ HTML ํ™˜๊ฒฝ์—์„œ๋„ SPA ํ‰๋‚ด(?)๋ฅผ ๋‚ผ ์ˆ˜๋„ ์žˆ๊ณ , (๋ฐ”๋‹๋ผ๋กœ SPA ๋งŒ๋“ค๊ธฐ ํ•ด๋ณผ๊นŒ ํ–ˆ์—ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ๋ฒˆ๊ฑฐ๋กœ์›Œ์„œ...)
์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ค‘์— popstate ์™€ onhashchange ๋ผ๋Š” ๊ฒƒ๋„ ์žˆ๊ตฌ๋‚˜!
์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ชจ๋“ˆ๋กœ ๋‚˜๋ˆ ์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง„ ์•Š๋‹ค! ๋ผ๋Š” ๊ฑธ ๋Š๋‚€ ๊ฒƒ ๊ฐ™์•„์š”.

๊ฒฐ๋ก ์€ Next.js ๊ฐ€ ์งฑ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์–ผ๋ฅธ ๊ณต๋ถ€ํ•ด์•ผ์ง€...)

์•„๋ฌดํŠผ, ๊ธ‰ํ•˜๊ฒŒ ๊ธฐํšํ•ด์„œ ๋ฐฐํฌ๊นŒ์ง€ ํ•ด๋†จ๋Š”๋ฐ, ์ƒ์ผ๋‚  ๋™์ƒ์ด ์ข‹์•„ํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ์–ด์š” ๐Ÿ˜Š๐Ÿ˜Š


์ถœ์ฒ˜