ํ•จ์ˆ˜ calc()

Frontend SELF KO
๋ ˆ๋ฒจ 32 , ๋ ˆ์Šจ 0
์‚ฌ์šฉ ๊ฐ€๋Šฅ

6.1 ํ•จ์ˆ˜ calc()์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ

calc() ํ•จ์ˆ˜๋Š” CSS์—์„œ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์„œ, ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ณ  ์ ์‘๋ ฅ ์žˆ๋Š” ์Šคํƒ€์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ํŠนํžˆ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๋ฅผ ์กฐํ•ฉํ•˜๊ฑฐ๋‚˜ ๋™์ ์œผ๋กœ ๊ฐ’(์‚ฌ์ด์ฆˆ, ์—ฌ๋ฐฑ, ๊ฒฝ๊ณ„ ๋“ฑ)์„ ๊ณ„์‚ฐํ•  ๋•Œ ์œ ์šฉํ•ด.

calc() ํ•จ์ˆ˜๋Š” ๋”ํ•˜๊ธฐ, ๋นผ๊ธฐ, ๊ณฑํ•˜๊ธฐ, ๋‚˜๋ˆ„๊ธฐ ๋„ค ๊ฐ€์ง€ ๊ธฐ๋ณธ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด. ์ด ์—ฐ์‚ฐ๋“ค์€ ํ”ฝ์…€, ํผ์„ผํŠธ, em, rem ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๋ฅผ ์กฐํ•ฉํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ ์‘๋ ฅ ์žˆ๊ณ  ๋™์ ์ธ ์Šคํƒ€์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์„ ์ค˜.

๊ตฌ๋ฌธ:

    
      ์…€๋ ‰ํ„ฐ {
        ์†์„ฑ: calc(ํ‘œํ˜„์‹);
      }
    
  

์—ฐ์‚ฐ ์˜ˆ์ œ

  • ๋”ํ•˜๊ธฐ: calc(100% + 20px)
  • ๋นผ๊ธฐ: calc(50% - 10px)
  • ๊ณฑํ•˜๊ธฐ: calc(10px * 2)
  • ๋‚˜๋ˆ„๊ธฐ: calc(100px / 2)

์˜ˆ์ œ:

HTML
    
      <div>
        Lorem ipsum odor amet, consectetuer adipiscing elit. Montes malesuada pharetra mi suscipit suspendisse ornare.
        Fringilla feugiat cursus finibus commodo, faucibus himenaeos.
      </div>
    
  
CSS
    
      div {
        width: calc(100% - 50px);
        margin: calc(1em + 10px);
        background: lightblue;
      }
    
  

์ด ์˜ˆ์‹œ์—์„œ๋Š”:

  • ์š”์†Œ์˜ ๋„ˆ๋น„๋Š” 100%์—์„œ 50px์„ ๋บ€ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ๋ผ
  • ๋งˆ์ง„์€ 1em๊ณผ 10px์˜ ํ•ฉ๊ณ„๋กœ ๊ณ„์‚ฐ๋ผ

6.2 calc() ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ ์˜ˆ์ œ

1. ๋”ํ•˜๊ธฐ์™€ ๋นผ๊ธฐ

calc() ํ•จ์ˆ˜๋Š” ๋ณดํ†ต ์š”์†Œ์˜ ํฌ๊ธฐ์™€ ์—ฌ๋ฐฑ์„ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๋”ํ•˜๊ธฐ์™€ ๋นผ๊ธฐ์— ์ž์ฃผ ์‚ฌ์šฉ๋ผ.

์˜ˆ์ œ 1: ํผ์„ผํŠธ์™€ ํ”ฝ์…€ ๋”ํ•˜๊ธฐ

์ด ์˜ˆ์ œ์—์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ๋„ˆ๋น„๋Š” ๋ถ€๋ชจ ์š”์†Œ์˜ 100% ๋„ˆ๋น„์—์„œ 40ํ”ฝ์…€์„ ๋บ€ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ๋ผ. ์ด๋Š” ์—ฌ๋ฐฑ๊ณผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜:

HTML
    
      <div class="container">
        Lorem ipsum odor amet, consectetuer adipiscing elit. Montes malesuada pharetra mi suscipit suspendisse ornare.
        Fringilla feugiat cursus finibus commodo, faucibus himenaeos.
      </div>
    
  
CSS
    
      .container {
        width: calc(100% - 40px);
        margin: 20px;
        background: lightgreen;
      }
    
  

์˜ˆ์ œ 2: ๊ณ ์ • ๊ฐ’์„ ๋บ€ ๊ฐ’

์ด ์˜ˆ์ œ์—์„œ ์‚ฌ์ด๋“œ๋ฐ”์˜ ๋„ˆ๋น„๋Š” ๋ถ€๋ชจ ์š”์†Œ์˜ 100% ๋„ˆ๋น„์—์„œ 250ํ”ฝ์…€์„ ๋บ€ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ๋ผ, ์ด๋Š” ์ฃผ์š” ์ฝ˜ํ…์ธ ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋‚จ๊ฒจ์ค˜:

