[Front-end๐Ÿฅ] MDN Clone

๋˜์ƒยท2021๋…„ 12์›” 20์ผ
0

front-end

๋ชฉ๋ก ๋ณด๊ธฐ
51/58
post-thumbnail

1108~1128

ํŒ€์›๋“ค๊ณผ ํด๋ก  ์Šคํ„ฐ๋””๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ•ด์„œ, MDN ๋ฉ”์ธ ํŽ˜์ด์ง€๋ฅผ ํด๋ก ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

BEM ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋”๋‹ˆ ์ด๋ฆ„ ์ง“๋Š”๋ฐ ๋งˆํฌ์—…๋ณด๋‹ค ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. BEM ์˜ˆ์‹œ ํ”„๋กœ์ ํŠธ ์™€ ์—ฌ๋Ÿฌ ์ž๋ฃŒ๋“ค, BEM์„ ์ผ๋‹ค๋Š” LinkedIn, BBC ๋“ฑ์„ ํ•œ๋ฒˆ์”ฉ ์—ด์–ด๋ณด๊ณค ์žˆ์œผ๋‚˜.. ์‰ฝ์ง€ ์•Š๋‹ค.


BEM ๋„ˆ๋ฌด ์–ด๋ ค์›Œ... ๊ทธ๋ž˜๋„ ํ•ด์•ผ์ง€



1. ๊ตฌ์กฐ ๋ถ„์„

footer์˜ ์ค‘๊ฐ„ ๊ตฌ์—ญ์€ ul ํ•˜๋‚˜๋กœ ํ‘œํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, grid ๋กœ ๊ณ ์น˜๊ฒŒ ๋˜๋ฉด์„œ ์™ผ์ชฝ ul๊ณผ ์˜ค๋ฅธ์ชฝ ul 2๊ฐœ๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋˜์—ˆ๋‹ค.




2. ์ฝ”๋“œ

์†Œ์Šค์ฝ”๋“œ

1. ํŠน์ด์ 

footer ๋ฅผ grid ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

์–ด๋Š ๋„“์ด ์ด์ƒ ๋˜๋ฉด ๊ฐ€์šด๋ฐ ์˜์—ญ ์–‘์ชฝ์ด ๋” ์•ˆ๋„“์–ด์ง€๋Š”๊ฑฐ max-width ์•„๋‹Œ๊ฐ€? ํ•˜๊ณ  ์ „์ฒด์— ์คฌ๋”๋‹ˆ, ๊ฐ€์šด๋ฐ ํŒŒ๋ž€ ์˜์—ญ๋„ ์ œํ•œ๋˜์–ด์„œ.. ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋”๋‹ˆ ํ—ค๋”, ๋‚ด์šฉ๋ถ€๋ถ„, ํ‘ธํ„ฐ์— ๊ฐ๊ฐ ์ค€๊ฑฐ์˜€๋‹ค. ๋Š˜์–ด๋‚˜๋„ ์–ด๋Š ์ƒํ•œ์„ ๊นŒ์ง€๋งŒ ๋Š˜์–ด๋‚˜๋Š”๊ฑด ๊ฐ๊ฐ ์š”์†Œ์— max-width๋ฅผ ์„ค์ •ํ•ด์คฌ๋‹ค.


2. ๊ฐœ์„ ์ 

์ง€๊ธˆ์€ google font์—์„œ CDN ์•„์ด์ฝ˜์œผ๋กœ ๋ฐ•์•„๋ฒ„๋ ธ๋Š”๋ฐ, ๋‹ค์Œ์— ๋งŒ๋“ค๋•Œ๋Š” ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ ์ด๋ฏธ์ง€ ๋‹ค์šด๋ฐ›์•„์„œ ๊ฐ€์ƒ์š”์†Œ๋กœ ์“ฐ๋Š”๊ฒŒ ๋‚˜์„ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋„๋น„๋„ ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค...

js ๋ฐฐ์šฐ๊ณ  js ๋ถ™์ด๊ธฐ!

js ๋ฉ”๋‰ด ์ฐŒ๊ทธ๋Ÿฌ์ง€๋Š”๊ฑฐ ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ• ์ง€ ์ƒ๊ฐํ•˜๊ธฐ
js dim ์ฒ˜๋ฆฌ ํ•˜๊ธฐ



3. ์˜๋ฌธ์ 

Q. .search-form__btn ๊ฒ€์ƒ‰์ฐฝ์—์„œ ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์„ position absolute ๋กœ ์ฃผ๋ฉด ๊ฒ€์ƒ‰์–ด๊ฐ€ ๊ธธ์–ด์งˆ ๋•Œ, ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์— ๊ฐ€๋ ค์ง€๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€??

input์— padding-right ๋ฅผ ์ค˜์„œ ์กฐ์ ˆํ•˜๊ฑฐ๋‚˜,

์ƒ์œ„ ๋งˆํฌ์—…์„ ํ•˜๋‚˜ ๋” ๋„ฃ๊ณ  ๊ทธ ์•ˆ์— input๊ณผ ๋ฒ„ํŠผ์„ ๋„ฃ๋Š” ๋ฐฉ์‹์ด ์ตœ์„ ์ธ๋“ฏ!


