CSS, ::before, ::after ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ธฐ

๊ฐ€์ƒ ์š”์†Œ(pseudo element) ::before, ::after์˜ ์—ญํ• 

pseudo(์Šˆ๋„)๋Š” [๊ฐ€์งœ์˜, ํ—ˆ์œ„์˜]๋ผ๋Š” ๋œป์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๊ฐ€์ƒ ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š” ์˜๋ฏธ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

๊ฐ€์žฅ ํฐ ๋ชฉ์ ์€ HTML์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ CSS๊ฐ€ ์ž„์˜๋กœ ์ƒ์„ฑํ•ด์„œ ์Šคํƒ€์ผ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ์–‘์€ ::before ๋˜๋Š” ::after์ด๋ฉฐ, ์ฝœ๋ก ์ด ๋‘ ๊ฐœ(!)๊ฐ€ ๋ถ™๋Š” ๊ฒƒ์ด ๊ฐ€์ƒ ์š”์†Œ, ์ฝœ๋ก  ํ•˜๋‚˜๊ฐ€ ๊ฐ€์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค(์ตœ์‹  ๋ช…์„ธ).

before์™€ after์˜ ์˜๋ฏธ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์š”์†Œ์˜ ์•ž๊ณผ ๋’ค์— ๊ฐ€์ƒ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ HTML์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ CSS๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<h3> - ์˜ค๋Š˜ ํ•  ์ผ</h3> 

์œ„ ํƒœ๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ์— ‘-‘๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋งˆ์šฐ์Šค๋กœ ๋“œ๋ž˜๊ทธํ•˜๋ฉด ‘-‘๋„ ํ•จ๊ป˜ ํ…์ŠคํŠธ๋กœ ์„ ํƒ์ด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์ƒ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

‘-‘๋Š” ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๊ฐ€์ƒ ์š”์†Œ์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ…์ŠคํŠธ๋กœ ์„ ํƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

// css
.list::before{
  content:'-'
}


// html
<h3 class="list">์˜ค๋Š˜ ํ•  ์ผ</h3>

‘-‘๊ฐ€ h3 ํƒœ๊ทธ์—๋Š” ํ…์ŠคํŠธ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ ::before๋ฅผ ํ†ตํ•ด content๋กœ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ์œผ๋ฏ€๋กœ ์™ธํ˜•์€ ์œ„์™€ ๊ฐ™์ง€๋งŒ ์†์€ ๋‹ค๋ฅธ ๋ฐฉ์‹์ด ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ€์ƒ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ธ๋ถ€์ ์ธ ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

// css
.list::before{
  content:'';
  display:inline-block;
  width:20px;
  height:20px;
  background:gold;
}

.list::after{
  content:'๐Ÿ˜‹'
}


// html
<h3 class="list">
 ์˜ค๋Š˜ ํ•  ์ผ
</h3>

<h3 class="list">
๋‚ด์ผ ํ•  ์ผ
</h3>

before๋กœ ์š”์†Œ์˜ ์•ž, after๋กœ ์š”์†Œ์˜ ๋’ค๋ฅผ ์„ค์ •ํ–ˆ์œผ๋ฉฐ content์—๋Š” ๋ฌธ์ž ์ด์™ธ์—๋„ ์ด๋ชจ์ง€๋‚˜ ์ด๋ฏธ์ง€(url(์ฃผ์†Œ)) ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์™ธ์—๋„ ::first-line, ::selection, ::placeholder ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋กœ form๊ณผ ์ด๋ฏธ์ง€์—๋Š” ๊ฐ€์ƒ ์š”์†Œ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

CSS, ์•Œ๋ฉด ์‰ฌ์šด display ์†์„ฑ(inline, flex, …others)

inline, block, inline-block, flex, inline-flex, grid, inline-grid, none