HTML
    
      <div class="sidebar">
        <ul>
          <li><a href="#"></a>Article 1</li>
          <li><a href="#"></a>Article 2</li>
          <li><a href="#"></a>Article 3</li>
        </ul>
      </div>
    
  
CSS
    
      .sidebar {
        width: calc(100% - 250px);
        background: tomato;
      }
    
  

2. ๊ณฑํ•˜๊ธฐ์™€ ๋‚˜๋ˆ„๊ธฐ

calc() ํ•จ์ˆ˜๋Š” ๊ณฑํ•˜๊ธฐ์™€ ๋‚˜๋ˆ„๊ธฐ๋„ ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๋น„์œจ์— ๋งž๋Š” ํฌ๊ธฐ์™€ ์—ฌ๋ฐฑ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์œ ์šฉํ•ด.

์˜ˆ์ œ 3: ๊ณฑํ•˜๊ธฐ

์ด ์˜ˆ์ œ์—์„œ ์š”์†Œ์˜ ๋†’์ด๋Š” 20ํ”ฝ์…€์— 3์„ ๊ณฑํ•œ ๊ฐ’, ์ฆ‰ 60ํ”ฝ์…€๋กœ ๊ณ„์‚ฐ๋ผ:

HTML
    
      <div class="element">Element</div>
    
  
CSS
    
      .element {
        height: calc(20px * 3);
        background: lightpink;
      }
    
  

์˜ˆ์ œ 4: ๋‚˜๋ˆ„๊ธฐ

์ด ์˜ˆ์ œ์—์„œ ๋ฐ•์Šค์˜ ๋„ˆ๋น„๋Š” ๋ถ€๋ชจ ์š”์†Œ์˜ ๋„ˆ๋น„์˜ 3๋ถ„์˜ 1๋กœ ๊ณ„์‚ฐ๋ผ, ์„ธ ๊ฐœ์˜ ๋™์ผํ•œ ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜:

HTML
    
      <div class="box">
        Box
      </div>
    
  
CSS
    
      .box {
        width: calc(100% / 3);
        background: yellow;
      }
    
  

6.3 ๋‹ค์–‘ํ•œ ๋‹จ์œ„์˜ ๊ฒฐํ•ฉ

calc() ํ•จ์ˆ˜์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„์˜ ๊ฒฐํ•ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฑฐ์•ผ. ์ด๋ฅผ ํ†ตํ•ด ์ ์‘๋ ฅ ์žˆ๊ณ  ์œ ์—ฐํ•œ ์Šคํƒ€์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.

์˜ˆ์ œ 5: ํผ์„ผํŠธ์™€ ํ”ฝ์…€ ๊ฒฐํ•ฉ

์ด ์˜ˆ์ œ์—์„œ ํ—ค๋”์˜ ๋†’์ด๋Š” ๋ทฐํฌํŠธ ๋†’์ด(viewport height)์˜ 100%์—์„œ 50ํ”ฝ์…€์„ ๋บ€ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ๋ผ์„œ, ๊ณ ์ •๋œ ์—ฌ๋ฐฑ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.

HTML
    
      <header class="header">
        <nav>
          <ul>
            <li>๋ฉ”์ธ</li>
            <li>์†Œ๊ฐœ</li>
            <li>์—ฐ๋ฝ์ฒ˜</li>
          </ul>
        </nav>
      </header>
    
  
CSS
    
      .header {
        height: calc(100vh - 100px);

        background: lightgreen;
      }

      nav ul {
        list-style: none;
        display: flex;
        justify-content: space-around;
        padding: 10px;
      }
    
  

๋™์  ํฌ๊ธฐ ๊ณ„์‚ฐ

calc() ํ•จ์ˆ˜๋Š” ์š”์†Œ์˜ ํฌ๊ธฐ๋ฅผ ๋™์ ์œผ๋กœ ๊ณ„์‚ฐํ•  ๋•Œ ์œ ์šฉํ•ด์„œ, ๋””์ž์ธ์„ ๋ณด๋‹ค ์ ์‘์ ์ด๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค˜.

์˜ˆ์ œ 6: ๋™์  ๋„ˆ๋น„ ๊ณ„์‚ฐ

์ด ์˜ˆ์ œ์—์„œ ์ฝ˜ํ…์ธ ์˜ ๋„ˆ๋น„๋Š” ๋ถ€๋ชจ ์š”์†Œ์˜ ๋„ˆ๋น„์˜ 100%์—์„œ ๊ฐ๊ฐ 20ํ”ฝ์…€์”ฉ ๋‘ ๊ฐœ์˜ ์—ฌ๋ฐฑ์„ ๋บ€ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ๋ผ:

