<star />

Sass(SCSS) ๋ณธ๋ฌธ

CSS ๐ŸŽจ

Sass(SCSS)

๋ณ„๊น… 2022. 12. 23. 00:08
728x90

 

1. CSS Preprocessor ๊ฐ€ ๋ญ์˜ˆ์š”?

 

- ์ „์ฒ˜๋ฆฌ๊ธฐ 3๋Œ€์žฅ์œผ๋กœ๋Š” Less, Sass(SCSS), Stylus ๊ฐ€ ์žˆ์Œ.

- ๋ณดํ†ต CSS Preprocessor ๋ผ๊ณ  ๋ถ€๋ฆ„.

- ์‚ฌ์Šค๋Š” ๊ธฐ์ดˆ ์–ธ์–ด์— ํž˜์„ ์ฃผ๋Š” css ์˜ ํ™•์žฅ์ž„.

- ์›น์—์„œ๋Š” css ๋งŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒ˜๋ฆฌ๊ธฐ๋Š” ์ง์ ‘ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์—†์Œ.

- ์ „์ฒ˜๋ฆฌ๊ธฐ๋Š” css ๋ฌธ๋ฒ•๊ณผ ๊ต‰์žฅํžˆ ์œ ์‚ฌํ•˜์ง€๋งŒ ์„ ํƒ์ž์˜ ์ค‘์ฒฉ์ด๋‚˜ ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ๋‹ค์–‘ํ•œ ๋‹จ์œ„์˜ ์—ฐ์‚ฐ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

- ํ‘œ์ค€ css ๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•จ.

- ๋‹จ, ์›น์—์„œ๋Š” ์ง์ ‘ ๋™์ž‘์„ ํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑ ํ›„, ์›น์—์„œ ๋™์ž‘ ๊ฐ€๋Šฅํ•œ ํ‘œ์ค€์˜ css ๋กœ ์ปดํŒŒ์ผ ํ•ด์•ผ ํ•จ.

- ์ปดํŒŒ์ผ ๋ฐฉ๋ฒ•์€ ๋งŽ์Œ... ์ฃผ๋กœ, node-sass ๋ผ๋Š” Node.js ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ์ธ LibSass ์— ๋ฐ”์ธ๋”ฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜

Webpack, Parcel ๋“ฑ๋“ฑ...

 

2. Sass (SCSS) 

 

- ๋ฌธ๋ฒ•์€ Sass ๊ฐ€ Stylus ์™€ ๋น„์Šทํ•˜๊ณ , SCSS ๋Š” Less ์™€ ๋น„์Šทํ•จ.

- Sass ์™€ SCSS ๋Š” ํ•˜๋‚˜์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๋ชจ๋‘ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅํ•จ.

- ๊ฐ€์žฅ ์˜ค๋ž˜๋œ css์˜ ํ™•์žฅ ์–ธ์–ด์ž„. (ํ›Œ๋ฅญ)

 

> Sass ์™€ SCSS ์˜ ์ฐจ์ด์ ์€?

- Sass ์˜ 3๋ฒ„์ „์—์„œ ๋“ฑ์žฅํ•œ SCSS ๋Š” css ๊ตฌ๋ฌธ๊ณผ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋„๋ก ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•ด ๋งŒ๋“  Sass ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” css ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ž„.

- ์ฆ‰, SCSS ๋Š” css ์™€ ๊ฑฐ์˜ ๊ฐ™์€ ๋ฌธ๋ฒ•์œผ๋กœ Sass ๊ธฐ๋Šฅ์„ ์ง€์›ํ•จ.

- ๋‘˜์€ {} ์ค‘๊ด„ํ˜ธ์™€ ;์„ธ๋ฏธ์ฝœ๋กœ์˜ ์œ ๋ฌด ์ฐจ์ด๊ฐ€ ์žˆ์Œ.

 

/* ์ด๊ฑด Sass */
.star
    height: 158px
    color: yellow
    div
        background: #000
            margin-right: -10px

 

