FrontEnd/CSS

์นด์นด์˜ค ํ”„๋ Œ์ฆˆ ์ƒต ํด๋ก ์ฝ”๋”ฉํ•˜๊ธฐ

ํŽญ๊ธดํ‚ด 2024. 2. 27. 13:27

๐Ÿ‘€ ์ž์‹ ์ด ์›ํ•˜๋Š” ์‚ฌ์ดํŠธ ๋ ˆ์ด์•„์›ƒ ํด๋ก 


๐Ÿง KaKao Shop Clone Coding ๐Ÿง

๊นƒ ํ—ˆ๋ธŒ ์ฃผ์†Œ : https://github.com/PenguinKKIM/kakao-shop-clone

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ
  • ๊ณผ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ํฌํ•จํ•œ README.md ํŒŒ์ผ์„ ์ œ๊ณตํ•˜์„ธ์š”!
  • ๊ณผ์ œ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ์‚ฌ์ดํŠธ(ํŽ˜์ด์ง€)์˜ ์ฃผ์†Œ๋ฅผ ๋ช…์‹œํ•˜์„ธ์š”!
  • ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•œ ํ”„๋กœ์ ํŠธ ํด๋”/ํŒŒ์ผ์ด ๋ชจ๋‘ ํฌํ•จ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค, ์ผ๋ถ€ ํŒŒ์ผ๋งŒ ์ œ์ถœํ•˜์ง€ ๋งˆ์„ธ์š”!
  • ์‹ค์ œ ์„œ๋น„์Šค๋กœ ๋ฐฐํฌํ•˜๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 

์นด์นด์˜คํ†ก ์Šคํ† ์–ด ์นด์นด์˜คํ”„๋ Œ์ฆˆ

์ผ์ƒ ์† ์ฆ๊ฑฐ์›€์„ ์ „ํ•˜๋Š”๋ผ์ดํ”„์Šคํƒ€์ผ ๋ธŒ๋žœ๋“œ

store.kakao.com

 

์นด์นด์˜คํ†ก ์Šคํ† ์–ด ์นด์นด์˜คํ”„๋ Œ์ฆˆ

์ผ์ƒ ์† ์ฆ๊ฑฐ์›€์„ ์ „ํ•˜๋Š”๋ผ์ดํ”„์Šคํƒ€์ผ ๋ธŒ๋žœ๋“œ

store.kakao.com


โžฐ์ด ์‚ฌ์ดํŠธ๋ฅผ ํด๋ก  ์ฝ”๋”ฉ ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ

  • ํ‰์†Œ์— ์นด์นด์˜ค ์บ๋ฆญํ„ฐ์— ๊ด€์‹ฌ์ด ๋งŽ์•„ ์ž์ฃผ ๊ฐ€๋Š” ์‚ฌ์ดํŠธ์— ๋ ˆ์ด์•„์›ƒ์„ ์‚ดํŽด๋ณด๋‹ˆ, ๊ฐ•์˜ ์—์„œ ๋ฐฐ์šด CSS ๋ฌธ๋ฒ•๋“ค์„ ์ ์ ˆํžˆ ๋‹ค ์‚ฌ์šฉํ• ์ˆ˜์žˆ์„๊ฑฐ๊ฐ™์•„ ์„ ์ • ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โžฐCLONE WEBPAGE PREVIEW

  • ๋ณธ ์‚ฌ์ดํŠธ์™€ ์‚ด์ง ๋‹ค๋ฅด๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์›๋ž˜ ์‚ฌ์ดํŠธ์—๋Š” hover ํ•˜๋ฉด ์•„๋ฌด์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ธ๋ฐ, ์ด๋ฏธ์ง€์— hover ํ•˜๋ฉด ์กฐ๊ธˆ ์ปค์กŒ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค,
    • ์Šคํƒ€๋ฒ…์Šค ํด๋ก ์ฝ”๋”ฉ ํ•˜์‹ ๊ฑฐ๋Ÿผ ์˜†์— ๋ฑƒ์ง€๊ฐ€ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค ์‹ถ์–ด ๋ช‡๊ฐœ ์ถ”๊ฐ€ ํ–ˆ์Šต๋‹ˆ๋‹ค.


โžฐ์‚ฌ์šฉํ•œ ์ฃผ์š” ๋ฌธ๋ฒ•

๐Ÿ‰์ตœ์ƒ๋‹จ Nav bar

body์˜ ์ตœ์ƒ๋‹จ์— ์žˆ๋Š” ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์—์„œ๋Š”

