SASS์์ JS์ ๋ง์ฐฌ๊ฐ์ง๋ก ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ, ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์์ @๋ฅผ ๋ถ์ธ๋ค๋ ๊ฒ๋ง ๋นผ๋ฉด ๋น์ทํ๊ฒ ๋์ํ๋ค.
์ํ๋ ์กฐ๊ฑด์ ์ค์ ํ๊ณ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ์๋ง ์คํ์ผ์ ๋ถ์ฌํ ๋ ์ฌ์ฉํ๋ค.
์๋๋ $circle
์ ๊ฐ์ด ์ฐธ์ด๋ฉด border-radius
๊ฐ์ $size
์ ์ ๋ฐ๋งํผ ์ค์ ์์ด ๋๊ฒ ํ๋ ์กฐ๊ฑด๋ฌธ์ด๋ค.
@mixin avatar($size, $circle: false) {
width: $size;
height: $size;
@if $circle {
border-radius: $size / 2;
}
}
.square-av {
@include avatar(100px, $circle: false);
}
.circle-av {
@include avatar(100px, $circle: true);
}
.square-av {
width: 100px;
height: 100px;
}
.circle-av {
width: 100px;
height: 100px;
border-radius: 50px;
}
@else
๋ @if
์ ๋ค์ ๋์ค๋ฉฐ @if
์ ๊ฑธ์๋ ์กฐ๊ฑด์ด false
์ผ ๊ฒฝ์ฐ ์คํ๋ ๊ตฌ๋ฌธ์ ์ ๋๋ค.
์๋๋ @mixin
์ ๋ค์ด์ค๋ $light-theme
์ ๊ฐ์ด true
์ด๋ฉด .banner
์ ๋ฐ์ ์์์,
<body>
์ .dark
ํด๋์ค๊ฐ ๋ถ์ผ๋ฉด $light-theme
์ ๊ฐ์ false
๋ก ๋ณด๋ด์ ์ด๋์ด ์์์ ๋ถ์ฌํ๋ ์กฐ๊ฑด๋ฌธ์ด๋ค.
$light-background: #f2ece4;
$light-text: #036;
$dark-background: #6b717f;
$dark-text: #d2e1dd;
@mixin theme-colors($light-theme: true) {
@if $light-theme {
background-color: $light-background;
color: $light-text;
} @else {
background-color: $dark-background;
color: $dark-text;
}
}
.banner {
@include theme-colors($light-theme: true);
body.dark & {
@include theme-colors($light-theme: false);
}
}
.banner {
background-color: #f2ece4;
color: #036;
}
body.dark .banner {
background-color: #6b717f;
color: #d2e1dd;
}
@else if
๋ ํ๋์ @if
๋ก๋ ์กฐ๊ฑด์ ๊ฒฝ์ฐ์ ์๊ฐ ๋ถ์กฑํ ๋, ์ฆ @if
์กฐ๊ฑด ์ธ์ ์กฐ๊ฑด์ ๋ ๋ถ์ผ ๋ ์ฌ์ฉํ๋ค. ์ฒซ๋ฒ์งธ @if
์ ์กฐ๊ฑด์ด false
์ผ ๋ @else if
๋ก ๋์ด๊ฐ๋ฉฐ, @else
@if
๊ฐ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณต๋ ์ ์๊ณ ๋ง์ง๋ง์ @else
๋ก ์์ ๋ชจ๋ ์กฐ๊ฑด์ด false
์ผ ๋ ์คํํ ๊ตฌ๋ฌธ์ด ์์ฑ๋๊ณ ๋ง๋ฌด๋ฆฌ ๋๋ค.
์๋๋ triangle์ $direction ๊ฐ์ ๋ฐ๋ผ border-bottom-color
๋ฅผ ๋ฐ๊พธ๋ ์กฐ๊ฑด๋ฌธ์ด๋ค.
@mixin triangle($size, $color, $direction) {
height: 0;
width: 0;
border-color: black;
border-style: solid;
border-width: ($size/2);
@if $direction == up {
border-bottom-color: $color;
} @else if $direction == right {
border-left-color: $color;
} @else if $direction == down {
border-top-color: $color;
} @else if $direction == left {
border-right-color: $color;
} @else {
@error "Unknown direction #{$direction}.";
}
}
.next {
@include triangle(5px, black, right);
}
.next {
height: 0;
width: 0;
border-color: transparent;
border-style: solid;
border-width: 2.5px;
border-left-color: black;
}
์ฌ๋ฌ์์์ ์คํ์ผ์ ๋ถ์ฌํ ๋ ์ฌ์ฉํ๋ค. :nth-
๊ฐ์ ์ ํ์์ ๊ฐ์ด ์ฐ๋ฉด ์ ์ฉํ๋ค.
@for
๋ JS์ ๊ทธ๊ฒ๊ณผ ์๋๋ฐฉ์์ด ๊ฐ์ง๋ง, ์์ฑ๋ฒ์ด ์กฐ๊ธ ๋ค๋ฅด๋ค.
์๋ ๋ฐ๋ณต๋ฌธ์ 1๋ถํฐ 3๊น์ง ์ด ์ธ ๋ฒ ๋ฐ๋ณต๋๋ฉด์ $image
์ ์ฐจ๋ก๋ก 1, 2, 3์ ๋ฃ๋ ๋ฐ๋ณต๋ฌธ์ด๋ค.
from 4 through 7
์ด์๋ค๋ฉด 4, 5, 6, 7 ์ด ๋ค ๋ฒ ๋ฐ๋ณตํ์ ๊ฒ์ด๋ค.
@for $image from 1 through 3 {
.photo-box:nth-child(#{$image}) {
background-image: url("../assets/poster#{$image}.png");
}
}
.photo-box:nth-child(1) {
background-image: url("../assets/image1.png");
}
.photo-box:nth-child(2) {
background-image: url("../assets/image2.png");
}
.photo-box:nth-child(3) {
background-image: url("../assets/image3.png");
}
@each
๋ lists๋ maps์ ๊ฐ(each) ์์๋ค์ ์ํํ๋ ๋ฐ๋ณต๋ฌธ์ด๋ค.
์๋ ์ฝ๋๋ index
๋ผ๋ ๋ด์ฅํจ์๋ก $color-palette
๋ผ๋ lists์์ ์์์ธ $color
์ ์ธ๋ฑ์ค ๊ฐ์ $i
์ ๋์
ํ๊ณ , ํด๋น $color
์ ๊ฐ์ background
์ ๋ฃ์ด์ฃผ๋ ๋ฐ๋ณต๋ฌธ์ด๋ค.
JS์ ๋ฌ๋ฆฌ, SCSS์์ lists์ ์ธ๋ฑ์ค ๊ฐ์ 1๋ถํฐ ์์ํ๋ค.
$color-palette: #dad5d2 #3a3532 #375945;
@each $color in $color-palette {
$i: index($color-palette, $color);
.color-circle:nth-child(#{$i}) {
background: $color;
width: 20px;
height: 20px;
border-radius: 50%;
}
}
.color-circle:nth-child(1) {
background: #dad5d2;
width: 20px;
height: 20px;
border-radius: 50%;
}
.color-circle:nth-child(2) {
background: #3a3532;
width: 20px;
height: 20px;
border-radius: 50%;
}
.color-circle:nth-child(3) {
background: #375945;
width: 20px;
height: 20px;
border-radius: 50%;
}
์กฐ๊ฑด์ด true๋ผ๋ฉด, ๋ฌดํ์ ๋ฐ๋ณตํ๋ ๋ฐ๋ณต๋ฌธ์ด๋ค. ์กฐ๊ฑด์ด false๊ฐ ๋๋ฉด ๋ฐ๋ณต๋ฌธ์์ ๋น ์ ธ๋์จ๋ค.
์๋๋ $value
๊ฐ์ด $base
๋ณด๋ค ์์์ง ๋๊น์ง $ratio
๋ก ๊ณ์ ๋๋๋ ๋ฐ๋ณต๋ฌธ์ด๋ค.
์ฒซ๋ฒ์งธ ์คํ: 40px > 16px์ด true์ด๋ฏ๋ก $value์ 40 / 2์ ๊ฐ์ธ 20์ ๋์
๋๋ฒ์งธ ์คํ: 20px > 16px์ด true์ด๋ฏ๋ก $value์ 20 / 2์ ๊ฐ์ธ 10์ ๋์
์ธ๋ฒ์งธ ์คํ: 10px > 16px์ด false์ด๋ฏ๋ก ํ์ฌ $value ๊ฐ์ธ 10์ return
@function scale-below($value, $base, $ratio: 2) {
@while $value > $base {
$value: ($value/$ratio);
}
@return $value;
}
.sup {
font-size: scale-below(40px, 16px);
}
.sup {
font-size: 10px;
}
JS์ ํจ์์ ํ๋ ์ญํ ์ด ๊ฐ๋ค. ์ ์ธ๋๊ณ ํธ์ถ๋๋ฉด ๋ฐ์ ์ธ์ ๊ฐ์ผ๋ก ์ฐ์ฐ์ ํด์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ค.
@mixin
๊ณผ์ ์ฐจ์ด์
@mixin
์ ์คํ์ผ ์ฝ๋๋ฅผ ๋ฐํํ๊ณ @function
์ ๋ด๋ถ์ ์ฝ๋๋ฅผ ํจํด ์ฐ์ฐ๋ ๊ฐ์ @return
ํ๋ค.
์๋๋ unitCheck๋ผ๋ @function
์ด ํธ์ถ ๋ ์ ์
๋ ฅ๋ฐ์ $x
๊ฐ์ ํ์
์ด number์ธ์ง ํ๋จํด์
number๊ฐ ์๋๋ผ๋ฉด $x
๊ฐ์ ๊ทธ๋๋ก ๋ฐํ,
number๋ผ๋ฉด ๋จ์๊ฐ ์๋์ง ํ์ธํด์
๋จ์๊ฐ ์๋ค๋ฉด px์ ๋ถ์ฌ์ ๋ฐํํ๊ณ ,
์๋ค๋ฉด hi๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
@function unitCheck($x) {
@if(type-of($x) == number) {
@if(unitless($x)) {
@return $x+px;
}
@return "hi";
}
@return $x;
}
.px {
width: unitCheck(100px);
};
.no-px {
width: unitCheck(100);
}
.px {
width: "hi";
}
.no-px {
width: 100px;
}
SASS์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ด์ฅํจ์๊ฐ ์๋ค. ๊ทธ ์ค ๋ช ๊ฐ๋ง ์ ๋๋ค.
๋ ๋ค์ํ ๋ด์ฅํจ์๋ SASS ๊ณต์๋ฌธ์ Built-In Modules ์ฐธ๊ณ
lighten(color, amount)
: ๊ธฐ์กด ์์์ ๋ฐ๊ธฐ๋ฅผ ๋์ธ๋ค.( 0%-100% ์ฌ์ด์ ๊ฐ )darken(color, amount)
: ๊ธฐ์กด ์์์ ๋ฐ๊ธฐ๋ฅผ ๋ฎ์ถ๋ค.( 0%-100% ์ฌ์ด์ ๊ฐ )mix(color1, color2, weight)
: 2๊ฐ์ ์์์ ์์ด์ ์๋ก์ด ์์์ ๋ง๋ ๋ค.max(number, ..)
: ๊ดํธ์ ๋ฃ์ ๊ฐ ์ค์ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ฐํํ๋ค.min(number, ..)
: ๊ดํธ์ ๋ฃ์ ๊ฐ ์ค์ ๊ฐ์ฅ ์์ ์๋ฅผ ๋ฐํํ๋ค.parcentage(number)
: ํผ์ผํธ๋ก ์ซ์๋ฅผ ๋ฐ๊ฟ์ค๋ค.comparable(num1,num2)
: ์ซ์1๊ณผ ์ซ์2๊ฐ ๋น๊ต ๊ฐ๋ฅํ์ง ํ์ธ ํ true, false ๊ฐ์ ๋ฐํํ๋ค.srt-insert(string,insert,index)
: ๋ฌธ์์ด์ ์ํ๋ ์์น(index)์ ๋ฌธ์๋ฅผ ๋ฃ์ ํ(insert), ์๋ก์ด ๋ฌธ์์ด์ ๋ฐํํ๋ค.str-index(string,substring)
: ๋ฌธ์์ด์์ ํด๋น ๋ฌธ์์ index ๊ฐ์ ๋ฐํํ๋ค.to-upper-case(string)
: ๋ฌธ์์ด ์ ๋ถ๋ฅผ ๋๋ฌธ์๋ก ๋ฐ๊พผ๋ค.to-lower-case(string)
: ๋ฌธ์์ด ์ ๋ถ๋ฅผ ์๋ฌธ์๋ก ๋ฐ๊พผ๋ค.unit(number)
: ์ซ์์ ๋จ์๋ฅผ ๋ฐํํ๋ค.unitless(number)
: ๋จ์๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ๋จํ์ฌ true, false ๊ฐ์ ๋ฐํํ๋ค.variable-exists(name)
: ๋ณ์๊ฐ ํ์ฌ ๋ฒ์์ ์กด์ฌํ๋์ง ํ๋จํ์ฌ true, false ๊ฐ์ ๋ฐํํ๋ค. ์ด ํจ์์ ์ธ์๋ $
์์ด ์ฌ์ฉํ๋ค.width: 100%
max-width: 100%
background-size: contain
์ด๋ฏธ์ง๊ฐ ์๋ฆฌ๋ ๊ณณ ์์ด ์ปจํ
์ด๋์ ๋ด์ ํ ๋งํผ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ค. ์ปจํ
์ด๋์ ์ด๋ฏธ์ง์ ์ฌ์ด์ฆ๊ฐ ์ ํํ ์ผ์นํ์ง ์๋๋ค๋ฉด ์ฌ๋ฐฑ์ด ์๊ธธ ์๋ ์๋ค.
background-size: cover
์ด๋ฏธ์ง๊ฐ ์๋ฆฌ๋๋ผ๋ ์ปจํ
์ด๋๋ฅผ ๊ฐ๋ ์ฑ์ด๋ค. ์ปจํ
์ด๋์ ์ด๋ฏธ์ง ์ฌ์ด์ ์ฌ๋ฐฑ์ด ์์๋งํผ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ค.
background-position
์ผ๋ก ์ปจํ
์ด๋ ๋ด์์ ์ด๋ฏธ์ง์ ์์น๋ฅผ ์กฐ์ ํ ์ ์๋ค. center center๋ก ์ง์ ํ๋ฉด, ์ด๋ฏธ์ง์ ์์น๊ฐ ์ปจํ
์ด๋์ ์ค์์ ์ค๊ฒ๋๋ฉฐ, ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฏธ์ง์ ์ํ์ข์ฐ๊ฐ ๊ณจ๊ณ ๋ฃจ ์๋ฆฐ๋ค.
preload=โ์์ฑโ;
: ์นํ์ด์ง์ ๋ฆฌ์์ค๋ฅผ ๋ก๋ฉํ ๋ ์์์ ๋ฏธ๋ฆฌ ๋ก๋ํ ์ง์ ์ฌ๋ถ.none
: ์ฌ์ ๋ฒํผ์ ๋๋ฌ์ผ ๋ก๋ ์์, metadata
: ์์์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋, auto
: ๋ฏธ๋ฆฌ ๋ก๋poster="์ด๋ฏธ์ง url"
: ์ธ๋ค์ผ ์ง์ controls
: ์ปจํธ๋กค๋ฌ ํ์ ์ฌ๋ถautoplay
: ์๋ ์ฌ์ ์ฌ๋ถ. ์ ๊ทผ์ฑ๊ณผ ๊ณผ๋ํ ํธ๋ํฝ ๋ฐฉ์ง๋ฅผ ์ํด muted๊ฐ ์์ด์ผ ์๋์ฌ์๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์muted
: ์์๊ฑฐ ์ฌ๋ถloop
: ๋ฐ๋ณต์ฌ์ ์ฌ๋ถMDN iframe
Youtube์์ ์์์ ์ฐํด๋ฆญ ํ ๋ค ์์ค์ฝ๋ ๋ณต์ฌ๋ฅผ ํด๋ฆญํ๋ฉด iframeํ๊ทธ๋ฅผ ์ป์ด์ฌ ์ ์๋ค.
Youtube ์ง์๋๋ ๋งค๊ฐ๋ณ์
<video>
width
๋ฅผ %๋ก ์ฃผ๋ฉด ๋๋ค.
<iframe>
width
๋ฅผ %๋ก ์ฃผ๋ฉด ์ปจํ
์ด๋ ๋๋น์ ๋ฐ๋ผ iframe
์ ๋๋น๋ ๋ณํํ์ง๋ง height
๋ ์๋ณธ ๋์ด๋ฅผ ๊ทธ๋๋ก ์ ์งํ๋ค.
iframe
์ ์ปจํ
์ด๋์ padding-top
์ ์ฃผ๊ณ ๊ทธ ์๋ฆฌ์ iframe
์ position: absolute
๋ก ์น๋ ๊ฒ์ด๋ค.
๊ด๊ฑด์ padding-top
์ ์ผ๋ง๋ ์ฃผ๋๋์ธ๋ฐ, padding-top
์ %๋ก ์ฃผ๋ฉด ํด๋น ์์์ width
๊ฐ์ผ๋ก ๊ณ์ฐ๋๋ ๊ฑธ ์ด์ฉํ๋ค.
์๋ณธ ๋์์์์ ์ธ๋ก๊ธธ์ด๊ฐ ์ฐจ์งํ๋ ๋น์จ์ ๊ณ์ฐํด์ (์ธ๋ก ๊ธธ์ด / ๊ฐ๋ก ๊ธธ์ด * ์ฐจ์งํ๊ฒ ํ๊ณ ์ถ์ ๋๋น ๋น์จ) ์ฃผ๋ฉด ๋๋ค. ๋ํ iframe
์ inline frame
๋ต๊ฒ inline ์์์ด๋ฏ๋ก baseline
์ด ์ ์ฉ๋์ด ์์ผ๋ฏ๋ก vertical-align: top
์ ๋ถ์ฌํด์ ์ธ๋ฐ์๋ ์ฌ๋ฐฑ์ ์์ค๋ค.
.container {
position: relative;
padding-top: calc(720/1280*100%); /* 56.25%; */
}
iframe {
width: 100%;
height: 100%;
vertical-align: top;
position: absolute;
top: 0;
left: 0;
}