HTML
    
      <div class="content">
        Lorem ipsum odor amet, consectetuer adipiscing elit. Montes malesuada pharetra mi suscipit suspendisse ornare.
        Fringilla feugiat cursus finibus commodo, faucibus himenaeos.
      </div>
    
  
CSS
    
      .content {
        width: calc(100% - 2 * 20px);
        background: lightgreen;
      }
    
  

6.4 ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์—์„œ calc()์˜ ์‚ฌ์šฉ

calc() ํ•จ์ˆ˜๋Š” ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๋‚ด์—์„œ ์ ์‘ํ˜• ์Šคํƒ€์ผ์„ ๋งŒ๋“œ๋Š”๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด.

์˜ˆ์ œ 7: ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์—์„œ ์ ์‘ํ˜• ์—ฌ๋ฐฑ

์ด ์˜ˆ์ œ์—์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ์—ฌ๋ฐฑ์€ ๋ทฐํฌํŠธ ๋„ˆ๋น„๊ฐ€ ์ตœ์†Œ 600ํ”ฝ์…€์— ๋„๋‹ฌํ•˜๋ฉด ์ฆ๊ฐ€ํ•ด:

HTML
    
      <div class="container">
        Lorem ipsum odor amet, consectetuer adipiscing elit. Montes malesuada pharetra mi suscipit suspendisse ornare.
        Fringilla feugiat cursus finibus commodo, faucibus himenaeos.
      </div>
    
  
CSS
    
      .container {
        padding: 10px;
        background: tomato;
      }

      @media (min-width: 600px) {
        .container {
          padding: calc(10px + 2vw);
        }
      }
    
  

์˜ˆ์ œ 8: ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์—์„œ ์ ์‘ํ˜• ํฌ๊ธฐ

์ด ์˜ˆ์ œ์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์—ฌ๋ฐฑ์ด 600ํ”ฝ์…€ ๋„ˆ๋น„์˜ ํ™”๋ฉด์—์„œ ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ค์–ด, ๋””์ž์ธ์˜ ์ ์‘์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ:

HTML
    
      <div class="container">
        Lorem ipsum odor amet, consectetuer adipiscing elit. Montes malesuada pharetra mi suscipit suspendisse ornare.
        Fringilla feugiat cursus finibus commodo, faucibus himenaeos.
      </div>
    
  
CSS
    
      :root {
        --main-padding: 20px;
      }

      .container {
        padding: var(--main-padding);
        background: yellow;
      }

      @media (max-width: 600px) {
        .container {
          padding: calc(var(--main-padding) / 2);
        }
      }
    
  

6.5 ์žฅ์ ๊ณผ ๋‹จ์ 

calc() ํ•จ์ˆ˜์˜ ์žฅ์ :

1. ์œ ์—ฐ์„ฑ. calc() ํ•จ์ˆ˜๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๋ฅผ ์กฐํ•ฉํ•˜๊ณ  ์ˆ˜ํ•™ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ณ  ์ ์‘๋ ฅ ์žˆ๋Š” ๋””์ž์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜.

2. ๋™์  ์Šคํƒ€์ผ ๊ด€๋ฆฌ. calc()๋ฅผ ํ†ตํ•ด ์š”์†Œ์˜ ํฌ๊ธฐ์™€ ์—ฌ๋ฐฑ์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๋””์ž์ธ์„ ๋” ์‘๋‹ต์ ์ด๊ณ  ์ ์‘๋ ฅ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ค˜.

3. ๋ณต์žกํ•œ ๊ณ„์‚ฐ์˜ ๋‹จ์ˆœํ™”. calc() ํ•จ์ˆ˜๋Š” CSS์—์„œ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•ด์ค˜์„œ, ๊ฐ„๋‹จํ•œ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์— JavaScript๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋ฅผ ์ค„์—ฌ์ค˜.

calc() ํ•จ์ˆ˜์˜ ์ œํ•œ ๋ฐ ํŠน์ง•:

1. ์—ฐ์‚ฐ์ž ์ฃผ๋ณ€ ๊ณต๋ฐฑ. calc() ํ‘œํ˜„์‹์—์„œ๋Š” ์—ฐ์‚ฐ์ž ์ฃผ๋ณ€์— ๋ฐ˜๋“œ์‹œ ๊ณต๋ฐฑ์ด ์žˆ์–ด์•ผ ํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, calc(100% - 50px)๋Š” ๋งž๊ณ , calc(100%-50px)๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ.

2. ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ. calc() ํ•จ์ˆ˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜์ง€๋งŒ, ์˜ค๋ž˜๋œ ๋ฒ„์ „์—์„œ๋Š” ํ˜ธํ™˜์„ฑ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์–ด.

3. ์„ฑ๋Šฅ. calc() ํ•จ์ˆ˜ ์‚ฌ์šฉ์€ ํŠนํžˆ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด๋‚˜ ์ž์ฃผ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ์•ฝ๊ฐ„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด.

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION