[Front-end๐Ÿฆ] #20 SASS, CSS ์‹ค๋ฌด ํŒ

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

front-end

๋ชฉ๋ก ๋ณด๊ธฐ
31/58

1. SASS

์–ด์ œ์— ์ด์–ด์„œ ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ง„๋„๋ฅผ ๋‚˜๊ฐ”๋‹ค.

#19์˜ 2-8 ๋ถ€ํ„ฐ ์ด์–ด์„œ ์ •๋ฆฌํ–ˆ๋‹ค.

+) ์ˆ˜์—…์ด ๋๋‚˜๊ณ  #15, #16, #16.5 ์—์„œ ์ง„ํ–‰ํ–ˆ๋˜ Vending Machine ์˜ CSS๋ฅผ ์ง์ ‘ SASS๋กœ ๋ฐ”๊พธ์–ด๋„ ๋ณด์•˜๋‹ค. ์†Œ์Šค์ฝ”๋“œ.scss

์•„์ง์€ ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ํŒŒ์ผ ๋ถ„๋ฆฌ๊นŒ์ง€๋Š” ํ•˜์ง€ ์•Š์•˜๋‹ค.




2. CSS tipsโœจ

2-1. Custom Select

์ฝ”๋“œ

poistion ์„ ์ฃผ๋ฉด inline-block ์ฒ˜๋Ÿผ ๋„“์ด ์ „์ฒด๋ฅผ ๋‹ค ์ฐจ์ง€ํ•˜๋Š” ์†์„ฑ์ด ์—†์–ด์ง€๊ฒŒ ๋œ๋‹ค.

  • border๋ฅผ ์ด์šฉํ•œ ํ™”์‚ดํ‘œ ๋งŒ๋“ค๊ธฐ!
div {
    border-top: 10px solid black;
    border-left: 10px solid transparent;
    border-right: 10px solid transparent;
    border-bottom: 10px solid transparent;
}
  • ์—ญ์‹œ width๋Š” ๊ฐ€์žฅ ํฐ ๋‹จ์œ„์— ์ฃผ๊ณ  ๋ถ€๋ชจ์˜ padding์„ ์ด์šฉํ•ด์„œ ์ž์‹ ์š”์†Œ์˜ width ์กฐ์ •, height๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์— ์ฃผ๊ณ  padding, margin์„ ์ด์šฉํ•ด์„œ ๋ถ€๋ชจ๊ฐ€ ์ข…์†๋˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ๋‹ค. ์•„๋Š”๋ฐ๋„ ์ž๊พธ ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜..ใ… ใ… 

  • background๋Š” position ์†์„ฑ์„ ์ด์šฉํ•ด์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

background: url("Polygon\ 1.png") center right 10px no-repeat;

3-2. ๋ฐ˜์‘ํ˜•

  1. img
width: 100%;
max-width: 100%; /* ์›๋ณธ ํฌ๊ธฐ ์ด์ƒ์œผ๋กœ ์ปค์ง€์ง„ ์•Š์Œ */

jpg๋Š” ์šฉ๋Ÿ‰์ด ์ž‘์ง€๋งŒ ํˆฌ๋ช… ์ฒ˜๋ฆฌ๋Š” ๋ถˆ๊ฐ€๋Šฅ. gif ํˆฌ๋ช… ํ‘œํ˜„ ๊ฐ€๋Šฅ but ์กฐ์ ˆ ๋ถˆ๊ฐ€๋Šฅ.

  1. background image
// background-size ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ์ž„.
background-size: contain; // ์š”์†Œ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํ•œ๋„์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ž๋ฅด์ง€ ์•Š์œผ๋ฉด์„œ ๊ฝ‰ ์ฑ„์›€.
background-size: cover; // ์š”์†Œ์— ์™„์ „ํžˆ ๊ฝ‰ ์ฐจ๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ์ž๋ฅด๋ฉด์„œ ๊ฝ‰ ์ฑ„์›€
background-position: 0; ์„ธ๋กœ ์ค‘์•™ ์ •๋ ฌ
background: color image repeat position / size
  1. video