- Sass ๋Š” ์„ ํƒ์ž์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ '๋“ค์—ฌ์“ฐ๊ธฐ'๋กœ ๊ตฌ๋ถ„ํ•จ.

- ๊ฐ„๊ฒฐํ•˜๊ณ  ์ž‘์„ฑํ•˜๊ธฐ ํŽธ๋ฆฌํ•จ, ์ค‘๊ด„ํ˜ธ๋‚˜ ์„ธ๋ฏธ์ฝœ๋ก ์ด ์—†์œผ๋‹ˆ ํ›จ์”ฌ ๊นฐ๋”.

 

/* ์ด๊ฑด SCSS */
.star {
    height: 158px;
    div {
        background: #000;
        &:last-child {
            margin-right:-10px;
        }
    }
}

 

- SCSS ๋Š” {} ์ค‘๊ด„ํ˜ธ๋กœ ๋ฒ”์œ„๋ฅผ ๊ตฌ๋ถ„ํ•จ.

- ์ธ๋ผ์ธ ์ฝ”๋“œ๋กœ ํ•œ์ค„ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ,css ์™€ ์œ ์‚ฌํ•œ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง€๊ธฐ ๋•œ์‹œ๋กฑ ์ฝ”๋“œ ํ†ตํ•ฉ์ด ์‰ฌ์›€.

 

๋‘˜์€ ๊ฐœ์ธ ์ทจํ–ฅ์ด๊ธฐ์— ํšŒ์‚ฌ๋‚˜ ํŒ€์—์„œ ์‚ฌ์šฉ ์‹œ, ์ƒํ™ฉ์— ๋งž๊ฒŒ ์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

(์ €๋Š” SCSS๊ฐ€ ๋” ์ข‹๋„ค์š”.)

 

 

3. ์ค‘์ฒฉ (Nesting)

 

- Sass ๋Š” ์ค‘์ฒฉ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

- ์ƒ์œ„ ์„ ํƒ์ž์˜ ๋ฐ˜๋ณต์„ ํ”ผํ•˜๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ณต์žกํ•œ ๊ตฌ์กฐ ์ž‘์„ฑ ๊ฐ€๋Šฅ.

 

.star {
    height:158px;
    .kim {
        padding:20px;
        li {
            display:inline-block;
        }
    }
}


/* ์ปดํŒŒ์ผ ํ›„ ์ด๋ ‡๊ฒŒ ๋ฐ”๋€Œ๋Š” ๊ฑฐ์ž„ */
.star { height:158px; }
.star .kim { padding:20px; }
.star .kim li { display:inline-block; }

 

4. ์ƒ์œ„ ์„ ํƒ์ž ์ฐธ์กฐ (Ampersand)

 

.star {
    width:158px;
    &.active {
        background-color:#ff0000;
    }
}

.list {
    li {
        &:last-child {
            margin-right:0;
        }
    }
}