Q. ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค ๋•Œ ๊ฒ€์ƒ‰์ฐฝ๋„ ๊ฐ™์ด ์ค„์–ด๋“ค๊ฒŒ ํ•˜๋ ค๋ฉด..? ํ—ค๋”์— ๊ทธ๋ฆฌ๋“œ๋‚˜ ํ”Œ๋ ‰์Šค๋ฅผ ๋” ์“ฐ๋Š”๊ฒŒ ๋‚˜์„์ง€...

์ด ์งˆ๋ฌธ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถ™์—ฌ๋ณด๋‹ˆ๊นŒ ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์•ˆ ๋„ฃ์—ˆ์–ด์„œ, ์ฒ˜์Œ์—๋Š” ๋กœ๊ณ , ๋ฉ”๋‰ด, ๊ฒ€์ƒ‰์ฐฝ์„ ๊ทธ๋ƒฅ ํ•œ๋ฒˆ์— flex๋ฅผ ๋•Œ๋ฆฌ๊ณ , ๋ฉ”๋‰ด์—๋„ ๋‹ค์‹œ flex ๋ฅผ ์คฌ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ MDN ์‚ฌ์ดํŠธ์—์„œ๋Š” ๋กœ๊ณ ๋งŒ ๋นผ๊ณ  ๋ฉ”๋‰ด๋ž‘ ๊ฒ€์ƒ‰์ฐฝ์— ๋‹ค์‹œ grid๋ฅผ ์ค˜์„œ ๋Œ€์ฒด ์™œ?? ๊ทธ๋Ÿฐ๊ฑฐ์ง€ ํ•˜๊ณ  ์ด์ƒํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์—์„œ ๋ฉ”๋‰ด๋ฅผ ์—ด์—ˆ์„ ๋•Œ, ๊ฒ€์ƒ‰์ฐฝ๊ณผ ๋ฉ”๋‰ด์˜ ์œ„์น˜๊ฐ€ ๋ฐ˜๋Œ€๋กœ ๋ฐ”๋€Œ์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋ ค๊ณ  ๊ทธ๋ ‡๊ฒŒ ์ค€ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋ฉ”๋‰ด์™€ ๊ฒ€์ƒ‰์ฐฝ์— flex๋ฅผ ํ•œ๋ฒˆ ๋” ์ค˜์„œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์—์„œ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.


Q. menu__sub-menu ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์„ ๋•Œ, position: absolute; ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์œ„์น˜๋ฅผ ์žก์•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฉด width ๊ฐ€ ์—†์–ด์„œ ์ฐŒ๊ทธ๋Ÿฌ์ง€๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ width๋ฅผ ์กฐ์ ˆํ• ๊นŒ..?

๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ.. ๋”ฑ ๋งž์ถ”๊ณ  ์‹ถ์—ˆ์ง€๋งŒ, 100%๋ฅผ ์ฃผ๋ฉด ๋ถ€๋ชจ ๋„“์ด๋ฅผ ์ž๊พธ ๋”ฐ๋ผ๊ฐ€์„œ ๊ทธ๋ƒฅ min-width ๋กœ ์žก์•˜๋‹ค.




4. ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋œ ์‚ฌ์‹ค

  • filter: invert; ์ฃผ๋ฉด Svg image ์ƒ‰ ๋ฐ˜์ „ ๋จ!!!
  • MDN ์‚ฌ์ดํŠธ๋Š” grid, flex ๋กœ ์ „์ฒด ๋ ˆ์ด์•„์›ƒ์„ ์žก์•˜๋‹ค. section, aside ์ค‘๊ฐ„์˜ padding์„ ์–ผ๋งˆ๋‚˜ ์ค€๊ฑฐ์ง€? ํ•˜๊ณ  ๋œฏ์–ด๋ณด๋‹ˆ๊นŒ flex์— gap์„ ์ค€ ๊ฒƒ ์ด์—ˆ๋‹ค... ์ด๊ฑด 1220 ์‹œ์ ์ธ ์ง€๊ธˆ ๋‹ค์‹œ ๋ณด๋‹ˆ๊นŒ.. ์ฒ˜์Œ ๋“ค์„ ๋•Œ flex๊ฐ€ ์•ˆ๋‚˜์™”๋˜ ์˜›๋‚  ๊ฐ•์˜๋ฅผ ๋“ค์–ด์„œ ๋†€๋ผ์›Œํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์ง€๊ธˆ์€ flex๋ฅผ ๋‚จ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค.




5. ๋ฆฌ๋ทฐ

1121 ๋ฆฌ๋ทฐ

โœ…์›น ์ ‘๊ทผ์„ฑ ๋ถ™์ด๊ธฐ - ๊ฐ ์„น์…˜์— heading ํƒœ๊ทธ ๋ถ™์ด๊ณ , skip navigation ๋„ฃ์—ˆ๋‹ค.