display๋Š” ์š”์†Œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜์œผ๋กœ, display๋งŒ ์ž˜ ์•Œ์•„๋„ ๋ ˆ์ด์•„์›ƒ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ display์˜ ์†์„ฑ์ธ inline, flex, inline-flex, block, inline-block, grid, inline-grid, none์˜ ๊ตฌํ˜„์„ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ํ‘œ์‹œ ๋ฐฉ์‹์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•Œ์•„๋ณด๊ธฐ ํŽธํ•˜๋„๋ก ๋ฐฐ๊ฒฝ์€ ๋ธ”๋ž™, ์š”์†Œ๋Š” ๊ฐ๊ฐ ๋ ˆ๋“œ, ์˜ค๋ Œ์ง€, ๊ทธ๋ฆฐ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

inline : inline์œผ๋กœ ํ‘œ์‹œ(width๋Š” ์š”์†Œ ํฌ๊ธฐ)
block : block์œผ๋กœ ํ‘œ์‹œ
inline-block : inline + block์œผ๋กœ ํ‘œ์‹œ
flex : ์ž์‹ ์š”์†Œ๋ฅผ ๋ชจ๋‘ inline-block์œผ๋กœ ์„ค์ •
inline-flex : inline + flex(์ „์ฒด width๋Š” ์ž์‹ width์˜ ํ•ฉ)
grid : flex์ฒ˜๋Ÿผ ํ•œ ๋ฐฉํ–ฅ์ด ์•„๋‹Œ ๊ฐ€๋กœ, ์„ธ๋กœ๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด์•„์›ƒ
inline-grid : inline + grid(์ „์ฒด width๋Š” ์ž์‹ width์˜ ํ•ฉ)
none : ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ(๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š์Œ)


์ค„๋ฐ”๊ฟˆ ์—†์ด ํƒœ๊ทธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์š”์†Œ๋ฅผ inline ์š”์†Œ, ํƒœ๊ทธ๋งˆ๋‹ค ์ค„๋ฐ”๊ฟˆ์ด ๋˜๋Š” ์š”์†Œ๋ฅผ block ์š”์†Œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ inline ์š”์†Œ๋Š” <span>, <a> ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, block ์š”์†Œ๋Š” <div>,<p>,<h1>,<h2> ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์•„๋ฌด ์†์„ฑ๋„ ์„ค์ •ํ•˜์ง€ ์•Š์€ div๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

.setContainer{
  background-color:black;
}

.setOne{
  background-color: red;
}

.setTwo{
  background-color: orange;
  width:95%;
}

.setThree{
  background-color: green;
  width:90%;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

div์˜ default ์„ค์ •์€ width 100%์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์„ค์ •์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด setTwo์™€ setThree์— width๋ฅผ ์„ค์ •ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

๋จผ์ € display์˜ inline ์†์„ฑ์„ ํ™•์ธํ•ด๋ณด์ฃ .


1. inline

์œ„ ์†์„ฑ์€ ๋ง ๊ทธ๋Œ€๋กœ ์š”์†Œ๋ฅผ ์ผ๋ ฌ๋กœ ๋Š˜์–ด์„  ๋ฐฉ์‹์œผ๋กœ ํ‘œ์‹œํ•˜๋ฉฐ ์ค„๋ฐ”๊ฟˆ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ ์š”์†Œ๋งˆ๋‹ค ์„ค์ •ํ•˜๋ฉฐ width๋Š” ์ž๋™์œผ๋กœ ํฌ๊ธฐ์— ๋งž๊ฒŒ ๋ณ€ํ˜•๋ฉ๋‹ˆ๋‹ค.

.setContainer{
  background-color:black;
  display:inline;
}
.setOne{
  background-color: red;
  display:inline;
}
.setTwo{
  background-color: orange;
  display:inline;
}
.setThree{
  background-color: green;
  display:inline;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

inline์€ ์œ„์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด์ฒ˜๋Ÿผ ์ผ๋ ฌ๋กœ ๋Š˜์–ด์„  ์ƒํƒœ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.


2. block

block์€ inline ์š”์†Œ๋ฅผ block์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

block ์š”์†Œ div ๋Œ€์‹  inline ์š”์†Œ span์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€๋ฐ์š”.

์œ„์—์„œ div์— display:inline์„ ์„ค์ •ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ชจ์–‘์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ span์— display:block์„ ์„ค์ •ํ•˜๋ฉด ๋ฐ˜๋Œ€๋กœ div๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.setContainer{
  background-color:black;
}
.setOne{
  background-color: red;
  display:block;
}
.setTwo{
  background-color: orange;
  display:block;
}
.setThree{
  background-color: green;
  display:block;
}

<div class='setContainer'>
  <span class='setOne'>red</span>
  <span class='setTwo'>org</span>
  <span class='setThree'>grn</span>
</div>

block ์†์„ฑ์€ inline ์š”์†Œ๋ฅผ block ์š”์†Œ์ฒ˜๋Ÿผ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


3. inline-block

๊ทธ๋ ‡๋‹ค๋ฉด inline-block์€ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ์š”?

display:block์ด ํ•„์š”ํ•˜์ง€๋งŒ ํ‘œ์‹œ๋Š” inline์œผ๋กœ ํ‘œ์‹œ๋ฅผ ํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๊ทธ๊ฒŒ ๊ทธ๋ƒฅ span์˜ default ์•„๋‹Œ๊ฐ€๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ span์—๋Š” width, height ๋“ฑ ์†์„ฑ์ด ์ ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— block์œผ๋กœ ์„ค์ •์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ฝ”๋“œ์—์„œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์— width:300px, height:200px๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋ชจ์Šต์ด ๋ฉ๋‹ˆ๋‹ค.

์œ„ ์š”์†Œ๋ฅผ inline์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด inline-block๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.setContainer{
  background-color:black;
}
.setOne{
  background-color: red;
  display:inline-block;
  width:300px;
  height:200px;
}
.setTwo{
  background-color: orange;
  display:inline-block;
}
.setThree{
  background-color: green;
  display:inline-block;
}

<div class='setContainer'>
  <span class='setOne'>red</span>
  <span class='setTwo'>org</span>
  <span class='setThree'>grn</span>
</div>

div๋ฅผ ์‚ฌ์šฉํ•ด ์œ„์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ด๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

.setContainer{
  background-color:black;
}
.setOne{
  background-color: red;
  display:inline-block;
  width:300px;
  height:200px;
}
.setTwo{
  background-color: orange;
  display:inline;
}
.setThree{
  background-color: green;
display:inline;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด ์‚ฌ๊ฐํ˜• ์‚ฌ์ด ์‚ฌ์ด์— ๋นˆ๊ณต๊ฐ„์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด <div> ํƒœ๊ทธ ์‚ฌ์ด์˜ ๋„์›Œ์“ฐ๊ธฐ๋‚˜ ์ค„๋ฐ”๊ฟˆ์„ ํ™•์ธํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๊ธฐ์—๋Š” ์•ˆ์ข‹์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํƒœ๊ทธ ์‚ฌ์ด๋ฅผ ๋ชจ๋‘ ๋ถ™์—ฌ์“ฐ๋ฉด ๊ณต๋ฐฑ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<div class='setContainer'><div class='setOne'>red</div><div class='setTwo'>org</div><div class='setThree'>grn</div></div>

4. flex

flex๋Š” ์ƒˆ๋กœ์šด ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋กœ ๋ถ€๋ชจ ์š”์†Œ์—์„œ๋งŒ ์„ค์ •์„ ํ•ฉ๋‹ˆ๋‹ค.

display:flex๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ์ž์‹ ์š”์†Œ์— display:inline-block์„ ์„ค์ •ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์ค๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ชจ๋“  ์ž์‹ ์š”์†Œ๋Š” display๋ฅผ ์„ค์ •ํ•  ํ•„์š” ์—†์ด width, height ๋“ฑ์˜ ์†์„ฑ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

.setContainer{
  background-color:black;
  display:flex;  
}
.setOne{
  background-color: red;
}
.setTwo{
  background-color: orange;
  width:200px;
}
.setThree{
  background-color: green;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

๊ฐœ๋ณ„ ์š”์†Œ์— ๋ชจ๋‘ display๋ฅผ ์„ค์ •ํ•  ํ•„์š” ์—†์ด ๋ถ€๋ชจ ์š”์†Œ์—์„œ๋งŒ ํŽธํ•˜๊ฒŒ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ž์‹ ์š”์†Œ๋ฅผ ๊ฐ€์šด๋ฐ ์ •๋ ฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋ถ€๋ชจ ์š”์†Œ์—์„œ justify-content:center;๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


5. inline-flex

flex๋Š” ์ด๋ฏธ inline-block์˜ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ ๊ทธ๋Ÿผ inline-flex์˜ ๊ธฐ๋Šฅ ๋ฌด์—‡์ผ๊นŒ์š”?

๋ฐ”๋กœ inline ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ ์ž๋™ ํฌ๊ธฐ ์กฐ์ ˆ์ž…๋‹ˆ๋‹ค.

inline-flex๋Š” ์ž์‹ ์š”์†Œ๋ฅผ ํ•ฉ์นœ ํฌ๊ธฐ ๋งŒํผ๋งŒ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๋ฏ€๋กœ width๋Š” 100%๊ฐ€ ์•„๋‹Œ ์ž์‹ ํฌ๊ธฐ์˜ ํ•ฉ์ž…๋‹ˆ๋‹ค.

flex์˜ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•ด๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ธ”๋ž™์ด ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


6. grid, inline-grid

์ด grid๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

๊ทธ๋ฆฌ๋“œ๋Š” flex์ฒ˜๋Ÿผ ๊ฐ€๋กœ๋‚˜ ์„ธ๋กœ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๋ ˆ์ด์•„์›ƒ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€๋กœ, ์„ธ๋กœ ๋‘ ๋ฐฉํ–ฅ ๋ชจ๋‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.

grid ์—ญ์‹œ ๋ถ€๋ชจ ์š”์†Œ์—์„œ ์„ค์ •์„ ํ•˜๋ฉฐ ์ž์‹ ์š”์†Œ๋ฅผ block์œผ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์†์„ฑ์„ ํ†ตํ•ด ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํšจ๊ณผ์ ์ด์ง€๋งŒ ๋‚ด์šฉ์ด ๋งŽ์•„ ๋‹ค๋ฅธ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด ์ข€ ๋” ์•Œ์•„๋ด์•ผ ํ•  ํ•„์š”์„ฑ์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

.setContainer{
  background-color:black;
  display:grid;  
  grid-template-columns: 100px 100px 100px;
}
.setOne{
  background-color: red;
}
.setTwo{
  background-color: orange;
}
.setThree{
  background-color: green;
}

<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

inline-grid ์—ญ์‹œ inline-flex ์†์„ฑ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ width๋ฅผ ์ž์‹ ์š”์†Œ์— ๋งž๊ฒŒ ์กฐ์ ˆํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.


7. none

none์€ ํ•ด๋‹น ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ณต๊ฐ„๋„ ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

.setContainer{
  background-color:black;
}

.setOne{
  background-color: red;
  display:none;
}

.setTwo{
  background-color: orange;
}

.setThree{
  background-color: green;
}


<div class='setContainer'>
  <div class='setOne'>
    red
  </div>
  <div class='setTwo'>
    org
  </div>
  <div class='setThree'>
    grn
  </div>
</div>

์ด๋ ‡๊ฒŒ ์—†๋Š” ๋†ˆ ์ทจ๊ธ‰์„ ํ•ฉ๋‹ˆ๋‹ค.

์ด์™€ ๋ฐ˜๋Œ€๋˜๋Š” ์†์„ฑ์ด visibility๋กœ ์ด๋Š” ๊ณต๊ฐ„์€ ์ฐจ์ง€ํ•˜๋˜ ํ‘œ์‹œ๋งŒ ํ•˜์ง€ ์•Š๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.

visibility, display ์‚ฌ์šฉ ๊ด€๋ จ ํฌ์ŠคํŠธ

display:none์„ visibility:hidden์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

์žˆ๋Š”๋ฐ ์—†๋Š” ์ฒ™์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  visibility๋„ ๊ณต๊ฐ„๋งŒ ์ฐจ์ง€ํ•  ๋ฟ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค.



CSS์˜ ๊ธฐ๋ณธ์ด์ง€๋งŒ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋‹ค ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๊นŒ์ง€๋Š” ์–ด๋А ์ •๋„์˜ ์‹œ๊ฐ„๊ณผ ๊ฒฝํ—˜์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌด์ž‘์ • ์™ธ์šฐ๊ธฐ๋ณด๋‹ค๋Š” ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋‹ต๋‹ตํ•จ์ด ์Œ“์˜€์„ ๋–„ ํ•œ๋ฒˆ์”ฉ ์†Œํ™”์ œ ๋А๋‚Œ์œผ๋กœ ์„ค๋ช…์„ ์‚ผ์ผœ์ฃผ๋ฉด ์กฐ๊ธˆ ๋” ์™€๋‹ฟ๋Š” ์„ค๋ช…์ด ๋˜์ง€ ์•Š๋‚˜ ์‹ถ์Šต๋‹ˆ๋‹ค..๐Ÿง”

CSS transition, ์ž‘๋™ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ(์™œ ์ž‘๋™์„ ์•ˆํ• ๊นŒ?)

transition์˜ ์ž‘๋™์›๋ฆฌ์™€ transition ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

transition์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ฃผ๋Š” CSS์ž…๋‹ˆ๋‹ค.

transition ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ํˆฌ๋ฐ•ํ•œ ๋А๋‚Œ์„ ์ง€์šฐ๊ณ  ๋ถ€๋“œ๋Ÿฌ์šด ๋А๋‚Œ์„ ์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”.

๋ฉ”๋‰ด๊ฐ€ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์—ด๋ฆฌ๊ณ  ๋‹ซํžˆ๊ฑฐ๋‚˜ ํ™”๋ฉด์— fade-in ํšจ๊ณผ ๋“ฑ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSS์˜ ๋Œ€ํ‘œ์ ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌ๋Š” transition์™€ animation์ด ์žˆ๋Š”๋ฐ์š”.

transition์€ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์ˆœ๊ฐ„ ์ž‘๋™ํ•˜๊ณ , animation์€ transition๋ณด๋‹ค ๋” ์ž์œ ๋กญ๊ณ  ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ transition์„ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ถ€ํ„ฐ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. transition ์‚ฌ์šฉํ•˜๊ธฐ

.setBox{
  background-color:pink;
  width:200px;
  height:200px;
  transition:all 1000ms linear 500ms;
}

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ•œ ์ค„ ํ‘œ๊ธฐ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

transition: property duration timing delay;

property : color, background-color, border, position, all ๋“ฑ์˜ ์†์„ฑ

duration : ์™„๋ฃŒ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„. ms(๋ฐ€๋ฆฌ์ดˆ) ๋˜๋Š” s(์ดˆ)๋กœ ์„ค์ •

timing : linear(๋™์ผ), ease(๋А๋ฆผ->๋น ๋ฆ„->๋А๋ฆผ), ease-in(๋А๋ฆผ->๋น ๋ฆ„), ease-out(๋น ๋ฆ„->๋А๋ฆผ)

delay : ๋”œ๋ ˆ์ด ์‹œ๊ฐ„(ms ๋˜๋Š” s๋กœ ์„ค์ •)

๋ฌผ๋ก  property๋‚˜ delay ๋Š” ์ƒ๋žต๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ’€์–ด ์“ฐ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

transition-property : property
transition-duration : duration
transition-timing-function : timing
transition-delay: delay

transition์„ ์‚ฌ์šฉํ•ด ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด(hover) ๋ฐ•์Šค๊ฐ€ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ปค์กŒ๋‹ค๊ฐ€ ์ค„์–ด๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

.setBox{
  background-color:pink;
  width:100px;
  height:50px;
  transition:all 1000ms linear 500ms;
}

.setBox:hover{
  background-color:gold;
  width:200px;
  height:100px;
  transition:all 300ms ease;
}

<div class='setBox'></div>

๋ฐ•์Šค๊ฐ€ ์ปค์งˆ ๋•Œ๋Š” .setBox:hover{}์˜ transition ์„ค์ •์— ๋”ฐ๋ผ 300ms, ์ค„์–ด๋“ค ๋•Œ๋Š” .setBox{}์˜ transition ์„ค์ •์— ๋”ฐ๋ผ 1000ms๋™์•ˆ ์›€์ง์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ๋Š” ์š”์†Œ ์ˆจ๊ธฐ๊ธฐ&ํ‘œ์‹œํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

.setBox{
  background-color:gray;
  color:white;
  width:100px;
  height:50px;
  text-align:center;
  line-height:50px;
}
.showMenu{
  visibility:hidden;
  height:150px;
  width:100px;
  background-color:lightgray;
  opacity:0;
  color:black;
  border-radius:5px;
  transition:linear 500ms;
}
.setBox:hover .showMenu{
  visibility:visible;
  transition:linear 500ms;
  opacity:1;
}

<div class='setBox'>MENU
    <div class='showMenu'>
        <div class='menu'>
          ๋ฉ”๋‰ด A
        </div>
        <div class='menu'>
          ๋ฉ”๋‰ด B
        </div>
        <div class='menu'>
          ๋ฉ”๋‰ด C
        </div>
    </div>
</div>

์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ˆจ๊ฒจ๋‘” div๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์ˆจ๊ธฐ๋ฉด์„œ transition์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ visibility๊ฐ€ ์•„๋‹Œ display๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ์–ด๋–จ๊นŒ์š”?

display๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด transition์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๋ฐ”๋กœ display์™€ visiblility์˜ ์ž‘๋™ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

transition์€ ์œ„์—์„œ ์ด์•ผ๊ธฐํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์ˆœ๊ฐ„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด A ๋ชจ์–‘์—์„œ B ๋ชจ์–‘์œผ๋กœ ๋ณ€๊ฒฝ๋  ๋•Œ ์ž‘๋™์„ ํ•˜๋Š”๋ฐ์š”.

visibility๋Š” ๊ณต๊ฐ„์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์„ค์ •์— ๋”ฐ๋ผ ์š”์†Œ๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ A์—์„œ B๋กœ ๋ณ€๊ฒฝ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋А๋‚Œ์ž…๋‹ˆ๋‹ค.


2. transition ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ 

๊ทธ๋ ‡๋‹ค๋ฉด display๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋„ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

display:none์€ ์š”์†Œ์˜ ํ‘œ์‹œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ‘œ์†Œ๊ฐ€ ์žˆ๋Š” ๊ณต๊ฐ„๋„ ๋น„์›Œ๋ฒ„๋ฆฌ๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ‘A๋ชจ์–‘ -> B๋ชจ์–‘’์œผ๋กœ์˜ ๋ณ€ํ˜•์ด ์•„๋‹ˆ๋ผ ‘์—†์Œ -> B๋ชจ์–‘’ ์ด ๋˜๋ฏ€๋กœ transition์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ transition์€ ‘๋ชจ์–‘์˜ ๋ณ€ํ˜•‘๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ด๋Š” animation์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ์š”?

์ฝ”๋“œ๋งŒ ๋ด๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ์ด๋ฏ€๋กœ ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

.setBox:hover .showMenu{
  visibility:visible;
  animation:setMotion 3s;
}
@keyframes setMotion{
  0%{
      opacity:0;
    }
  100%{
      opacity:1;
    }
}


CSS3๋Š” ์•„์ฃผ ๋‹ค์žฌ๋‹ค๋Šฅํ•œ ์นœ๊ตฌ๋ผ ๊ธฐ์กด์—๋Š” jquery๋ฅผ ์‚ฌ์šฉํ•ด ๋ณต์žกํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋“ค์„ ์ด์ œ๋Š” ํ•œ ํ–‰์˜ ์ฝ”๋“œ๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด์„œ CSS3๋Š” ์กฐ๊ธˆ๋งŒ ๋ฐฐ์›Œ ๋‘ฌ๋„ ์•„์ฃผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์นœ๊ตฌ๊ฐ€ ๋˜์—ˆ๋„ค์š”. CSS์— ์กฐ๊ธˆ ๋” ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ํฌ์ŠคํŒ…์„ ๋Š˜๋ ค ๊ฐ€์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

CSS Combinators, make your CSS works easier (+,~, ,>)

Four combinators [Adjacent Sibling(+), General Sibling(~), Child(>), Descendant( )]

When set CSS Styles, below syntax is a basic.

h1 {
  color:#FFFF11;
  background: #000000;
}

.subTitle {
  font-size:13px;
  color:#FFFFFF;
  font-family:inherit;
}

#timeLine {
  background:gray;
}

But when you want to set Styles to a specific tag, using combinators is a smart selection.

combinators are mixed Styles. like ‘div + h1’ or ‘div > span’.

Any tags are mixable and there are four combinator types.

  • Adjacent Sibling (+)
  • General Sibling (~)
  • Child (>)
  • Descendant ( space )

1. Adjacent Sibling (+)

Adjacent Sibling uses + mark when specifies one element right after designated element.

h1 + p {
  color:orange;
}

Result is shown below.

<div>
  <h1>I'm h1 tag</h1>
  <p>I'm orange</p>
  <h2>I'm h2 tag</h2>
  <p>I'm a second p tag</p>
  <h1>I'm h1 tag again</h1>
  <p>I'm orange too</p>
<div>

There are two conditions for adjacent sibling.

Element should share the same parent and second element has to come only if right after first element.

In the above HTML result, there are three <p> tag lines but only two lines are matched to the condition.

Therefore only two matched elements are working as mentioned.

2. General Sibling (~)

General Sibling uses ~ mark when specifies elements come after designated element.

h1 ~ p {
  color:orange;
}

Result is shown below.

<div>
  <h1>I'm h1 tag</h1>
  <p>I'm orange</p>
  <h2>I'm h2 tag</h2>
  <p>I'm orange too</p>
<div>

There are two conditions for general sibling.

Element should share the same parent and second element has to come after first element.

In the above HTML result, every <p> tag after <h1>tag is working.

3. Child (>)

Use > marks when express child elements.

div > p {
  color:orange;
}

Result is shown below.

<div>
  <h1>I'm just h1 tag</h1>
  <p> I'm colored orange</p>
  <span>
    <p>I'm not the one</p>
  </span>
  <p> I also am colored orange</p>
</div>

Second element has to be a direct child of first element.

In the above HTML result, only two direct child lines are working.

Fifth line is not working because its position is parent-child-child.

4. Descendant

Use space when express descendant elements.

div p {
  color:orange;
}

Result is shown below.

<div>
  <h1>I'm just h1 tag</h1>
  <p> I'm colored orange</p>
  <span>
    <p>Count me in</p>
  </span>
  <p> I also am colored orange</p>
</div>

As long as second element is a descendant of the first element, every matched line is working.


Combinators are easy and simple for efficient CSS work.

I hope this post is helpful to your CSS design.