position: fixed;๋กœ ๊ตฌํ˜„์ด ๋˜์–ด์žˆ๋Š”๋ฐ,
fixed ๋กœ ํ•˜๋ฉด absolute ๋ฅผ ์“ด๊ฒƒ์ฒ˜๋Ÿผ ์š”์†Œ๊ฐ€ ๊ฒน์น˜๋Š” ์ผ์ด ์žˆ์–ด, ๋ฐ‘์— ์š”์†Œ์˜ height ๋‚˜ magin-top ์„ ๋†’๊ฒŒ ์žก์•„์•ผํ•˜๋Š”๊ฒŒ ์กฐ๊ธˆ ๋ถˆํŽธ ํ•˜์—ฌ,
๋‹ค๋ฅธ ๋ฌธ๋ฒ•์„ ์ฐพ์•„๋ณด๋‹ˆ position: sticky; ๋กœ ํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ๋˜์–ด ํ•ด๋‹น ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ์š”์†Œ ๋ฐ‘์— ๋“ค์–ด๊ฐ€๋Š”๊ฒƒ์•„ ๋‘๋ ค์›Œ z-index๋ฅผ ์ œ์ผ ๋งŽ์ด ๋นผ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

.top-nav{
  width: 100%;

  position: sticky;
  top: 0;

  display: flex;
  justify-content: center;

  border-bottom: 1px solid #e5e5e5;
  background-color: #ffffff;
  z-index: 1000;
}
๐Ÿ‰์Šคํฌ๋กค ์ƒ‰ ๋ฐ”๊ฟ”๋ณด๊ธฐ

์Šคํฌ๋กค์ด ๋„ˆ๋ฌด ๋ชป์ƒ๊ฒจ์„œ ๐Ÿ˜Š ์ƒ‰์„ ํ•œ๋ฒˆ ๋ฐ”๊ฟ” ๋ดค์Šต๋‹ˆ๋‹ค.

/* ์Šคํฌ๋กค์ปฌ๋Ÿฌ ์„ค์ •ํ•˜๊ธฐ */
.new-item__comps::-webkit-scrollbar{
  height: 10px;
  background-color: var(--color-jordy)
}

.new-item__comps::-webkit-scrollbar-thumb{
  background-color: var(--color-darkgreen)
}

.new-item__comps::-webkit-scrollbar-button{
  background-color: yellowgreen;
}
๐Ÿ‰Grid ์‚ฌ์šฉ ํ•˜๊ธฐ

์ค‘๊ฐ„์— ๊ฒฉ์ž ์š”์†Œ๋Š” ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์—์„œ๋Š” display:flex; ๋กœ ๋˜์–ด์žˆ์—ˆ๋Š”๋ฐ, display:grid; ๊ฐ€ ๋”์šฑ ์•Œ๋งž๋Š”๊ฑฐ๊ฐ™์•„ grid ๋กœ ๋ฐ”๊ฟ” ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค.

.quicklink-grid{
  display: grid;
  grid-template-columns: repeat(5,1fr);
  grid-template-rows: auto;
  gap: 1rem;

  justify-content: center;
  align-items: center;
  justify-items: center;
}
๐Ÿ‰๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ข‹์•„์š” ํ‘œ์‹œ ๋˜๊ฒŒํ•˜๊ธฐ

javaScript ์˜ toggle ์„ ์ด์šฉํ•˜์—ฌ ๊ทธ๋ ‡๊ฒŒ ๋˜๊ฒŒ ๋ณด์ด๋Š”๊ฑฐ์ฒ˜๋Ÿผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

const likeBtns = document.querySelectorAll('.best-ranking__heart');

likeBtns.forEach(e => {
  e.addEventListener('click', () => {
    e.classList.toggle('btnActive');
  });
});

querySelector ๋ฅผ ์“ฐ๋ฉด ๊ทธ ๋ฌธ์„œ์˜ ์ตœ์ƒ๋‹จ์˜ ์š”์†Œ๋งŒ ์„ ํƒ๋จ์œผ๋กœ, querySelectorAll ์„ ์“ฐ๊ณ  forEach ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ addEventListener ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

toggle ์„ ์‚ฌ์šฉํ•˜๋ฉด classList.add ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ๋”ํ•˜๊ณ , ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฉด classList.remove ๋กœ ์—†์• ์ค˜์•ผ ํ•˜์ง€๋งŒ

toggle์„ ์„ ์“ฐ๋ฉด ํ•œ ์ค„ ๋กœ ์ค„์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ ํ• ์ˆ˜์žˆ์–ด ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ‰๊ทธ ์™ธ ๊ฐ•์˜์— ๋‚˜์˜จ js ๋ฌธ๋ฒ• ์‚ฌ์šฉ

์Šคํƒ€๋ฒ…์Šค ๊ฐ•์˜์— ๋‚˜์˜จ js api ๋ฌธ๋ฒ•์„ ๋ณต์Šต ํ•˜์—ฌ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

  • lodash
  • swiper
  • gasp
  • iframe

โžฐ๋А๋‚€์ 

  • ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋œฏ์–ด๋ณด๋ฉฐ ์—ฌ๊ธฐ์—” ์ด๋ ‡๊ฒŒ์“ฐ๊ณ  ์ด๋ ‡๊ฒŒ ์ผ๊ตฌ๋‚˜ ์ž์„ธํžˆ ์•Œ์ˆ˜์žˆ์–ด์„œ ์ข‹์€ ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  • JavaScript๋กœ ์ž‘๋™ํ• ์ˆ˜ ์žˆ๋Š”๊ฒƒ๋„ CSS ๋กœ๋„ ํ• ์ˆ˜์žˆ๋Š” ๋ฌธ๋ฒ•์„ ์•Œ์ˆ˜์žˆ์–ด ์žฌ๋ฐŒ์—ˆ์Šต๋‹ˆ๋‹ค.