โœ…hover ๋์„ ๋•Œ a ํƒœ๊ทธ ๋ฐ‘์ค„ ์ฃผ๊ธฐ.

โœ…js๋กœ sub-menu ๋‚˜์˜ค๊ฒŒ ํ–ˆ๋‹ค.

  • callback... ํ•จ์ˆ˜... swift ์—์„œ ๋น„๋™๊ธฐ๋กœ ๋‚˜๋ฅผ ๊ดด๋กญํžˆ๋˜ closure๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.
  • js ๋ถ™์ด๋‹ค๋ณด๋‹ˆ๊นŒ ํ—ค๋” ๋ถ€๋ถ„์„ flex > grid > flex ๋กœ ์“ด ์ด์œ ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.. ๋‚˜์ค‘์— ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด์•ผ ํ–ˆ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฑฐ์˜€๋‹ค... ๋Œ€๊ณต์‚ฌ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค...
  • dim ์ฒ˜๋ฆฌ๋ฅผ ๋„์ €ํžˆ ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์ž์‹์œผ๋กœ ์ค„ ์ˆ˜๊ฐ€ ์—†์–ด์„œ z-index ๋ถ€๋ชจ ์ž์‹ ํŠน์„ฑ ๋•Œ๋ฌธ์—... mdn ์€ ์–ด๋–ป๊ฒŒ ํ–ˆ๋‚˜ ๋ดค๋”๋‹ˆ div๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. ์ž์‹์—์„œ ๋ถ€๋ชจ๋ฅผ ์„ ํƒํ•  ์ˆ˜๊ฐ€ ์—†์–ด์„œ ์˜๋ฏธ ์—†๋Š” ๋งˆํฌ์—…์ด ๋“ค์–ด๊ฐ€๋Š”๊ฒŒ ์–ด์ฉ” ์ˆ˜๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค... checkbox ๋ž‘ label ์„ ์ด์šฉํ•ด์„œ iuput ์„ header ๋ฐ–์œผ๋กœ ๋นผ๊ณ , menu icon์„ ๋„ฃ์€ input์„ ์›๋ž˜ ๋„ฃ๊ณ  ์‹ถ์—ˆ๋˜ ๊ณณ์— ๋„ฃ์œผ๋ฉด js ์—†์ด๋„ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด๊ฒƒ๋„ ์˜๋ฏธ ์—†๋Š” ๋งˆํฌ์—…์ด๋„ค...

1220 JavaScript ๋” ๋ถ™์ด๊ธฐ!

MDN ๊ธ€์€ ์จ๋†“๊ณ  ์•ˆ์˜ฌ๋ฆฐ๊ฑธ ๊นจ๋‹ซ๊ณ , ์ข€ ๋” ๋‹ค๋“ฌ๊ณ  ๊ทธ ๋•Œ๋Š” JavaScript ์ดˆ๋ณด๋ผ์„œ ๋ชปํ–ˆ๋˜ ๋ถ€๋ถ„์„ ์ข€ ๋” ๋‹ค๋“ฌ์œผ๋ ค๊ณ  ๋“ค์–ด์™”๋Š”๋ฐ.. MDN ์‚ฌ์ดํŠธ์˜ ์•ฝ์ ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ํŒŒํŠธ์—์„œ ๋ฉ”๋‰ด๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋”ค์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋ฉด์„œ ๊นŒ๋งฃ๊ฒŒ ๋˜๋Š”๋ฐ, ๋ฉ”๋‰ด ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์€ ์˜ˆ์˜๊ฒŒ ๋ฐ”๋€Œ์–ด ์žˆ์œผ๋ฉด์„œ, dim ์ฒ˜๋ฆฌ ๋œ ์˜์—ญ์ด ๊ฐ€๋ฆฌ๊ณ  ์žˆ์–ด์„œ ์•„์˜ˆ ๋ˆ„๋ฅผ ์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ์ ์ด๋‹ค. ๋˜, dim ์˜์—ญ์„ ๋ˆ„๋ฅธ๋‹ค๊ณ  ๋ฉ”๋‰ด์ฐฝ์ด ๊บผ์ง€์ง€๋„ ์•Š๋Š”๋‹ค.

์ด ๋ถ€๋ถ„์„ ๊ฐœ์„ ํ•ด์„œ dim ์˜์—ญ์ด header ๋ฅผ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ฒŒ (css top ์†์„ฑ์„ ํ—ค๋” ๋†’์ด๋งŒํผ ๋‚ด๋ฆผ), dim ์˜์—ญ์„ ๋ˆ„๋ฅด๋ฉด ๋ฉ”๋‰ด๊ฐ€ ๊บผ์ง€๊ฒŒ! ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

function btnSmallClicked() {
    btnSmall.classList.toggle("on");
    if (btnSmall.innerText == "menu") {
        btnSmall.textContent = "menu_open";
    } else {
        btnSmall.textContent = "menu";
    }
}

// dim
dim.addEventListener('click', function(event) {
    if (event.target.classList.contains('dim')) {
        btnSmallClicked();
    }
});
profile
0๋…„์ฐจ iOS ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€