Syntax-06-mixins
#
Sass(SCSS) Syntax - 6. ์ฌํ์ฉ(Mixins)โ๏ธ ํด๋น ๊ธ์ ํจ์คํธ์บ ํผ์ค - ํ๋ก ํธ์๋ ๊ฐ๋ฐ ๊ฐ์์์ HTML & CSS, SASS(SCSS) Part์ ๋ฐ์์ ๊ฐ์ฌ๋์ ๊ฐ์์๋ฃ(Sass(SCSS) ์์ ์ ๋ณต!)๋ฅผ ๋ณด๋ฉฐ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค.
#
์ฌํ์ฉ(Mixins)Sass Mixins๋ ์คํ์ผ ์ํธ ์ ์ฒด์์ ์ฌ์ฌ์ฉ ํ CSS ์ ์ธ ๊ทธ๋ฃน์ ์ ์ํ๋ ๊ธฐ๋ฅ์ด๋ค.
Mixin ์ฌ์ฉ๋ฒ์ ๋ ๊ฐ์ง๋ก ๋๋๋ฉด ์ ์ธํ๊ธฐ( @mixin
)์ ํฌํจํ๊ธฐ( @include
)์ด๋ค.
@mixin
#
๊ธฐ๋ณธ์ ์ธ @mixin
์ ์ธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์๋ฐ, SCSS์ Sass์ ๋ฌธ๋ฒ์ด ์กฐ๊ธ ์ฐจ์ด๊ฐ ์๋ค.
// SCSS@mixin ๋ฏน์ค์ธ์ด๋ฆ { ์คํ์ผ;}
// Sass=๋ฏน์ค์ธ์ด๋ฆ ์คํ์ผ
// SCSS@mixin large-text { font-size: 22px; font-weight: bold; font-family: sans-serif; color: orange;}
// Sass=large-text font-size: 22px font-weight: bold font-family: sans-serif color: orange
๋ํ @mixin
์ ์ ํ์๋ฅผ ํฌํจ ๊ฐ๋ฅํ๊ณ , ์์(๋ถ๋ชจ) ์์ ์ฐธ์กฐ( &
๋ฑ)๋ ๊ฐ๋ฅํ๋ค.
@mixin large-text { font: { size: 22px; weight: bold; family: sans-serif; } color: orange;
&::after { content: "!!"; }
span.icon { background: url("/images/icon.png"); }}
@include
#
์ ์ธ๋ @mixin
์ ์ฌ์ฉํ ๋๋ @include
๋ฅผ ์ฌ์ฉํ๋ค. ์ญ์ SCSS์ Sass๊ฐ ์ฝ๊ฐ์์ฐจ์ด๊ฐ ์๋ค.
// SCSS@include ๋ฏน์ค์ธ์ด๋ฆ;
// Sass+๋ฏน์ค์ธ์ด๋ฆ
// SCSSh1 { @include large-text;}div { @include large-text;}
// Sassh1 +large-textdiv +large-text
์ปดํ์ผํ๋ฉด
h1 {font-size: 22px;font-weight: bold;font-family: sans-serif;color: orange;}h1::after {content: "!!";}h1 span.icon {background: url("/images/icon.png");}div {font-size: 22px;font-weight: bold;font-family: sans-serif;color: orange;}div::after {content: "!!";}div span.icon {background: url("/images/icon.png");}
#
์ธ์(Arguments)Mixin์ ํจ์(Functions)์ฒ๋ผ ์ธ์(Arguments)๋ฅผ ๊ฐ์ง ์ ์๋ค.
// SCSS@mixin ๋ฏน์ค์ธ์ด๋ฆ($๋งค๊ฐ๋ณ์) { ์คํ์ผ;}@include ๋ฏน์ค์ธ์ด๋ฆ(์ธ์);
// Sass=๋ฏน์ค์ธ์ด๋ฆ($๋งค๊ฐ๋ณ์) ์คํ์ผ
+๋ฏน์ค์ธ์ด๋ฆ(์ธ์)
@mixin dash-line($width, $color) { border: $width dashed $color;}
.box1 { @include dash-line(1px, red); }.box2 { @include dash-line(4px, blue); }
์ปดํ์ผํ๋ฉด
.box1 {border: 1px dashed red;}.box2 {border: 4px dashed blue;}
#
์ธ์์ ๊ธฐ๋ณธ๊ฐ ์ค์ ์ธ์(Arguments)๋ ๊ธฐ๋ณธ๊ฐ(default value)๋ฅผ ๊ฐ์ง ์ ์๋ค.
@include
ํฌํจ ๋จ๊ณ์์ ๋ณ๋์ ์ธ์๊ฐ ์ ๋ฌ๋์ง ์๋ ๊ฒฝ์ฐ์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋๋ค.
@mixin ๋ฏน์ค์ธ์ด๋ฆ($๋งค๊ฐ๋ณ์: ๊ธฐ๋ณธ๊ฐ) { ์คํ์ผ;}
@mixin dash-line($width: 1px, $color: black) { border: $width dashed $color;}
.box1 { @include dash-line; }.box2 { @include dash-line(4px); }
์ปดํ์ผํ๋ฉด
.box1 {border: 1px dashed black;}.box2 {border: 4px dashed black;}
#
ํค์๋ ์ธ์(Keyword Arguments)@mixin
์ ๋งค๊ฐ๋ณ์๊ฐ ์ฌ๋ฌ ๊ฐ ์ผ ๋, @include
์์ ์ธ์์ ๊ฐ๋ง ์
๋ ฅํ๋ฉด, ์ฌ๋ฌ๋งค๊ฐ๋ณ์์ ์ธ์๊ฐ ์์ฐจ์ ์ผ๋ก ์ ๋ฌ๋๊ฒ ๋๋ค.
ํ์ง๋ง ์ธ์์ ๊ฐ๋ง ์ ๋ ฅํ๋ ๊ฒ์ด ์๋๋ผ ๋ช ์์ ์ผ๋ก ํค์๋(๋ณ์)๋ฅผ ์ ๋ ฅํ์ฌ ์ ๋ฌํ๊ฒ ๋๋ฉด, ์์์ ์๊ด ์์ด ์ํ๋ ๋งค๊ฐ๋ณ์์ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์๋ค.
์ด ๋, ์์ฑํ์ง ์์ ์ธ์๊ฐ ์ ์ฉ๋ ์ ์๋๋ก @mixin
์์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํด ์ฃผ๋๊ฒ์ด ์ข๋ค.
@mixin ๋ฏน์ค์ธ์ด๋ฆ($๋งค๊ฐ๋ณ์A: ๊ธฐ๋ณธ๊ฐ, $๋งค๊ฐ๋ณ์B: ๊ธฐ๋ณธ๊ฐ) { ์คํ์ผ;}
@include ๋ฏน์ค์ธ์ด๋ฆ($๋งค๊ฐ๋ณ์B: ์ธ์);
@mixin position( $p: absolute, $t: null, $b: null, $l: null, $r: null) { position: $p; top: $t; bottom: $b; left: $l; right: $r;}
.absolute { // ํค์๋ ์ธ์๋ก ์ค์ ํ ๊ฐ๋ง ์ ๋ฌ @include position($b: 10px, $r: 20px);}.fixed { // ์ธ์๊ฐ ๋ง์์ง์ ๋ฐ๋ผ ๊ฐ๋
์ฑ์ ํ๋ณดํ๊ธฐ ์ํด ์ค๋ฐ๊ฟ @include position( fixed, $t: 30px, $r: 40px );}
์ปดํ์ผํ๋ฉด
.absolute {position: absolute;bottom: 10px;right: 20px;}.fixed {position: fixed;top: 30px;right: 40px;}
#
์ธ์ ๋ฆฌ์คํธ(Argument Lists)๋๋๋ก ์ ๋ ฅํ ์ธ์์ ๊ฐ์๊ฐ ๋ถํ์คํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, ๊ทธ ๋๋ฅผ ์ํด ์ธ์ ๋ฆฌ์คํธ๋ฅผ์ฌ์ฉํ ์ ์๋ค.
๐ Argument Lists๐ Taking Arbitrary Arguments
๋งค๊ฐ๋ณ์ ๋ค์ ...
๋ฅผ ๋ถ์ฌ์ฃผ๋ ๊ฒ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
@mixin ๋ฏน์ค์ธ์ด๋ฆ($๋งค๊ฐ๋ณ์...) { ์คํ์ผ;}
@include ๋ฏน์ค์ธ์ด๋ฆ(์ธ์A, ์ธ์B, ์ธ์C);
// ์ธ์๋ฅผ ์์๋๋ก ํ๋์ฉ ์ ๋ฌ ๋ฐ๋ค๊ฐ, 3๋ฒ์งธ ๋งค๊ฐ๋ณ์($bg-values)๋ ์ธ์์ ๊ฐ์์ ์๊ด์์ด ๋ฐ์@mixin bg($width, $height, $bg-values...) { width: $width; height: $height; background: $bg-values;}
div { // ์์ Mixin(bg) ์ค์ ์ ๋ง๊ฒ ์ธ์๋ฅผ ์์๋๋ก ์ ๋ฌํ๋ค๊ฐ 3๋ฒ์งธ ์ดํ๋ถํฐ๋ ๊ฐ์์ ์๊ด์์ด ์ ๋ฌ @include bg( 100px, 200px, url("/images/a.png") no-repeat 10px 20px, url("/images/b.png") no-repeat, url("/images/c.png") );}
์ปดํ์ผํ๋ฉด
div {width: 100px;height: 200px;background: url("/images/a.png") no-repeat 10px 20px,url("/images/b.png") no-repeat,url("/images/c.png");}
์ธ์ ๋ฆฌ์คํธ๋ @mixin
์ผ๋ก ์ ๋ฌํ ๋๋ ์ฌ์ฉํ ์ ์๋ค.
@mixin font( $style: normal, $weight: normal, $size: 16px, $family: sans-serif) { font: { style: $style; weight: $weight; size: $size; family: $family; }}div { // ๋งค๊ฐ๋ณ์ ์์์ ๊ฐ์์ ๋ง๊ฒ ๋ฆฌ์คํธ๋ก ์ ๋ฌ $font-values: italic, bold, 16px, sans-serif; @include font($font-values...);}span { // ํ์ํ ๊ฐ๋ง ๋งต์ผ๋ก ๋ณ์์ ๋ด์ ์ ๋ฌ $font-values: (style: italic, size: 22px); @include font($font-values...);}a { // ํ์ํ ๊ฐ๋ง ๋งต์ผ๋ก ์ ๋ฌ @include font((weight: 900, family: monospace)...);}
$font-values
๋ div
์์๋ ๋ฆฌ์คํธ๋ก, span
, a
์์๋ ๋งต์ผ๋ก ์ฌ์ฉ๋ ๋ณ์์ด๋ค.
...
์ ๋ณ์ ๋ค์ ์ถ๊ฐํ์ฌ ์ธ์๋ก ์ ๋ฌํจ์ผ๋ก ์ฌ๋ฌ ๋ณ์๋ค์ ํ๋ฒ์ ์ ๋ฌํ ์ ์๋ค.
@content
#
@mixin
์ ์ ์ธํ ๋ @content
๋ฅผ ์ฌ์ฉํ๋ฉด @include
๋ฅผ ์ฌ์ฉํด ์ํ๋ ์คํ์ผ๋ธ๋ก์ ์ถ๊ฐํด์ ์ ๋ฌํ ์ ์๋ค.
@mixin ๋ฏน์ค์ธ์ด๋ฆ() { ์คํ์ผ; @content;}
@include ๋ฏน์ค์ธ์ด๋ฆ() { // ์คํ์ผ ๋ธ๋ก ์คํ์ผ;}
@mixin icon($url) { &::after { content: $url; @content; }}.icon1 { // icon Mixin์ ๊ธฐ์กด ๊ธฐ๋ฅ๋ง ์ฌ์ฉ @include icon("/images/icon.png");}.icon2 { // icon Mixin์ ์คํ์ผ ๋ธ๋ก์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ @include icon("/images/icon.png") { position: absolute; };}
์ปดํ์ผํ๋ฉด
.icon1::after {content: "/images/icon.png";}.icon2::after {content: "/images/icon.png";position: absolute;}
@mixin
์ ์ ๋ฌ๋๋ ์คํ์ผ ๋ธ๋ก์ @mixin
์ ์ ๋ฌ๋๊ธฐ ์ @include
๋ฒ์์์ํ๊ฐ๋๋ค.
์ฆ, @mixin
์ ๋งค๊ฐ๋ณ์๊ฐ ์๋๋ผ ์ ์ญ๋ณ์๋ก ํด์๋๋ค.
$color: red;
@mixin colors($color: blue) { // Mixin์ ๋ฒ์ @content; background-color: $color; border-color: $color;}
div { @include colors() { // ์คํ์ผ ๋ธ๋ก์ด ์ ์๋ ๋ฒ์ color: $color; }}
์ปดํ์ผํ๋ฉด
div {color: red;background-color: blue;border-color: blue;}
#
Referenceํจ์คํธ์บ ํผ์ค - ํ๋ก ํธ์๋ ๊ฐ๋ฐ ๊ฐ์ - HTML & CSS, SASS(SCSS) Part by ParkYoungWoong