๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

react

React / ์Šคํƒ€์ผ๋ง (1) - SCSS

SASS(Syntactically Awesome Style Sheets) 

๊ธฐ์กด CSS์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ  ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ฌธ๋ฒ•

CSS ์ฝ”๋“œ ์ค‘์ฒฉ, ๋ณ€์ˆ˜ํ™”, ์†์„ฑ ์žฌ์‚ฌ์šฉ ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ ์ œ๊ณต

 

SCSS(Sassy CSS) 

SASS 3๋ฒ„์ „์—์„œ ๋“ฑ์žฅํ•œ SASS์˜ ์‹ ๋ฒ„์ „์œผ๋กœ ํ˜ธํ™˜์„ฑ, ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง (๊ธฐ์กด๊ณผ ๋‹ฌ๋ฆฌ ์ค‘๊ด„ํ˜ธ ์‚ฌ์šฉ)

 

 

์‚ฌ์šฉ ์ค€๋น„

์„ค์น˜

npm install sass

 

scss ํ™•์žฅ์ž๋กœ ๋ณ€๊ฒฝ

App.scss
index.scss

 

+ App.jsx์™€ main.jsx์—์„œ Importํ•˜๋Š” cssํŒŒ์ผ๋„ ๋ฐ”๊ฟ”์ฃผ๊ธฐ!

// app.jsx
import './App.scss'
// main.jsx
import './index.scss'

 

 

 


 

 

๋ฌธ๋ฒ•

1. ๋ณ€์ˆ˜

์‚ฌ์šฉ๋ฐฉ๋ฒ•

/* ์„ ์–ธ */
$๋ณ€์ˆ˜๋ช… : ๊ฐ’;

/* ์‚ฌ์šฉ */
์„ ํƒ์ž {
  ์†์„ฑ : $๋ณ€์ˆ˜๋ช…;
}

 

 

* ์˜ˆ์‹œ

 

App.jsx

function App() {
  return (
    <>
      <div className="test">ํ…Œ์ŠคํŠธ์šฉ div</div>
      <h2>SCSS ๋ณ€์ˆ˜ ์—ฐ์Šต</h2>
      <ul>
        <li>์•ˆ๋…•ํ•˜์„ธ์š”</li>
        <li>๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค</li>
        <li>scss</li>
      </ul>
    </>
  );
}

 

App.scss

/* ํฐํŠธ ํฌ๊ธฐ */
$font-large: 50px;
$font-mid: 40px;
$font-small: 30px;

/* ํฐํŠธ ๊ตต๊ธฐ */
$font-bold: 900;
$font-thin: 200;

/* ์ƒ‰์ƒ */
$color-green: #116511;
$color-blue: rgb(96, 130, 215);

.test {
  font-size: $font-large;
  font-weight: $font-bold;
}

h2 {
  color: $color-blue;
  font-weight: $font-bold;
  font-size: $font-mid;
}

ul {
  display: gird;
  gap: 10px;
}

li {
  color: $color-green;
  font-weight: $font-thin;
  font-size: $font-small;
}

 

 

 

 


 

 

2. ์ค‘์ฒฉ

๋‹ค์Œ๊ณผ ๊ฐ™์€ html ๊ตฌ์กฐ๊ฐ€ ์žˆ์„ ๋•Œ ๊ฐ๊ฐ์˜ ์š”์†Œ์— css ์†์„ฑ์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 

<element>
  <div>
    <span></span>
  </div>
</element>

 

๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ๊ฒ ์ง€๋งŒ

element {
  color: white;
}
element div {
  color: gray;
}
element div span {
  color: blue;
}

 

scss์—์„œ๋Š” ์ค‘์ฒฉ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

(ํ•˜์ง€๋งŒ 2023๋…„๋ถ€ํ„ฐ ๊ธฐ๋ณธ css์—์„œ๋„ ์ค‘์ฒฉ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค... mdn ์‚ฌ์ดํŠธ)

element {
  color: white;

  div {
    color: gray;
    
    span {
      color: blue;
    }
  }
}

 

 

* ์˜ˆ์‹œ

 

App.jsx

function App() {
  return (
    <>
      <div className="test">ํ…Œ์ŠคํŠธ์šฉ div</div>
      <h2>SCSS ์ค‘์ฒฉ ์—ฐ์Šต</h2>
      <ul>
        <li>์•ˆ๋…•ํ•˜์„ธ์š”
          <p>p ์š”์†Œ</p>
        </li>
        <li>๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค
          <section>section ์š”์†Œ</section>
        </li>
        <li>scss
          <article>article ์š”์†Œ
            <h3>h3 ์š”์†Œ</h3>
          </article>
        </li>
        <li>๊ณต๋ถ€
          <h2>h2 ์š”์†Œ</h2>
        </li>
      </ul>
    </>
  );
}

 

App.scss

1๋ฒˆ ๋ณ€์ˆ˜ ์˜ˆ์‹œ์—์„œ ์ผ๋˜ ์ฝ”๋“œ์— ์ผ๋ถ€๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค

li {
  color: $color-green;
  font-weight: $font-thin;
  font-size: $font-small;
  
  /* ๋ถ€๋ชจ ๊ทœ์น™์— ์˜ํ•ด ์ผ์น˜ํ•˜๋Š” ์š”์†Œ ์„ ํƒ,
  ์ด ๊ฒฝ์šฐ์—๋Š” li์š”์†Œ ์ž์‹  ์ž์ฒด๋ฅผ hover์‹œ ์ ์šฉ๋จ */
  &:hover {
    background-color: lightgray;
  }

  p {
    color: white;
    font-weight: $font-bold;
  }

  section {
    color: skyblue;
  }

  article {
    color: orange;

    h3 {
      color: black;
    }
  }

  h2 {
    color: pink;
  }
}

 

 

 

 


 

 