โžฐ์•„์‰ฌ์šด์ 

  • ์ฝ”๋“œ๋ฅผ ์งœ๋‹ค๋ณด๋‹ˆ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ธฐ๊ณ  ํฌ๊ธฐ๋งŒ ๋‹ค๋ฅธ ์š”์†Œ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ, ์ „์ฒด์ ์œผ๋กœ ์š”์†Œ๋“ค์„ ํ™•์ธํ•˜๊ณ  ํด๋ž˜์Šค๋งŒ ๋‹ค๋ฅด๊ฒŒ ๋ถ™์—ฌ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋ฉด ์–ด๋• ์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค์ค‘๋ณต๋˜๋Š” ํƒ€์ดํ‹€์ด๋‚˜ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋งŒ ๋‹ค๋ฅธ๊ฒƒ๋“ค์ด ๋งŽ์•„, ์žฌ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ ๊ทธ๋Ÿฌ์ง€ ๋ชปํ–ˆ๋˜๊ฒŒ ํ•˜์‰ฝ์Šต๋‹ˆ๋‹ค.
    • ์ฒ˜์Œ์— ํ™”๋ฉด์„ ๋ณด๊ณ  ์ž˜ ์„ค๊ณ„ ํ•˜๋Š”๊ฒŒ ์ œ์ผ ์ตœ์„ ์ผ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
  • (ํ˜„์žฌ ์ฝ”๋“œ๋Š” ์„น์…˜๋ณ„๋ฃจ ๊ทธ๋ƒฅ ๋‹ค ๋‹ค๋ฅด๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค)
  • JavaScript ๋ฅผ ์ข€ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ ์‹ถ์—ˆ์œผ๋‚˜, ์ž์„ธํžˆ ๋ชจ๋ฅด๋Š”๊ฒƒ๋“ค์ด ๋งŽ์•„ ์–ผ๋ ๋šฑ๋•… ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    // store-nav
    const navBtn = document.querySelectorAll('.store-nav__list-comp');
    
    navBtn.forEach( e => {
      e.addEventListener('click', () => {
        e.classList.toggle('navActive');
      })
    })
    ์œ„์— ์ข‹์•„์š” ๋ฒ„ํŠผ์„ ๊ตฌํ˜„ํ•œ๊ฑฐ์™€ ๊ฐ™์ด toggle ๋กœ ํ–ˆ์œผ๋‚˜, ์ข‹์•„์š” ๋ฒ„ํŠผ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋„ค๋น„๊ฒŒ์ด์…˜ ์š”์†Œ๋Š” ๋‹ค๋ฅธ ๋„ค๋น„๊ฒŒ์ด์…˜ ์š”์†Œ๋ฅผ ํด๋ฆญํ–ˆ์„๋•Œ ํ•˜๋‚˜๋งŒ ํ™œ์„ฑํ™” ๋˜๊ฒŒ ํ•ด์•ผํ•˜๋Š”๋ฐ ๊ทธ๊ฑธ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ฐพ์•„๋ณด๊ณ  ๊ตฌํ˜„ํ•ด ๋ณผ๊ฑธ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค.๐Ÿ˜ข
  • ํŽ˜์ด์ง€๋ฅผ ์„ ์ •ํ• ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋” ๋“ค์–ด๊ฐ„ ํŽ˜์ด์ง€๋ฅผ ์„ ์ •ํ–ˆ์–ด์•ผํ–ˆ๋‚˜ ์‹ถ์Šต๋‹ˆ๋‹ค.
  • ์ด ์™ธ์— ์„ธ์„ธํ•˜๊ฒŒ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ตฌํ˜„ ๋ชปํ•œ ๋ถ€๋ถ„์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.
๊ธฐํƒ€๋“ฑ๋“ฑ
  • ํด๋ก  ์ฝ”๋”ฉ์„ ์กฐ๊ธˆ ํ•ด๋ณด๊ธดํ–ˆ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋‚จ๋“ค ์„ค๋ช…ํ•˜๊ณ  readme ๋ฅผ ์„ธ์„ธํ•˜๊ฒŒ ์ž‘์„ฑ ํ•ด๋ณธ์ ์ด ์—†์–ด์„œ ์ƒˆ๋กœ์šด ๊ฒฝํ—˜ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋งˆํฌ๋‹ค์šด ์–ธ์–ด๋กœ ์ด๊ฒƒ์ €๊ฒƒ ํ•ด๋ณด๋Š”๊ฒŒ ์žฌ๋ฐŒ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ ์žฅํ™ฉํ•˜๊ฒŒ์ผ์ง€๋งŒ ์ž˜ํ–ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค... ํ”ผ๋“œ๋ฐฑ ๋งˆ๋‹ˆ๋งˆ๋‹ˆํ•ด์ฃผ์„ธ์š” ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿง