[Front-end๐Ÿฆ] #16 Vending Machine, Login Modal ๋งˆ๋ฌด๋ฆฌ! / CSS ์‹ค์ „ ํŒ

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

front-end

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

1. Vending Machine

1-1. ์ˆ˜์—…

  • CSS ํ†ต์ผ์„ฑ ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜์ž. float๋กœ ์คฌ๋‹ค๋ฉด float๋กœ! line-height๋กœ ์ค‘์•™ ์ •๋ ฌ ํ–ˆ๋‹ค๋ฉด ๊ณ„์† line-height๋กœ.
  • media query : ๋‚˜๋Š” ๊ท€์ฐฎ์•„์„œ ์ฃผ์–ด์ง„ ๋””์ž์ธ ํฌ๊ธฐ์—์„œ๋งŒ ์ž˜ ๋™์ž‘ํ•˜๊ฒŒ ๋งž์ถ”์—ˆ๋Š”๋ฐ ์„ธ๋ถ„ํ™”ํ•ด์„œ ๋งž์ถฐ์•ผ ํ•œ๋‹ค.
@media screen 
and (min-device-width: 320px) 
and (max-device-width: 480px)
and (-webkit-min-device-pixel-ratio: 2) {
    /* ๊ธฐ๊ธฐ์˜ ๋„“์ด๊ฐ€ 320px~ 480px */

}

2. Login Modal

์ €๋ฒˆ์— ๋ชจ๋“ˆํ™”, ๋กœ๊ทธ์ธ ์ฒซ๋ฒˆ์งธ ์ฐฝ๊นŒ์ง€๋งŒ ๋งŒ๋“ค์–ด๋†จ์—ˆ๋Š”๋ฐ ๋ชจ๋‹ฌ๋กœ ๋„์šธ ์ˆ˜ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์•ˆ์˜ ํ™”๋ฉด์„ ์žก์•˜๋‹ค.

tipsโœจ

- ์š”์†Œ์˜ ๋†’์ด๋ฅผ ์›ฌ๋งŒํ•˜๋ฉด ์ง€์ •ํ•˜์ง€ ๋ง์ž...! padding์„ ์ด์šฉํ•ด์„œ ์•ˆ์˜ contents์˜ ๋†’์ด์— ์ข…์†๋˜๋„๋ก ํ•˜์ž.
-
- position์„ ์ค„ ๋•Œ ๊ฐ€์žฅ ๋ฐ”๊นฅ์— ์žˆ๋Š” ์š”์†Œ์— ์ฃผ์ž. ํŠนํžˆ button>img, a>img ์˜ ๊ฒฝ์šฐ button์ด๋‚˜ a์— ์ค˜์•ผํ•จ. ๊ธฐ๋Šฅ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋‚˜ focusing์ด ์•ˆ๋ผ์„œ ์ ‘๊ทผ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€.
-
- inline ์š”์†Œ์— position์„ ์ฃผ๋ฉด display: block ์ด ๋œ๋‹ค. ๋‘ ๋ฒˆ ๋ช…์‹œํ•  ํ•„์š” ์—†๋‹ค.
-
- modal dim ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” after๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐ๊ฒฝ ์ฃผ๊ณ , z-index๋ฅผ ์ค˜์„œ ๋’ค์— ๊ฒƒ์„ ํด๋ฆญํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜์ž.
.modal-login::after{
    display: block;
    content:"";
    position:fixed;
    top:0; right:0; left:0; bottom:0;
    background-color: black;
    opacity: .3;
    z-index: 10;
}
- ๋„“์ด, ๋†’์ด ๋ชจ๋ฅผ ๋•Œ๋„ ```transform: translate(-50%, -50%);``` ์ค‘์•™์œผ๋กœ ๋•ก๊ธธ ์ˆ˜ ์žˆ๋‹ค!
-
- ์ค‘๊ฐ„์—.. ์ž˜ ๋”ฐ๋ผ๊ฐ€๋‹ค๊ฐ€ ์ง„์งœ ์ œ๋Œ€๋กœ ๋‹ค ์คฌ๋Š”๋ฐ ๊ผฌ์—ฌ์„œ ๋ชจ๋“  ์Šคํƒ€์ผ์ด ๋‚ ์•„๊ฐ€๊ณ  ๊ทธ๋ž˜์„œ... ๊ทธ๋ƒฅ ๋‚ ๋ฆฌ๊ณ  ์„ ์ƒ๋‹˜์ด ์ฃผ์‹  ํŒŒ์ผ์„ ๋„ฃ์—ˆ๋‹ค...... ๋ฐฑ์—…์˜ ์ค‘์š”์„ฑ์„ ์•Œ์•˜๋‹ค.
-
- ์˜๋ฏธ์—†๋Š” html ์š”์†Œ๋Š” ์ตœ๋Œ€ํ•œ ๊ฐ€์ƒ์š”์†Œ๋กœ ๋งŒ๋“ค์ž.
-
/* ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•ด ์•„์ด์ฝ˜ ๊ฐ™์€ ๊ฐ€์ƒ์š”์†Œ์— focus ๋์„ ๋•Œ outline ๋งŒ๋“ค์–ด์ฃผ์ž */
.form-login .inp-hold:focus + .labl-hold::before {
    outline: 2px solid black;
    outline-offset: 5px;
}



3. CSS ์‹ค์ „ ํŒโœจ

3-1. select ์ง์ ‘ ๊ตฌํ˜„

select, option style ์„ ์ ์šฉ์‹œ์ผœ๋ดค๋Š”๋ฐ, ๋ธŒ๋ผ์šฐ์ € ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š”๋ฐ๋‹ค๊ฐ€ custom ๊ฐ€๋Šฅํ•œ ์˜์—ญ์ด ๋‹ค ๋‹ค๋ฅด๊ณ , vendor prefix ๋„ ์ ์šฉํ•ด์•ผํ•ด์„œ, ul>li>button ์œผ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š”.


3-2. image replace

1. PC์šฉ ์‚ฌ์šฉ๋œ ์ด๋ฏธ์ง€๋‚ด ์˜๋ฏธ์žˆ๋Š” ํ…์ŠคํŠธ์˜ ๋Œ€์ฒดํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ• ๋•Œ

.ir_pm{
    display:block;
    overflow:hidden;
    Font-size:1px;
    line-height:0;
    text-indent:-9999px;
}

2. Mobile์šฉ ์‚ฌ์šฉ๋œ ์ด๋ฏธ์ง€๋‚ด ์˜๋ฏธ์žˆ๋Š” ํ…์ŠคํŠธ์˜ ๋Œ€์ฒดํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ• ๋•Œ

.ir_pm{
    display:block;
    overflow:hidden;
    font-size:1px;
    line-height:0;
    /* IE6,7์—์„œ ์ง€์›์ด ์•ˆ๋จ.....*/
    color:transparent; 
}

3. ์Šคํฌ๋ฆฐ๋ฆฌ๋”๊ฐ€ ์ฝ์„ ํ•„์š”๋Š” ์—†์ง€๋งŒย  ๋งˆํฌ์—… ๊ตฌ์กฐ์ƒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

.screen_out {
    overflow: hidden;
    position: absolute;
    /* width, height 0์œผ๋กœ ๋งŒ๋“ค๋ฉด ์Šคํฌ๋ฆฐ๋ฆฌ๋”๊ฐ€ ์•ˆ์ฝ์Œ */
    width: 0;
    height: 0;
    line-height: 0;
    text-indent: -9999px;
}

4. ์ค‘์š”ํ•œ ์ด๋ฏธ์ง€ ๋Œ€์ฒดํ…์ŠคํŠธ๋กœ ์ด๋ฏธ์ง€ off ์‹œ ์—๋„ ๋Œ€์ฒด ํ…์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ ์ž ํ• ๋•Œ

.ir_wa{
    display:block;
    overflow:hidden;
    position:relative;
    z-index:-1;
    width:100%;
    height:100%
}

5. ์ดˆ๋ก์ฐฝ์—์„œ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

.blind {
    position: absolute;
    clip: rect(0 0 0 0); /* clip์€ absolute๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ์ž‘๋™ํ•จ */
    width: 1px;
    height: 1px;
    margin: -1px;
    overflow: hidden;
}

3-3. Sprite image

์„œ๋ฒ„์—์„œ ๋‚ด๋ ค๋ฐ›๋Š” ์ด๋ฏธ์ง€ ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด sprite ์ด๋ฏธ์ง€๋ฅผ ์ด์šฉํ•ด์„œ login modal์˜ SNS icon์„ ๋ฐ”๊ฟ”๋ณด์•˜๋‹ค. ์ž์ฃผ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ด๋ฏธ์ง€์—๋Š” ์•ˆ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!

background: url('์ด๋ฏธ์ง€์ฃผ์†Œ') 0 -20px; 
// ์™ผ์ชฝ ๋์ด 0, 0 ์ด๋ฏ€๋กœ position์„ ๋ฐ€์–ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

3-4. ๋ ˆํ‹ฐ๋‚˜ ๋””์Šคํ”Œ๋ ˆ์ด ๋Œ€์‘

์• ํ”Œ... ์ด๋ฏธ์ง€๊ฐ€ ์ž‘์•„์ง€๊ฑฐ๋‚˜ ํ™”์งˆ์ด ๊ตฌ๋ ค์ง„๋‹ค. ๊ฐ€๋กœ 2๋ฐฐ ์„ธ๋กœ 2๋ฐฐ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ค€๋น„ํ•ด์„œ, 2๋ฐฐ ์ด๋ฏธ์ง€์˜ size, position์€ 1๋ฐฐ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ์™€ ๋˜‘๊ฐ™์ด (width, height ์กฐ์ ˆ) ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.


  • ๋ชจ๋“  style tag์— CSS๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, CSS ํŒŒ์ผ์„ ๋ชป ๋ฐ›๊ฒŒ ๋ผ์„œ html๋งŒ ๋œจ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.



4. JS Chaellenge

addEventListener ์— if-else ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

style ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์›ฌ๋งŒํ•˜๋ฉด CSS์—์„œ ํ•˜์ž.

js๋ฅผ ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ์“ฐ์ž. ๋Œ€์‹  raw String ๋ณด๋‹ค๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ด์„œ ์“ฐ์ž.

element์— class๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ event ์‹œ style ๋ณ€๊ฒฝ

<h1 class="font">Click Me!</h1>
h1 {
    color: cornflowerblue;
}
.clicked {
    color: pink;
}
.font {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}

๋ฐ‘์˜ js ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ๊ฐ™์€ ๋™์ž‘์„ ํ•œ๋‹ค.

// 1. ์ •์งํ•˜๊ฒŒ style ์ด์šฉ -> style์€ CSS์—์„œ ๋ฐ”๊พธ๋Š”๊ฒŒ ์ข‹๋‹ค.
// 2๋ฒˆ ์ด์ƒ ์“ฐ์ด๋ฉด ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์ž.
const h1 = document.queryString("h1");
function handleTitleClick() {
  const currentColor = h1.style.color;
  let newColor;
  if (currentColor === "cornflowerblue") { newColor = "pink"; }
  else { newColor = "cormflowerblue"; }
  h1.style.color = newColor
}
// 2. className ์„ ๋ฐ”๊ฟ”์คŒ -> ์›๋ž˜ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ class๊ฐ€ ๋‚ ์•„๊ฐ.
const h1 = document.queryString("h1");
function handleTitleClick() {
  const clickedClass = "clicked"
  if (h1.className === clickedClass) { h1.className = ""; }
  else { h1.className = clickedClass; }
}
// 3. classList ์ด์šฉ. -> ๊ตฟ
const h1 = document.queryString("h1");
function handleTitleClick() {
  const clickedClass = "clicked"
  if (h1.classList.contain(clickedClass)) { h1.classList.remove(clickedClass); }
  else { h1.classList.add(clickedClass); }
}
// 4. ๊ทธ์น˜๋งŒ ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ํ† ๊ธ€์ด ์žˆ๋‹ค!!!
function handleTitleClick() {
    h1.classList.toggle("clicked");
}



5. ํšŒ๊ณ 

  • ๋„ˆ๋ฌด ๋ฐ”์˜๊ฒŒ ์‚ฌ๋‹ˆ๊นŒ ํšŒ๊ณ ๋ฅผ ๋Œ€์ถฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋Š๋‚€์ ์œผ๋กœ ๋งค์ผ ํšŒ๊ณ ๋ฅผ ์ ๊ณ  ์žˆ๋Š”๋ฐ, ํ€„๋ฆฌํ‹ฐ๊ฐ€ ์ ์  ๋–จ์–ด์ง„๋‹ค. ๋‹ค์‹œ ๋ฉ”์ด์ปค์ค€๋‹˜์ด ์•Œ๋ ค์ฃผ์‹  ๊ธฐ์ค€์— ๋งž์ถฐ์„œ ์ ์–ด๋ด์•ผ๊ฒ ๋‹ค.

fact - ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋Š”์ง€, ๋ญ˜ ํ–ˆ๋Š”์ง€

  • ์˜ค๋Š˜์€ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋˜ ๋‘๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ(Vending Machine, Login Modal)๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ , ์›น ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•œ CSS ํŒ์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค.

feeling - ๋ฌด์—‡์„ ๋Š๊ผˆ๋Š”์ง€,
finding - ์–ด๋–ค ์ธ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€

  • ํ™”๋ฉด์— ๋ณด์ด๋Š” ๊ฒƒ์€ ๊ตฌ๊ธ€๋ง์˜ ๋„์›€์„ ๋ฐ›์œผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ณด์ด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ํ”„๋กœ์ ํŠธ ๊ฐ•์˜์— ๋Œ€ํ•œ ๋ณต์Šต์€ ์†Œํ™€ํžˆ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ง์ ‘ ์ง  Vending Machine ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„๋ณด๋‹ˆ ํ™”๋ฉด์— ๋ณด์ด๋Š” ๊ฒƒ์œผ๋กœ ๋์ด ์•„๋‹ˆ๋‹ค. ์ž๋งŒํ•˜์ง€ ๋ง์ž.

future action - ์•ก์…˜ ํ”Œ๋žœ์ด ์žˆ๋Š”์ง€

  • ์˜ค๋Š˜ ํ•œ ๋‘๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆํฌ์—… ๋ถ€ํ„ฐ CSS๊นŒ์ง€ ์„ ์ƒ๋‹˜์ด ๋ณด์—ฌ์ฃผ์‹  ๋ฐฉ๋ฒ•๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๋ณด๊ณ , ๋‚ด๊ฐ€ ํ–ˆ๋˜ ๊ฒƒ์— ๋Œ€ํ•ด ๋ฐ›์€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ณ  ์ง์ ‘ ๊ณ ์ณ๋ณด๊ธฐ
  • ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ, ํ•ด๋‹น ์ •๋ฆฌ๋ณธ์„ ๋ณด๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ์ œ๋Œ€๋กœ ์งœ์ž๋Š” ์ƒ๊ฐ์œผ๋กœ ์ฐธ์—ฌํ•˜๊ธฐ
  • ์›น ์ ‘๊ทผ์„ฑ์„ ์œ„ํ•œ ์ฝ”๋“œ ์—ญ์‹œ ์–ด๋””์„ ๊ฐ€ ๋ณต๋ถ™ํ•ด์˜ค๊ณ  ์žˆ๋Š”๋ฐ, ํ”„๋กœ์ ํŠธ์— ๋„ฃ์„ ๋•Œ, ์•ˆ๋ณด๊ณ  ์–ด๋–ค ์†์„ฑ์ด ์žˆ์–ด์•ผ ํ™”๋ฉด์— ์•ˆ๋‚˜์˜ค๋ฉด์„œ ์ฝํžˆ๋Š”์ง€ ์ƒ๊ฐํ•˜๋ฉด์„œ ์ณ๋ณด๊ธฐ.

feedback - ์œ„ ๋‚ด์šฉ์„ ํ†ตํ•ด์„œ ์ง„ํ–‰ํ•œ ์•ก์…˜์— ํ”Œ๋žœ์— ๋Œ€ํ•ด ํ”ผ๋“œ๋ฐฑ - 1120

  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ›์€ ๊ฒƒ์„ ๋ณด๋‹ˆ๊นŒ flex๋‚˜ grid ๊ฐ™์€ ๊ฒƒ์„ ์ž˜๋ชป ์‚ฌ์šฉํ–ˆ๋‹ค๊ธฐ ๋ณด๋‹ค๋Š” width, height, padding ๊ฐ™์€ ์˜คํžˆ๋ ค ๋‹จ์ˆœํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์—์„œ ๊ฐœ์„ ์ ์ด ๋งŽ์•˜๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์–ด์ œ ์„ธ์šด ์•ก์…˜ ํ”Œ๋žœ์ธ ์ฝ”๋“œ ์ „๋ถ€ ๋”ฐ๋ผ์น˜๊ธฐ๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋งŽ์ด ์†Œ์š”๋ผ์„œ html, CSS, ํ”ผ๊ทธ๋งˆ ํ™”๋ฉด์„ ๋„์›Œ๋†“๊ณ  ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์žก์•˜๋Š”์ง€, class ์ด๋ฆ„์€ ์–ด๋–ป๊ฒŒ ์คฌ๋Š”์ง€์™€ ์ด๋Ÿฐ ์†์„ฑ์„ ์ฃผ๊ธฐ ์œ„ํ•ด ์–ด๋–ค CSS ์†์„ฑ์„ ์คฌ๋Š”์ง€๋ฅผ ์ค‘์ ์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ํ›‘๊ณ  ๋ณต์Šต์„ ๋๋ƒˆ๋‹ค. ํšจ์œจ์ ์ธ ๋ณต์Šต ๋ฐฉ๋ฒ•์„ ๊ณ„์† ์ฐพ์•„ ๋‚˜๊ฐ€์ž!



profile
0๋…„์ฐจ iOS ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

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