/* ์ปดํŒŒ์ผ ๋˜๋ฉด ์ผ์ผ€ ๋จ */
.star { width:158px; }
.star.active { background-color:#ff0000; }
.list li:last-child { margin-right:0; }

 

& ํ‚ค์›Œ๋“œ๊ฐ€ ์ฐธ์กฐํ•œ ์ƒ์œ„ ์„ ํƒ์ž๋กœ ์น˜ํ™˜๋จ.

 

.star {
	&-sm { font-size:12px; }
    &-md { font-size:14px; }
    &-lg { font-size:16px; }
}

/* ์ปดํŒŒ์ผ ๋˜๋ฉด ์ด๋ ‡๊ฒŒ ๋จ์š” */
.star-sm { font-size:12px; }
.star-md { font-size:14px; }
.star-lg { font-size:16px; }

 

5. ์ค‘์ฒฉ ํƒˆ์ถœ @at-root 

 

- ์ค‘์ฒฉ์—์„œ ํƒˆ์ถœํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

- ์ค‘์ฒฉ ์•ˆ์—์„œ ์ƒ์„ฑํ•˜๋˜ ์ค‘์ฒฉ ๋ฐ–์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•จ.

- ์ค‘์ฒฉ ์•ˆ์—์„œ ์žˆ๋Š” ํŠน์ • ๋ณ€์ˆ˜๋ฅผ ๋ฒ”์œ„ ๋ฐ–์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋‹ˆ๊นŒ... @at-root  ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

 

.star {
	$w: 1000px;
    $h: 158px;
    li {
    	width: $w;
        height: $h;
    }
    @at-root .kim {
    	width: $w;
        height: $h;
    }
}

/* ์ปดํŒŒ์ผ ํ•˜๋ฏ„ ์ด๋ ‡๊ฒŒ ๋ผ */
.star li { width:1000px; height:158px; }
.kim { width:1000px; height:158px; }

 

 

6. ์ค‘์ฒฉ ์†์„ฑ

 

- ๋™์ผํ•œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๋Š” ์†์„ฑ๋“ค์„ ์ค„์—ฌ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

.star {
    font: {
        weight: 500;
        size: 14px;
    };
    margin: {
        top: 10px;
        right: 10px;
    };
}

/* ์ปดํŒŒ์ผ ๋˜๋ฏ„ ์ผ์ผ€ ๋จ */
.star { font-weight:500; font-size:14px; margin-top:10px; margin-right:10px; }

 

7. ๋ณ€์ˆ˜ (Variables)

 

- ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

- ๋ณ€์ˆ˜ ์ด๋ฆ„ ์•ž์—๋Š” ํ•ญ์ƒ $ ๋ฅผ ๋ถ™์ด์…ˆ.

 

$๋ณ€์ˆ˜์ด๋ฆ„ : ์†์„ฑ๊ฐ’;

$main-f-c: #ededed;
$main-f-w: 500;
$h : 158px;

.star {
	height: $h;
    color: $main-f-c;
	font-weight: $main-f-w;
}

/* ์ปดํŒŒ์ผ ๋˜๋ฉด ์ด๋ ‡๊ฒŒ ๋จ */
.star { height:158px; color:#ededed; font-weight:500; }

 

8. ๋ณ€์ˆ˜ ์œ ํšจ ๋ฒ”์œ„ (Variable Scope)

 

- ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ํšจ๋ฒ”์œ„๊ฐ€ ์žˆ๋‹ค.

- ์„ ์–ธ๋œ ๋ธ”๋ก {} ๋‚ด๋ถ€์—์„œ๋งŒ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง.

 

.star {
	$color: #ededed;
    background: $color;
}

/* ๋ณ€์ˆ˜ $color ๋Š” .star ์˜ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ ์„ค์ •๋œ ๋ณ€์ˆ˜๋ผ์„œ, ๋ธ”๋ก ๋ฐ–์˜ .kim ๋‚ด๋ถ€์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ */
.kim {
	color: $color;
}

 

9. ๋ณ€์ˆ˜ ์žฌํ• ๋‹น (Variable Reassignment)

 

- ๋ณ€์ˆ˜์— ๋ณ€์ˆ˜๋ฅผ ์žฌํ• ๋‹น ๊ฐ€๋Šฅํ•˜๋‹ค.

 

$black : #000000;
$pink : #FF338E;

$main-color: $pink;
$sub-color: $black;

.star {
    color: $main-color;
    background: $sub-color;
}

/* ์ปดํŒŒ์ผ ๋˜๋ฉด */
.star { color:#000; background:#ff338e; }

 

10. !global (์ „์—ญ ์„ค์ •)

 

- !global ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ ์‹œ ๋ณ€์ˆ˜์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ์ „์—ญ ๊ธ€๋กœ๋ฒŒ๋กœ ๋นผ์„œ ์„ค์ • ๊ฐ€๋Šฅํ•จ.

 

.star {
    $color: #FF338E !global;
    background: #color;
}

.kim {
    color: $color;
}

/* ์ปดํŒŒ์ผ ๋˜๋ฉด */
.star { background:#FF338E; }
.kim { background:#FF338E; }

 

11. !default (์ดˆ๊ธฐ๊ฐ’ ์„ค์ •)

 

- !default ํ”Œ๋ž˜๊ทธ๋Š” ํ• ๋‹น๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•จ.

- ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ๊ธฐ์กด ํ• ๋‹น๊ฐ’์„ ์‚ฌ์šฉํ•จ.

 

$main-color: #FF338E;

.star {
    $main-color: #ededed !default;
    background: $main-color;
}

/* ์ปดํŒŒ์ผ ๋˜๋ฉด */
.star { background:#FF338E; }

 

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ๋ณ€์ˆ˜์™€ ๊ฐ’์„ ์„ค์ •ํ•˜๊ฒ ์ง€๋งŒ, ๊ธฐ์กด ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋Š”

ํ˜„์žฌ ์„ค์ •ํ•˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒ ์–ด~ ๋ผ๋Š” ์˜๋ฏธ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๋””ํดํŠธ๊ฐ’์„ ์™œ ์ฃผ๋Š” ๊ฑฐ๋ƒ๊ณ  ์ƒ๊ฐ์ด ๋“ค ํ…๋ฐ, ๐Ÿง ํ’€์–ด์„œ ์ƒ๊ฐํ•ด ๋ณด์ž๋ฉด 

 

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋“ค๊ณผ

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ๋ณ€์ˆ˜๋“ค์ด Overwrite ๋ฎ์–ด์“ฐ๊ธฐ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์ž„. ๐Ÿ˜ก

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฎ์–ด์“ฐ๊ธฐ ๋˜๋Š” ์ƒํ™ฉ์„ ์•ˆ ๋งŒ๋“œ๋ ค๋ฉด,

!default ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ธ์šฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

/* box.scss ํŽ˜์ด์ง€๋ผ๊ณ  ๊ฐ€์ • */
$pink-500: #FF338E;

/* main.scss ํŽ˜์ด์ง€๋ผ๊ณ  ๊ฐ€์ • */
@import 'box';

$pink-500: #FF147D !default; /* ๋‚œ ์›๋ž˜ ์ด ํ•‘ํฌ์ƒ‰์ด์—ˆ์–ด~ ์•Œ์•„์ฃผ๋ผ~ */

.star {
    background: $pink-500;	/* import ํ•ด์˜จ #FF338E๊ฐ€ ์ ์šฉ๋จ. */
}

 

12. #{} (๋ฌธ์ž ๋ณด๊ฐ„)

 

- #{} ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝ”๋“œ์˜ ์–ด๋””๋“ ์ง€ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ

 

โญ๏ธ ๋ณด๊ฐ„๋ฒ•์ด๋ž€?

>>> ๋ณด๊ฐ„(Interpolation) ์€ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ๋ฒ•์ด๊ณ , ์ค‘๊ฐ„์— ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ๋ผ์›Œ ๋„ฃ๋Š”๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์Œ.

const name = 'star'
console.log(`Hello ${name}?!`)

๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋Š” ๊ฑธ ๋ณด๊ฐ„๋ฒ•(่ฃœ้–“ๆณ•) ์ด๋ผ๊ณ  ํ•จ. ๐Ÿ˜ƒ

 

$family: unquote("Noto+Sans");
@import url("http://fonts.googleapis.com/css?family=#{$family}");

/* ์ปดํŒŒ์ผ ๋˜๋ฉด */
@import url("http://fonts.googleapis.com/css?family=Noto+Sans");

 

Sass ์˜ ๋‚ด์žฅ ํ•จ์ˆ˜ unquote() ๋Š” ๋ฌธ์ž์—์„œ ๋”ฐ์˜ดํ‘œ "" ๋ฅผ ์ œ๊ฑฐํ•ด ์ค๋‹ˆ๋‹ค.

 

 

 

728x90

'CSS ๐ŸŽจ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

SVG  (0) 2023.01.02
styled-components  (0) 2022.12.29
Comments