3. ๋ฏน์Šค์ธ(Mixin)

๋ฏน์Šค์ธ์ด๋ž€ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ‹€์ด๋‹ค.

ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

/* ํ‹€ ๋งŒ๋“ค๊ธฐ */
@mixin ๋ฏน์Šค์ธ์ด๋ฆ„ {
	์ฝ”๋“œ
}

/* ํ‹€ ์‚ฌ์šฉํ•˜๊ธฐ */
@include ๋ฏน์Šค์ธ์ด๋ฆ„;

 

 

์˜ˆ์‹œ 1

 

App.jsx

function App() {
  return (
    <>
      <div className="test">ํ…Œ์ŠคํŠธ์šฉ div</div>
      <h2>SCSS ๋ฏน์Šค์ธ ์—ฐ์Šต</h2>
      <ul>
        <li>์•ˆ๋…•ํ•˜์„ธ์š”</li>
        <li>๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค</li>
        <li>scss</li>
      </ul>
      <section>
        <article>SCSS ๋ฌธ๋ฒ•์—๋Š”</article>
        <article>๋ณ€์ˆ˜ ์‚ฌ์šฉ,</article>
        <article>์ค‘์ฒฉ ๋ฌธ๋ฒ•,</article>
        <article>๋ฏน์Šค์ธ ๋“ฑ์ด ์žˆ๋‹ค.</article>
      </section>
    </>
  );
}

 

 

App.scss
1๋ฒˆ ๋ณ€์ˆ˜์—์„œ ์ผ๋˜ ์ฝ”๋“œ์— ์ผ๋ถ€๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

- ๋ฏน์Šค์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

ul {
  display: flex;
  flex-direction: column;
  align-items: start;
  justify-content: center;
  gap: 10px;
}

section {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 20px;
  width: 100%;
}

 

- ๋ฏน์Šค์ธ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ

์ด ๋•Œ section์—์„œ๋Š” flex-direction์˜ ๊ฐ’์„ ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ,

๊ทธ๋Ÿด ๋•Œ๋Š” ๊ธฐ๋ณธ๊ฐ’์ธ row๋ฅผ ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค.

@mixin flex($direction, $align, $justify, $gap) {
  display: flex;
  flex-direction: $direction;
  align-items: $align;
  justify-content: $justify;
  gap: $gap;
}

ul {
  @include flex(column, start, center, 10px);
}

section {
  @include flex(row, center, space-between, 20px);
}

 

๋งŒ์•ฝ ๊ทธ๊ฒŒ ๋ถˆํŽธํ•˜๋‹ค๋ฉด direction์„ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋งจ ๋’ค๋กœ ๋นผ์ค€ ๋‹ค์Œ, ์ดˆ๊ธฐ๊ฐ’์„ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

@mixin flex($align, $justify, $gap, $direction: row) {
  display: flex;
  flex-direction: $direction;
  align-items: $align;
  justify-content: $justify;
  gap: $gap;
}

ul {
  @include flex(start, center, 10px, column);
}

section {
  @include flex(center, space-between, 20px);
}

 

๊ทธ ์™ธ์—๋„ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์†์„ฑ์„ ๋”ฐ๋กœ ์„ค์ •ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด

์ฒ˜์Œ ์„ ์–ธํ•  ๋•Œ ๋ชจ๋‘ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•ด์ค€ ๋’ค,

์‚ฌ์šฉ ํ•  ๋•Œ ์ธ์ž์— ์†์„ฑ๋„ ํ•จ๊ป˜ ๋„ฃ์–ด ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

@mixin flex($align: start, $justify: start, $gap: 0, $direction: row) {
  display: flex;
  flex-direction: $direction;
  align-items: $align;
  justify-content: $justify;
  gap: $gap;
}

ul {
  @include flex($gap: 10px, $direction: column);
}

 

 

 

์˜ˆ์‹œ 2

 

App.jsx๋Š” ์˜ˆ์‹œ 1๊ณผ ๋™์ผํ•˜๋‹ค.

 

App.scss

/* ํฐํŠธ ํฌ๊ธฐ */ 
$font-large: 50px;
$font-mid: 40px;
$font-small: 30px;

/* ํฐํŠธ ๊ตต๊ธฐ */ 
$font-bold: 900;
$font-thin: 400;

/* ์ƒ‰์ƒ */ 
$color-green: #116511;
$color-blue: rgb(96, 130, 215);

/*...์ค‘๋žต...*/

@mixin font($color, $size, $weight) {
  color: $color;
  font-size: $size;
  font-weight: $weight;
}

ul {
  @include flex($gap: 10px, $direction: column);
  @include font($color-blue, $font-mid, $font-bold);
}

 

์ดˆ๋ฐ˜์— ์ƒ์„ฑํ•œ ๋ณ€์ˆ˜๋ฅผ ๋ฏน์Šค์ธ์—๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 


 

 

 

 

'react' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React / ์Šคํƒ€์ผ๋ง (3) - tailwindcss  (0) 2025.04.17
React / ์Šคํƒ€์ผ๋ง (2) - Styled Components  (1) 2025.04.16
React / custom Hook  (1) 2025.04.11
React / useRef  (0) 2025.04.11
React / ์ƒ๋ช…์ฃผ๊ธฐ  (0) 2025.04.10