Poster : ๋น„๋””์˜ค๋ฅผ ๋‚ด๋ ค๋ฐ›์„ ๋™์•ˆ ํ˜น์€ ์˜์ƒ์„ ์žฌ์ƒํ• ๋•Œ๊นŒ์ง€ ํ‘œ์‹œํ•  ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •.
Controls : ์ปจํŠธ๋กค๋Ÿฌ ์ œ๊ณต
Autoplay:  ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ ํ›„ ์ž๋™์žฌ์ƒ
Muted: ์†Œ๋ฆฌ๋ฅผ ๋•๋‹ˆ๋‹ค.
Loop : ๋ฐ˜๋ณต ์žฌ์ƒ.
ํฌ๋กฌ์˜ ๊ฒฝ์šฐ muted๊ฐ€ ์—†์œผ๋ฉด autoplay๊ฐ€ ์•ˆ๋จ. -> ์ ‘๊ทผ์„ฑ!
// iframe์€ ๊ฐ€๋กœ๋Š” ๊ฝ‰ ์ฐจ๊ณ  height๋Š” ๊ณ ์ •๋˜์–ด์„œ ์˜์ƒ์ด ์กฐ๊ทธ๋งฃ๊ฒŒ ์ค„์–ด๋“ค๋ฉด์„œ ๊นŒ๋งŒ ์˜์—ญ์ด ์ƒ๊น€.
// ๊ฐ€๋กœ๊ฐ€ ๋Š˜์–ด๋‚ ๋•Œ ์„ธ๋กœ๋„ ๋Š˜์–ด๋‚˜๋ ค๋ฉด ๋™์˜์ƒ์„ ๋‚ด๋ ค์ค˜์•ผํ•จ. -> padding-top์œผ๋กœ ํ•ด๊ฒฐ.
// ๊ทธ๋ฆฌ๊ณ  ๋ฐ‘ ๋ผ์ธ์ด ๋‚ด๋ ค๊ฐ€๋˜, ์œ„๋Š” ๋ถ™์–ด์žˆ๊ฒŒ ๋งŒ๋“ค์ž.
.cont-video {
    position: relative;
    padding-top: 56.25%; 
    // padding ์— % ๋ฅผ ์ฃผ๋ฉด ๋ถ€๋ชจ width๊ฐ€ ๊ธฐ์ค€์œผ๋กœ ๋„“์ด๊ฐ€ ๊ณ„์‚ฐ๋œ๋‹ค.
} 
.video-next-level {
    position: absolute;
    top: 0;
    left: 0;
    /* width, height ์•ˆ์ฃผ๊ณ  right bottom๊นŒ์ง€ ๋ถ™์—ฌ๋ฒ„๋ ค๋„ ๋˜์ง€ ์•Š๋‚˜? */
    /* -> iframe์€ replaced element ๋ผ์„œ ์™ธ๋ถ€ ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์—
    left right๋ฅผ ์ด์šฉํ•ด์„œ ๋„“์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค. */
    width: 100%;
    height: 100%;
}
<article class="cont-video">
  <!-- iframe ๋งํฌ์— autoplay, controls ๊ฐ™์€ ์†์„ฑ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. -->
	<iframe class="video-next-level"
            src="https://www.youtube.com/embed/4TWR90KJl84?autoplay=1&mute=1&loop=1&playlist=4TWR90KJl84&controls=1"
            title="YouTube video player" frameborder="0" allowfullscreen></iframe>
</article>

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์˜์ƒ์€ ๋น„๋””์˜ค ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ž. ์œ ํˆฌ๋ธŒ์—์„œ ๊ฐ€์ ธ์˜ค๋ฉด ๊ณ„์†ํ•ด์„œ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆผ.




3. JS Challenge

Math

Math.random(); //๋žœ๋ค
// ๋ฐ˜์˜ฌ๋ฆผ, ๋‚ด๋ฆผ, ์˜ฌ๋ฆผ
Math.round(); Math.floor(); Math.ceil();

js๋กœ element ์ƒ์„ฑ

// HTML ๊ฐ์ฒด๋ฅผ JS๋กœ ์ƒ์„ฑ.
const bgImage = document.createElement("img");
bgImage.src = `img/${chosenImage}`;
// body์— ๋„ฃ์–ด์คŒ.
document.body.appendChild(bgImage); // body๋งจ ๋’ค์— ์ถ”๊ฐ€
document.body.prependChild(bgImage); 

js๋กœ CSS ์†์„ฑ์„ ์ฃผ๋Š” ๋ฐฉ๋ฒ•

body.style.background = `linear-gradient(${selectedColor1}, ${selectedColor2})`;

์˜ค๋Š˜ ๊ณผ์ œ๋Š” ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค! ์›น์‚ฌ์ดํŠธ ๋œฏ์–ด๋ณผ ๋•Œ ์ด์ƒํ•œ ์ด๋ฆ„์œผ๋กœ ๋˜์–ด์žˆ๋Š” ๊ฒƒ๋“ค ๋™์  ์ƒ์„ฑ์ด๋ผ๊ณ  ํ•˜์…จ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•œ๊ฑฐ์ง€ ํ–ˆ๋Š”๋ฐ.. ์ด๋ ‡๊ฒŒ ํ•œ๊ฑฐ๊ตฌ๋‚˜!!! ํ•˜๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.




4. ์ž‘์€ ํšŒ๊ณ 

1. SASS ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ํ•จ์ˆ˜์˜ ๋ฌธ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ , ์‹ค์ œ ๋ฉ˜ํ† ๋‹˜์ด ์‚ฌ์šฉํ•˜์‹œ๋Š” ์˜ˆ์‹œ๋ฅผ ๋ดค๋‹ค. ์ˆ˜์—… ๋๋‚˜๊ณ  ์–ด์ œ Vending Machine CSS๋ฅผ SCSS๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๋งˆ์ € ๋ฐ”๊ฟ”๋ดค๋‹ค.

feeling / finding: ์ฒ˜์Œ์—๋Š” ๋งˆ๋ƒฅ ์–ด๋ ต๊ธฐ๋งŒ ํ–ˆ๋Š”๋ฐ, ๊ณตํ†ต๋˜๋Š” ์†์„ฑ์„ ๋ฌถ์–ด์„œ ํ•œ์ค„๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ๊ฐ€ ์งœ๋ฆฟํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ .. ์ „๋ถ€ ์ค‘์ฒฉํ•ด์„œ ๋‚˜๊ฐˆ ์š”์†Œ์—๋งŒ @at-root ๋ฅผ ์คฌ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์จ๋„ ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค. ์•„ ๋˜, ์‚ฌ์‹ค ์ง€๊ธˆ ๋‹จ๊ณ„์—์„œ๋Š”... function์ด๋‚˜ ๋‹ค๋ฅธ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ... ์ ์šฉํ•˜๊ธฐ์—” ๊ทœ๋ชจ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ mixin๋งŒ ๋งค์šฐ ๋งŽ์ด ์จ์„œ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์žˆ์„์ง€๋„ ๊ถ๊ธˆํ•˜๋‹ค.

action plan: ์ˆ˜์—…์—์„œ Vending Machine์„ ๋ณธ ๋‹ค์Œ์—, SASS ํŒŒ์ผ ์˜ˆ์‹œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ์‹  ๋ฉ˜ํ† ๋‹˜์˜ ์ฝ”๋“œ๋ฅผ ํ›‘์–ด๋ณด๊ณ  ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋„ ๋ถ€ํƒ๋“œ๋ ค์•ผ๊ฒ ๋‹ค.


2. ๋ฒ„ํŠผ์„ ์ด์šฉํ•ด์„œ select box๋ฅผ ์˜ˆ์˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์ด๋ฏธ์ง€(bg-size, position ์ด์šฉ)์™€ ๋น„๋””์˜ค(width, height ์„ค์ •) iframe(padding-top, position์œผ๋กœ trick ์ฃผ๊ธฐ)๋ฅผ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฒ•์„ ๋ฐฐ์› ๋‹ค.

์‚ฌ์‹ค... ์‚ฌ์ดํŠธ์— ๋น„๋””์˜ค๋ฅผ ๋„ฃ์„ ์ผ์ด ์žˆ์„๊นŒ? ์‹ถ๊ธฐ๋Š” ํ•˜์ง€๋งŒ, padding: n%; ์˜ ๊ธฐ์ค€์ด ๋ถ€๋ชจ width๋ผ์„œ ํŠธ๋ฆญ์ฒ˜๋Ÿผ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์‹ ๊ธฐํ–ˆ๋‹ค.


3. JS Challenge ์—์„œ js๋ฅผ ์ด์šฉํ•ด์„œ html element๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋„ฃ์–ด๋ดค๋‹ค.

๋™์  ์ƒ์„ฑ์ด ์ด์ œ ์ดํ•ด๊ฐ€ ๊ฐ„๋‹ค. ๊ทผ๋ฐ ๋™์  ์ƒ์„ฑ์„ ํ•˜๋Š” ์ด์œ ๋Š” ๋ญ˜๊นŒ? ํŠธ์œ„ํ„ฐ์ฒ˜๋Ÿผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ณ„์† ๊ฐ€์ ธ์™€์•ผํ•ด์„œ ๊ทธ๋Ÿฐ ๋Š๋‚Œ์ผ ๊ฒƒ ๊ฐ™์ง€๋งŒ...

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

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