์ด ๊ธฐ๋ฅ ์์ฒญ์ ์ด ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ผ๋ก ์ ์๋์์ต๋๋ค. https://github.com/cloudhead/less.js/issues/1155
์ด๊ฒ์ ์๋์์ค
๋ฏน์ค์ธ์ ๋ฉ์ง ์ ์ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ด๊ณ ์์ ํ๋ฉด์ ๊นจ๋ํ๊ฒ ์ ์งํ๋ฉฐ ํ ๋ฒ๋ง ์์ฑํ๋ฉด ๋๊ณ ์ปดํ์ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌด์์ธ์ง ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ mixin์ ๋จ์ ์ DRY๊ฐ ์๋๋ผ๋ ๊ฒ์ ๋๋ค. ํนํ clearfix์ ๊ฐ์ "์ ํธ๋ฆฌํฐ" ๋ฏน์ค์ธ์ ๋ง์ด ์ฌ์ฉํ ๋. ์ด๊ฒ์ extends๊ฐ ํจ์ฌ ๋ ๋์ ์ต์ ์ด ๋ ์ ์๋ ๊ณณ์ ๋๋ค. ์ฌ์ค ์ด๊ฒ์ mixins ํ์ฅ์ ์ํ ํ๋ฅญํ๊ณ ๊ตฌ์ฒด์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ฒฉ ์ ํ๊ธฐ๋ฅผ ํ์ฅํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์๋ํ๊ณ ๋ฏน์ค์ธ์ผ๋ก ์๋ฝํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฏน์ค์ธ์ ์ ํ ๋ณ๊ฒฝ๋์ง ์๊ณ ์ฌ์ ํ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ๋ฏน์ค์ธ์ด ์๊ณ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ CSS์ ํ์๋์ง ์์ต๋๋ค. ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋น ์์ฑ์ ์ฌ์ฉ๋ ๊ฐ ์ ํ๊ธฐ์ ์ปดํ์ผ๋ ์ฝ๋์ ๊ณ์ ํ์๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฏน์ค์ธ์ _ ํ์ฅ ํ๋ฉด , ๋ฏน์ค์ธ์
.clearfix() {
// stuff
}
.navbar {
&:extend(.clearfix());
}
.banner {
&:extend(.clearfix());
}
์ปดํ์ผ๋ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
.navbar,
.banner {
// clearfix stuff
}
๋ฐ๋ผ์ mixins ์์ฑ์ ์ฌ์ ํ โโํ์ฅํ ์ ํ์์ ์ํด ์์๋์ง๋ง mixin(์ ํ์) ์์ฒด๋ ์ปดํ์ผ๋ ๊ฒฐ๊ณผ์ ํ์๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ํ์ฅ๊ณผ ๋ฏน์ค์ธ์ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ญ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ข์ํ์ง๋ง ๋ช ํํํ๊ธฐ ์ํด .. ์ด๊ฒ์ ๋น์ ์ด ์ ์ ํ ์ ์์๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ด ์ป๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค..
.navbar,
.banner {
// clearfix stuff
}
๋ณด๋ค๋
.navbar {
// clearfix stuff
}
.banner {
// clearfix stuff
}
์๋๋ฉด ๋ด๊ฐ ์๋ชป ์ดํด ํ์ต๋๊น?
ํ๋ผ๋ฉํธ๋ฆญ ๋ฏน์ค์ธ๊ณผ ์ผ๋ฐ ๋ฏน์ค์ธ์ ๋ชจ๋ ๊ฐ๊ณ ์ถ์ต๋๋ค.
.navbar,
.banner {
// clearfix stuff
}
.....
๋๋
.clearfix,
.navbar,
.banner {
// clearfix stuff
}
....
ํ์ํ ๋๋ง๋ค ์ด๊ฒ์ด ๋ฏน์ค์ธ์ด ์ด๋ฏธ ์๋ํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ผ๋ฏ๋ก ์ต์ ํ ์ธก๋ฉด์์ ์ต์ข CSS ์ถ๋ ฅ์ ๋ ์ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ฐ์ฑ๊ณผ ๋ฐฉ๋ฒ์ด ๋๋ถ๋ถ์ ๋๋ค.
ํ์คํ
.clearfix,
.navbar,
.banner {
// clearfix stuff
}
๋ณด๋ค ์งง๋ค
.clearfix {
// clearfix stuff
}
.navbar{
// clearfix stuff
}
.banner {
// clearfix stuff
}
๊ทธ๋ฆฌ๊ณ ์ค์ํ ์ ์๋ ๋ ๋ณต์กํ ์์ ๊ฒฝ์ฐ ์ผ๋ถ ์ฌ๋๋ค์ด ์ด๋ฌํ ๋ถ์กฑ ๋๋ฌธ์ SASS๋ก ์ ํํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ผ๋ฐ ๋ฏน์ค์ธ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๊ฑฐ์ Less์ ๊ณ ์ ์ฅ์น์ ๋๋ค. @agatronic , ๋ค ์ ๋ ๊ทธ๋ ๊ฒ ๋ด ๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์๋ ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ์ ํ์ฅํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์๋ํ ๊น์? ์ด๊ฒ์ด ์ง์๋๋ค๊ณ ๊ฐ์ ํ๊ณ ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ์ ๋ ๋ฒ ํ์ฅํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ๋งค๋ฒ ๋ค๋ฅธ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
.transition(@transition) {
-webkit-transition: @transition;
-moz-transition: @transition;
-o-transition: @transition;
transition: @transition;
}
.navbar {
&:extend(.transition(opacity .2s linear));
}
.banner {
&:extend(.transition(opacity .3s linear));
}
๋๋ ๊ทธ๊ฒ์ด ๋ ๊ฐ์ mixin ์ฌ๋ณธ์ ์์ฑํ ์ ์๋ค๊ณ ์์ํฉ๋๋ค. ์ด๊ฒ์ ์ฝ๋๋ ์ ์ง ์๊ณ ์ผ๋ฐ mixin์ ๋นํด ์ด์ ๋ ์์ต๋๋ค.
.navbar {
-webkit-transition: opacity .2s linear;
-moz-transition: opacity .2s linear;
-o-transition: opacity .2s linear;
transition: opacity .2s linear;
}
.banner {
-webkit-transition: opacity .3s linear;
-moz-transition: opacity .3s linear;
-o-transition: opacity .3s linear;
transition: opacity .3s linear;
}
๊ทธ๋ฌ๋์ด ํน์ ๋ฏน์ค ์ธ์ ๋ง์ด ์ฌ์ฉํ ์ ์์ต๋๋ค, ๊ทธ๋์ ๋น์ ์ ๋ค์์ ๋ฏน์ค ์ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ .dropdown
์ ๊ฐ์ ๋ณ์ .banner
,์ด ๋ฐ์ํ ์ ์์ต๋๋ค
.navbar {
-webkit-transition: opacity .2s linear;
-moz-transition: opacity .2s linear;
-o-transition: opacity .2s linear;
transition: opacity .2s linear;
}
.banner,
.dropdown {
-webkit-transition: opacity .3s linear;
-moz-transition: opacity .3s linear;
-o-transition: opacity .3s linear;
transition: opacity .3s linear;
}
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์ ๋ฅผ ํฅ๋ฏธ๋กญ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ๋ถ๋ค์ ํผ๋๋ฐฑ๋ ๋ค์ด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์์
@jonschlinkert ์, ๋ ๋์ ๊ทธ๋ฆผ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค. ๋ด๊ฐ ๋งํ๋ฏ์ด ๊ทธ๊ฒ์ ๋ ์์! ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ๋ค๋ฅธ ์์ค์ ๊ณต๋ชจ๋ฅผ ์ถ๊ฐํ๊ณ ์์ผ๋ฉฐ ์ ์คํ๊ฒ ์ํํด์ผ ํ๊ฑฐ๋ ์ํํ์ง ์์์ผ ํจ์ ์ดํดํฉ๋๋ค.
์ฐธ์กฐํ๋ ๋ฐฉ๋ฒ์ ํ์ฅ์ ๋ค์ ํจํด์ ์ฌ์ฉํ์ฌ ๋งค์ฐ ์ฝ๊ฒ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
.transition(@transition) {
-webkit-transition: @transition;
-moz-transition: @transition;
-o-transition: @transition;
transition: @transition;
}
.quickOpacity1(){
.transition(opacity .2s linear);
}
.quickOpacity2(){
.transition(opacity .3s linear);
}
.navbar{
.quickOpacity1();
}
.banner,
.dropdown{
.quickOpacity2();
}
์์ ๋ด์ฉ์ 2๊ฐ์ ์๋ก์ด ์ ์ธ์ ๋ฐ ํ์ฅ ๋ฏน์ค์ธ์ ์ฃผ์ ํ๋ ๊ฒ์ ๋๋ค.
clearfix์ ๊ฒฝ์ฐ ์๋์ ์ ์ฌํ ํจํด์ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค. ์ด๋ clearfix๋ฅผ ํด๋์ค๋ก ์์ฑํ ๋ฟ๋ง ์๋๋ผ ํด๋น clearfix ์คํ์ผ์ ์ ์ ์ธ์ ์ฝ์ ํฉ๋๋ค.
.clearfix{
//clearfix stuff
}
.navbar,
.banner {
.clearfix;
}
@krisister ์ด๊ฒ์ ๋ํด ํผ๋์ด ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ค๋ช ํ๋ ํจํด์ ์ค์ ๋ก ์ค์ฒฉ๋ ๋ฏน์ค์ธ ๋๋ ๋ฏน์ค์ธ ์์ ํจํด์ ๋๋ค. ๊ทธ ์ญ์ผ๋ก ์์ ์ ํ์ฅํฉ๋๋ค.
@jonschlinkert Mixin ์์ - ํ๋ฅญํ ์ด๋ฆ์ ๋๋ค. ์์ ๋ ์์ ๋ชจ๋ ํ์ฅ์ ํต์ฌ ๊ธฐ๋ฅ์ธ ๋ถ๋ชจ๋ก๋ถํฐ ์ถ๋ ฅ์ ์์ํ๋ ค๊ณ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ๋ด ์์ ์ ์ถ๋ ฅ์ด ์์ํ ์ถ๋ ฅ์ด๋ผ๋ ๋ฐ ๋์ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ทํ์ ์๋ ์๊ฒฌ์ ๋ค์ ์ฝ์ผ๋ฉด ์ดํดํฉ๋๋ค. ์ถ๋ ฅ์ ํ๋์ CSS ๊ท์น์ผ๋ก ๊ฒฐํฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์๋ 2๋ก ์์ฑ๋์์ง๋ง.
์ค์ ๋ก :extend
๋ ๊ฝค ๊ต์ฅํฉ๋๋ค. ๋๋ ์์ ํ ๊ดด์ํ ์ฌ๋์ด ๋ ๊ฒ์ด์ง๋ง ๋ชจ๋ ๊ฒ์ "๋ฌด์์ด ์ด๋๋ก ์ฎ๊ฒจ์ง๋๊ฐ"์ ๋ฌ๋ ค ์์ต๋๋ค. "๋ฏน์ค์ธ์ ์์ฑ์ ๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ํ๊ธฐ๋ก ์ ๋ฌํ๋ ๊ฒ"๊ณผ ๊ฐ์ ๋ฏน์ค์ธ์ ์๊ฐํ์ญ์์ค. ๊ทธ๋ฆฌ๊ณ :extend
๋ฅผ "๋ฏน์ค์ธ ์์ฒด๊น์ง ์ฌ์ฉํ ์
๋ ํฐ ๋น"์ ์ญ์ผ๋ก ์๊ฐํด ๋ณด์ธ์. _selector์ ์์ฑ์ด ์๋๋ผ ์ ํ์ ์์ฒด์
๋๋ค. ๊ทธ๋์ ๋น์ ์ด ์ด๊ฒ์ํ๋ค๋ฉด :
.some-mixin() {
padding-top: 100px;
background: #f7f7f7;
}
// a selector that is extending the mixin
.alert:extend( .some-mixin() ) {
border: 1px solid #e5e5e5;
}
// another selector extending the mixin
section:extend(.some-mixin()) {
margin: 20px 0;
}
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// The selectors that extended the mixin are now where the mixin used to be.
.alert,
section {
padding-top: 100px;
background: #f7f7f7;
}
// And the properties of the mixin did not get copied down below
// so we saved a line or two of code.
.alert {
border: 1px solid #e5e5e5;
}
section {
margin: 20px 0;
}
๊ทธ๊ฒ์ด ๋ ์๋ฏธ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ธ์ ๋ ์ง ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค.
@agatronic , @matthewdl , @DesignByOnyx , ์๊ฐ๋ง ํด๋ ์ด๊ฒ์ด ํน์ดํ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด์ ๋ํ ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์ผํ๋ก ๊ตฌ๋ถ๋ ์ ํ๊ธฐ ๋ชฉ๋ก์ ํ์ฉํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ํ์ฅ _should_๊ฐ ๋ฐฐ์ด์ฒ๋ผ ๋๊ปด์ง ์ ์์ต๋๋ค. . ๊ตฌ๋ฌธ์ :extend[N]
๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
๋ฏน์ค์ธ์ด ํ์ฅ๋๋ฉด ๋์๋ ๋ ์ฝ๊ฒ ๋ณด์ ๋๋ค.
section:extend[.some-mixin(), .another-mixin()] {
margin: 20px 0;
}
์ด๋ ์ชฝ์ด๋ ๊ด์ฐฎ์ต๋๋ค. ํ์ง๋ง ๋๊ดํธ์ ๋ํด ๋ญ๊ฐ ์ ๋๋ก ๋ ๋๋์ด ๋ญ๋๋ค.
@jonschlinkert - []
๋ ๋ฐฐ์ด์ด ์๋ css์ ์์ฑ์ ์๋ฏธํฉ๋๋ค. ์ฌ๊ธฐ์ :extend()
๋ ์์ฌ ์ ํ๊ธฐ์ ๋ํ ๋งํฌ๋ก ์ธํด ์ ํ๋์์ผ๋ฏ๋ก ์ผ๋ฐ ๋๊ดํธ๊ฐ ์ ์ง๋์ด์ผ ํ๋ค๊ณ ๊ฐ๋ ฅํ๊ฒ ์๊ฐํฉ๋๋ค.
์ข์ ์ง์ , ๋์ํฉ๋๋ค.
๋๊ดํธ๊ฐ ๋ณด๊ธฐ ์ข๊ณ ์ฝ๊ธฐ ์ข๋ค๋ ๋ฐ ๋์ํ์ง๋ง, ์ด๋ฏธ ์ ํํ ๊ตฌ๋ฌธ์ ๊ณ ์ํด์ผ ํฉ๋๋ค.
ํ์ฅ(N) ๊ตฌ๋ฌธ์ ๋ํด ์์ง์๊ฐ๋ฝ์ ์น์ผ๋ค๊ณ @agatronic๊ณผ ๊ฐ์ ์ด์ ๋ก ์์ฐ CSS์ฒ๋ผ ๋ ๋ง์ด ๋๊ปด์ง๋๋ค.
๋ฏน์ค์ธ์ ํ์ฅํ๋ ๊ฒ์ ๋์ ์๊ฐ์ด ์๋๋๋ค. ์์ ๊ตฌ๋ฌธ @jonschlinkert๊ฐ ํ์คํ์ง ์์ต๋๋ค. ๋ด๊ฐ ๊ทธ๊ฒ์ ์ข์ํ์ง ์๋ ๊ฒ์ ์๋๋๋ค. ๋๋ ๋น์ ์ด ์ด ๊ฒ์ ์ค์ ๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค.
๋น์ ์ด ์๋ฏธํ๋ ๋ฐ๋ ๋์ผํ ๋ฏน์ค์ธ ์ฝํ ์ธ ๋ฅผ "๊ฐ์ ธ์ค๊ธฐ"ํ์ง๋ง ๊ฒฐ๊ณผ CSS์์ ์ค์ ๋ก ๋ฐ๋ณตํ์ง ์๋ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ์ถ๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํ์ฅ ๋ฏน์ค์ธ์ด๋ผ๊ณ ๋ถ๋ฅด์ง ์์ ๊ฒ์ ๋๋ค. ์ฆ, ํ์ฅ ์ ์๊ฐ ์ ํ๊ธฐ์ ๋ํด ์ํํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก mixin ์ ์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ผ ๊ฒฐ๊ณผ ํด๋์ค๋ฅผ ์ค์ ๋ก ๋ณ๊ฒฝ(ํ์ฅ)ํ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์์ ํด ์ฃผ์ธ์. ํ์ง๋ง navbar/banner/dropdown ์์ ๋ ๋ค์์์ ์ง์๋์ง ์์ต๋๋ค.
.navbar {
.transition(opacity .2s linear);
}
.banner {
.transition(opacity .3s linear);
}
.dropdown:extend(.banner) { }
์ฆ, ํ์์ฒ๋ผ ํด๋์ค๋ฅผ ํ์ฅํ์๊ฒ ์ต๋๊น? ๋๋ ๋จ์ง ๋น์ ์ ์ฌ์ฉ ํจํด์ ๋ํด ๋จธ๋ฆฌ๋ฅผ ์ธ๋งค๋ ค๊ณ ๋ ธ๋ ฅ ์ค์ด๋ฉฐ, ๋ฏน์ค์ธ์ ํ์ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํ์๋ฅผ ํ์ฅํ๊ธฐ ์ํ ์ฌ์ฉ ๋ฐ ๋ช ๋ช ๋ฒ๊ณผ ๋ชจ์๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ฅ ํธ์ถ์์ ๋ฏน์ค์ธ์ ์ฐธ์กฐํด์ผ ํ๊ณ ๋ฏน์ค์ธ์ ์ฐธ์กฐํ ์ ํ๊ธฐ๋ฅผ ํ์ฅํ์ง ์์์ผ ํ๋ ์ด์ ์ ๋ํ ์ถ๊ฐ ์ธ๋ถ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
๊ทธ๊ฒ ๋ด๊ฐ ๊ทธ๊ฒ์ ์ป๋ ๋ฐฉ๋ฒ
์ํ๋ ์ต์ข CSS ์ถ๋ ฅ
.sometingShared,
.anotherClass,
.anotherYetClass,
.yetClass {
// amount of shared code here
}
.anotherClass,
.anotherYetClass {
// did something dynamic with a
}
.yetClass {
// did something dynamic with b
}
.anotherClass {
// native another class code
}
.anotherYetClass {
// native another yet class code
}
.yetClass {
// native yet class code
}
์ํ๋ ์ถ๋ ฅ์ ์ป๊ธฐ ์ํด ํ์ฌ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
.somethingShared,
.anotherClass,
.anotherYetClass,
.yetClass {
// amount of shared code here
}
.someMixin(@val) {
// do something dynamic with val
}
.anotherClass,
.anotherYetClass {
.someMixin(a);
}
.yetClass {
.someMixin(b);
}
.anotherClass {
// native another class code
}
.anotherYetClass {
// native another yet class code
}
.yetClass {
// native yet class code
}
์ ์๋ ๋ ๊ตฌ๋ฌธ
.somethingShared {
// amount of shared code here
}
.someMixin(@val) {
// do something dynamic with val
}
.anotherClass:extend(.sometingShared, .someMixin(a)) {
// native another class code
}
.anotherYetClass:extend(.sometingShared, .someMixin(a)) {
// native another yet class code
}
.yetClass:extend(.sometingShared, .someMixin(b)) {
// native yet class code
}
ํ์ฅ์ ๊ณต์ ์ฝ๋์ ์์ด ์ ๋ง ๋ง์ ๋๋ง ์ ์ฉํ ์ ์์ง๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ์ ์ธ ๋ฏน์ค์ธ ์ฌ์ฉ์ด ์ ๋ฆฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฝ๊ฐ, ๊ทธ๋ฅ ๋๊ธฐ ์ํ ๋ผ์ด๋ธ ๋๋ฏธ ์ํ
http://jsbin.com/opekon/1/edit
http://jsbin.com/opekon/2/edit
http://jsbin.com/opekon/3/edit
http://jsbin.com/opekon/4/edit
๋งํ๋ฏ์ด, ๋์ฒ๋ผ ๊ฒ์ผ๋ฅธ ์ฌ๋๋ค์ ์ํด ํน์ ์ํฉ์์ ์ค์ ๋ก ์ฑ๋ฅ ํฅ์์ด ์์ ์ ์์ต๋๋ค :) ์ถ๊ฐ ์ ์ฐ์ฑ์ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ LESS ์ฝ๋ ์ต์ ํ
๋ค์์ SASS๊ฐ ํ์ฅ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ์ฌํญ์ ๋ค๋ฃจ๋ ํ์ฅ์ ๋ํ ๋ฉ์ง ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ด ์์ ์ ์ํํ ๋ฐฉ๋ฒ์์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ํ๋ช ํ ๊ฒ์ ๋๋ค. http://designshack.net/articles/css/semantic-grid-class-naming-with-placeholder-selectors-in-sass-3-2/
ํนํ ๋ฏน์ค์ธ ํ์ฅ์ ๋ํ ๋ด ์ ์์ ๋ณธ์ง์ ์ผ๋ก SASS "์๋ฆฌ ํ์์"์ ๋์ผํ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ง๋ง ์ธ๋ชจ์๊ณ ๋ถํ์ํ ์๋ฆฌ ํ์์ ์ ์ฉ ํด๋์ค๋ฅผ ๋ง๋ค ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํธ์ง: ์, ์ฌ๊ธฐ์ ์๋ฆฌ ํ์์๋ฅผ ๋ฉ์ง๊ฒ ์์ฝํ ๋ ๋ค๋ฅธ ๊ฒ์๋ฌผ์ด ์์ต๋๋ค. ๋ฏน์ค์ธ ํ์ฅ http://maximilianhoffmann.com/article/placeholder-selectors ์ ํจ๊ป ์ ์ํ๋ ๋ฐ๋ก ๊ทธ๊ฒ์ ๋๋ค
๋๋ ๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ์ ๋ค๋ฅธ ๋ชจ๋ ํ์ฅ ๊ด๋ จ ๊ธฐ๋ฅ๋ณด๋ค ์ ํธํฉ๋๋ค. ์ง๋ฌธ์์ด. ์ด๊ฒ์ ๊ฐ๋ ฅํ ์ง์ ์ด์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋์ํ์ง ์๋๋ค๋ฉด ๋๋ ๊ทธ๊ฒ์ ์ ์ค๋ช ํ์ง ๋ชปํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๊ฝค ๊ฐ๋ ฅํ ๋ฌผ๊ฑด์ ๋๋ค.
SASS๊ฐ ๋๊ปด์ง๋๋ค.
%tile {
width: 200px;
height: 200px;
margin-right: 20px;
}
ํ์ฅ ์ ์ฉ์ผ๋ก ์ค๊ณ๋ ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ๊ณผ ๋์ผํ๋ฉฐ, ๊ด์ฌ์ฌ ๋ถ๋ฆฌ ์ธก๋ฉด์์ ๊ทธ๋ฆฌ ๋์์ง ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์, ๊ทธ๊ฒ์ CSS์ด๋ฉฐ ๊ฐ๋ฅํ ํ ๊ฐ๋จํ๋ค๊ณ ๊ฐ์ ํ์ง ์์ต๋๊น?
@agatronic์ ๋ํด ์ด์ผ๊ธฐํ๋ ๋์ https://github.com/agatronic/less.js/blob/master/lib/less/tree/extend.js ๊ฐ ํ์ฅ๋์ด์ผ ํ๋ ๊ฒ์ ๋ฌด์์ ๋๊น? ์ด๋ฏธ main less ๋ธ๋์น์ ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. ๋ฉ์ฒญํ ์ง๋ฌธ ์ฃ์กํฉ๋๋ค.
@dmi3y 1.4.0์ ๋ํด ์ค๋น๋ pull ์์ฒญ์์ ๊ฐ์ ธ์จ ํ์ฅ์ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์ ๋๋ค. ํ์ฅ ๋ ธ๋๋ฅผ ๋ํ๋ ๋๋ค.
@agatronic ๊ฐ์ฌํฉ๋๋ค. ์ด์ ๋ด๊ฐ ์ผ๋ง๋ ๋์ณค๋์ง ์ ์ ์์ต๋๋ค ;)
@dmi3y ๋ํ์ ๊ณ์ ์ถ๊ฐํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋ ๋์ ์์ค์์ ์ ์งํ์ฌ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์๋๋ก ํฉ์๋ค. ๋ํ ๊ฐ์ธ์ ์ผ๋ก ์ด๋ฉ์ผ์ ๋ณด๋ด์ฃผ์ญ์์ค. mixins ๋ฐ extends ์์ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค(์ฐ๋ฝ์ฒ ์ ๋ณด๋ ํ๋กํ์ ์์ต๋๋ค). ๋ํ ์ด ์ค๋ ๋์ ๋ํ ์ถ๊ฐ ํผ๋์ ํผํ๊ธฐ ์ํด ๋น ๋ฅธ ์ค๋ช ์ ์ ๊ณตํฉ๋๋ค. ๊ทํ์ ์:
%tile {
width: 200px;
height: 200px;
margin-right: 20px;
}
์ด๊ฒ์ SCSS ์ฌ์์์ ๊ตฌํ๋ SCSS "placeholder"์ ๊ตฌ๋ฌธ์ผ๋ก, ๋ฏน์ค์ธ ํ์ฅ์ผ๋ก ์ ์ํ๋ ๊ฒ๊ณผ ์ ์ฌํ ์์ ์ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋งค๊ฐ๋ณ์ํ์ ๊ด๋ จ์ด ์์ต๋๋ค. ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ์ ๋จ์ํ _๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉํ๋ ๋ฏน์ค์ธ์ด๋ฉฐ, ์ด๋ ์ฌ์ฉํ ๋๋ง๋ค ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
@matthewdl
๋น์ ์ด ์๋ฏธํ๋ ๋ฐ๋ ๋์ผํ ๋ฏน์ค์ธ ์ฝํ ์ธ ๋ฅผ "๊ฐ์ ธ์ค๊ธฐ"ํ์ง๋ง ๊ฒฐ๊ณผ CSS์์ ์ค์ ๋ก ๋ฐ๋ณตํ์ง ์๋ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ์ถ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ
navbar/banner/dropdown ์์ ๊ฐ ์ง์๋์ง ์์ต๋๊น?
์๋์, ์๋ ์ง์ ์ ๋์น๊ณ ์์ต๋๋ค. ์์ ํ ๋ฐ๋์ ๋๋ค. ๋ด ์์ ์์ ํ๋ผ๋ฉํธ๋ฆญ ๋ฏน์ค์ธ์ ์ด์ ์ ๋ง์ถ๋ ์ค์๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ํผ๋์ด ๋ฐ์ํ ๊ฒ์ผ ์ ์์ต๋๋ค.
๊ทธ๋์ ๋จผ์ ๋ชจ๋ ๋ฏน์ค์ธ์ด ๋งค๊ฐ๋ณ์๊ฐ ์๋๋ผ๋ ์ ์ ์ค๋ช ํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ ๋ฏน์ค์ธ์ด ๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉํ์ง _์๋๋ก_ ์์ฑ๋ฉ๋๋ค. clearfix์ ๊ฐ์ ์ผ๋ถ ๋ฏน์ค์ธ์ ์ฌ์ฉ๋ ๋ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ณ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ mixin ํ์ฅ์ด ์ ๋ฆฌํ ์ด์ ์ ๋ํ ์๋ฒฝํ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
ํ๋ผ๋ฉํธ๋ฆญ ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ ์๊ด ๋ฏน์ค์ธ์๋ ์ฌ์ฉํ ๋๋ง๋ค ์์ฑ์ด ๋ณต์ ๋๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๊ทธ๋์ ๋ฏน์ค์ธ ํ์ฅ์ด "์ผ๋ฐ ๋ฏน์ค์ธ"๋ง ์ฌ์ฉํ์ฌ ์๋ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ณ ์์์ ์ฌ์ฉํ ์์ ๋ฅผ ๊ณ์ํ๊ฒ ์ต๋๋ค.
๊ทํ์ ์๋ฅผ ๋ณด๋ฉด ์์ ํ ๋ ๋ฆฝ์ ์ด๊ณ ๊ด๋ จ์ด ์๋ ๋ ๊ฐ์ง ์ฌํญ์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ํ๋์ ์์ผ ๋ฟ์
๋๋ค. Twitter Bootstrap์ ํ ์ง์ ์์ .clearfix()
mixin ๋จ๋
์ผ๋ก ๋ค๋ฅธ ์ ํ๊ธฐ ๋ด์์ 20๋ฒ ์ด์ ์ฌ์ฉ๋์์ผ๋ฉฐ .container-fixed()
, .make-row()
์ ๊ฐ์ 4๊ฐ ๋๋ 5๊ฐ์ ๋ค๋ฅธ ๊ตฌ์กฐ์ mixin ๋ด๋ถ์๋ ์ค์ฒฉ๋์์ต๋๋ค. #grid > .core()
. ์ด๋ ํด๋น ๋ฏน์ค์ธ ์ด ์ฌ์ฉํ ๋๋ง๋ค
์ด๊ฒ ๋ ๋ง์ด ๋๋์? ๋ฐ๋ผ์ clearfix ๋ฏน์ค์ธ์ ์์ฑ์ 20๋ฒ ์ด์ ๋ณต์ ํ๋ ๋์ ๋ฏน์ค์ธ ์์ฒด์ ์์น์ clearfix ๋ฏน์ค์ธ์ ์ฌ์ฉํ๋ ์ ํ์๋ฅผ ๊ทธ๋ฃนํํ๊ณ ์์ฑ์ ํ ๋ฒ๋ง ์ ์ธ๋ฉ๋๋ค. ๋ค์ ๋งํ์ง๋ง, ์ด๊ฒ์ ํ๋์ ๋ฏน์ค์ธ์ ๋ถ๊ณผํฉ๋๋ค. ์ผ๋ฐ ๋ฏน์ค์ธ์ ์์ค์ ํ์ฅํ๊ณ ์์ฑ์ ๋ณต์ ํ ๋์ ์ ์ด์ต์ ์์ํด ๋ณด์ธ์. ์์์ ์ด๋๊ฐ์ ์ธ๊ธํ๋ฏ์ด ์ผ๋ฐ ๋ฏน์ค์ธ์ ํน์์ฑ๊ณผ ์ฌ์ ์๋ฅผ ์ํด ๋๋๋ก ํ์ฅํ์ง ์๊ณ ์ฌ์ฉํด์ผ ํ์ง๋ง ๊ทธ๋ ์ง ์์ ๋ฏน์ค์ธ์ ํ์ฅํ๋ ๊ฐ์น๊ฐ ์ค์ด๋ค์ง๋ ์์ต๋๋ค. ์ฌ์ค, ๋๋ ๊ฐ์ธ์ ์ผ๋ก ํ์ฅ๊ณผ ํจ๊ป ํน๋ณํ ์ฌ์ฉํ ์ถ๊ฐ ๋ฏน์ค์ธ์ ๋ง๋ค ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ๋ ๋ฒ์งธ ์๋ ํ์ฅ์ด ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ๊ณผ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ์ด์ ์ ๋์์ผ๋ฏ๋ก ์ด๊ฒ์ด ๊ทธ๋ฆผ์ ์์ฑํ๊ณ ์ด์ ๋ ์ดํด๊ฐ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์์ ๋งํฌํ ๊ธฐ์ฌ๋ฅผ ํตํด ํผ๋์ ํด์ํ ์ ์์ต๋๋ค. ๋ฏน์ค์ธ์ ํ์ฅํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํ๋ฉฐ ์ค์ฒฉ๋ ์ ํ๊ธฐ๋ฅผ ํ์ฅํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ง๋ง ํนํ ์ค์ฒฉ๋ ์ ํ๊ธฐ ๋์ ๋ฏน์ค์ธ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ ๊ฐ๋ฅ์ฑ์ด ๊ฐ์ฅ ๋์ ๋ฐฉ์์ผ๋ก ์ ํ๊ธฐ๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. @DesignByOnyx , @agatronic , @matthewdl , ์ฌ๊ธฐ์ ๋ด๊ฐ ๋์น๊ฑฐ๋ ์์ด๋ฒ๋ฆฐ ๊ฒ์ด ์์ต๋๊น? ํผ๋์ ์์ ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ด ์์ต๋๊น?
๊ฐ์ฌ ํด์. ๋๋ ์ ์ค ์ผ์ด์ค๋ฅผ ์ดํดํ๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉฐ ๋ค์ ์ค์ด ๊ฐ์ฅ ์ ์ค๋ช ๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐฐ๋ ํด๋์ค๋ ๋ฏน์ค์ธ์ผ๋ก ์ฌ์ฉ๋ ๊ฒฝ์ฐ์๋ง ๊ฒฐ๊ณผ CSS์ ํ์๋ฉ๋๋ค(ํ์ฅ ๋๋ ํผํฉ).
๊ทธ๊ฒ์ ๋์๊ฒ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์๋ง๋ ๋ด๊ฐ ๋๊ณ ์๋ ๊ฒ์ ์ ์ฒด :extend
๊ตฌ๋ฌธ์ด ์์ง ์ต์ข
์ ์ด์ง ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ ์ค๋๋ ฅ ์๋ ์ฌ๋ก๋ฅผ ๋ง๋ญ๋๋ค.
์ ํ๊ธฐ ๋ธ๋ก์ ์๋ฃํ๋ฉด ๋ฏน์ค์ธ์ ํ์ฅํ๋ ๋์์ด ์ ํ๊ธฐ๋ฅผ ํ์ฅํ๋ ๋์๊ณผ ์ผ์นํ๊ฒ ๋๋ฉด ์ด๊ธฐ ์ฌ์ฉ๋ฒ์ด ์๋ ํ), ๊ทธ๊ฒ์ ๋์๊ฒ ์ง๊ด์ ์ ๋๋ค.
์ฆ, ๋ค์๊ณผ ๊ฐ์ ์์ (๋๋ ๋๋ฑํ ๊ตฌ๋ฌธ)์ ์ํํ ์๋ ์์ต๋๋ค.
.facebook-button:extend( .button() all ) {
border: 1px solid #e5e5e5;
}
... ๊ทธ๋ผ ๋์๊ฒ์ ์์ง์๊ฐ๋ฝ์ ์น์ผ์ธ์๋ผ. ํ์ง๋ง ์ ์๊ฒ ์์ด ๋ชจ๋ ๊ฒ์ ์ ํ์์ ๋ํด :extend
๋ฅผ ๋ฌด์์/์ด๋ป๊ฒ/์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง์ ๋ฌ๋ ค ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌ๋ฌธ์ ์ ์ณ๋๊ณ ๊ธฐ๋ฅ ์์ด๋์ด๋ก์ ๋น์ ์ ๋ง์ด ์ณ์ต๋๋ค. ๊ฑด์ ํฉ๋๋ค.
@jonschlinkert ๊ฐ์ฌํฉ๋๋ค. ๊ทํ์ ์ง์ง์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ, ๋ถ๋ช ํ ์ ์๊ฐ์ ๊ฐ๋ฅํ ํ ๋ช ํํ๊ฒ ์ ๋ฌํ๊ธฐ ์ํด ์ต์ ์ ๋คํ ๊ฒ์ ๋๋ค. ๋๋ ๋ฏธ๋์ ๋ฐ์ ๊ณผ ์, ๋ค์ ์ ์๋ ๊ฒ์ ๋ํด ๋ฃ๋ ๊ฒ์ด ์๋นํ ์ฌ๋ฏธ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋ฌ๋ถ, ๋ฉ์ง ์ผ์ ํ์ญ์์ค.
์, ์ด ์์์๋ ์ด์ ๊ฒ์๋ฌผ์์ ๋ช ์์ ์ด์ด์ผ ํ์ต๋๋ค.
%tile {
width: 200px;
height: 200px;
margin-right: 20px;
}
Jon์ด ์ ๊ณตํ SASS ์์ต์์์ ๊ฐ์ ธ์์ผ๋ฉฐ, ๊ทธ ์ฃผ์ ๋ชฉํ๋ ์ฌ์ฉํ์ง ์์ ํด๋์ค์ CSS ์ถ๋ ฅ์ ํ๊ธฐํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด ํน์ ๊ฐ๋์์๋ LESS์ ๋น ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค. ์ฌ์ฉํ๊ณ ์ถ์ง๋ง ์ต์ข ์คํ์ผ์ํธ์ ์ถ๋ ฅ๋์ง ์์ ๋.
๋๋ ์ด ํ ๋ก ์ ๋ฐ์ด๋ค์ด ๋ค์ ์๊ฒฌ์ ๋ํด ๋ช ํํ๊ฒ ์ค๋ช ํ๊ณ ์ถ์ต๋๋ค.
๋ฐฐ๋ ํด๋์ค๊ฐ ๋ฏน์ค์ธ์ธ ๊ฒฝ์ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ(ํ์ฅ ๋๋ ํผํฉ) ๊ฒฐ๊ณผ CSS์๋ง ํ์๋ฉ๋๋ค.
๋ ์ผ๋ฐ์ ์ธ clearfix ์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๊ฒ์ด ๋ ์ ๊ณ ๊ฒฐ๊ณผ CSS์ ๋๊น?:
.clearfix() {
&:before,
&:after { content: " "; display: table; }
&:after { clear: both; }
}
.something:extend( .clearfix() ) { }
/*
.clearfix:before,
.clearfix:after,
.something:before,
.something:after {
content: " ";
display: table;
}
.clearfix:after,
.something:after {
clear: both;
}
*/
์๋ .clearfix
ํด๋์ค๊ฐ ์ปดํ์ผ๋ CSS์์ ์๋ต๋ ์ํ๋ก ์ ์ง๋ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก, ๋๋ ๋งํฌ์
์์ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด๊ณ ๋ด CSS์ ์ฌ๋ถ์ ๋ฐ์ดํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ CSS์์ ํด๋์ค๋ฅผ _ํ์๋ก ํ์ง ์์ ๊ฒ์
๋๋ค. ์ด๋ ์ชฝ์ด๋ ๊ฐํ ์๊ฒฌ์ ์์ง๋ง ์ด ์ ์ ๋ํ ์ค๋ช
์ ์์ผ๋ก ๋ ๋์ ์๊ฒฌ์ ์ ์ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค. ๊ฐ์ฌ ํด์.
์ด๊ฒ์ ... ๊ฒฐ๊ณผ CSS์ ๋๊น?:
๋๋ ๋น์ ์ด ๋ฌผ์ด ๊ธฐ์๋ค,ํ์ง๋ง ๋ ๋ง .something
ํด๋์ค๋ ๊ฒฐ๊ณผ CSS์ ํ์๋ฉ๋๋ค. ๊ทธ๋์ ๋น์ ์ ์๋ ์์์ด ๋ง์์ต๋๋ค.
๊ทธ๋ฅ ์๋ฆฌ ํ์์ ๋งํฌ๋ฅผ ์ฝ์ผ์ญ์์ค. ์, ๋ฏน์ค์ธ์ ํ์ฅํ๋ ๊ฒ์ด ์์ ์ ์ํํ๊ณ ๋์ผํ ๊ธฐ๋ฅ์ ์ป๋ ๋ ์ข๊ณ ๋ ์ ์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์์ ์ ์ ์์ ํ๋ ค๋ฉด
.clearfix() {
&:before,
&:after { content: " "; display: table; }
&:after { clear: both; }
}
.something:extend( .clearfix() ) { }
/*
.something:before,
.something:after {
content: " ";
display: table;
}
.something:after {
clear: both;
}
*/
๊ทธ๋ฆฌ๊ณ ์๋ง๋ .clearfix() {
์ ์๊ฐ .clearfix {
์ด๋ฉด ํ์ฅ ์ ์ ๋ด์์ ๋๊ดํธ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์๊ณ ํธ์ถํด๋ ์ถ๋ ฅ์ ์ฐจ์ด๊ฐ ์์ ๊ฒ์
๋๋ค.
ํ์ฅ ๊ธฐ๋ฅ์ ์์ฌ ํด๋์ค ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ ํ ์๋ชป๋ ๊ฒ์
๋๋ค.
"extend sth"๋ "match sth"์ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ ํ์๊ฐ ํด์ผ ํ๋ DOM ๊ตฌ์กฐ์ ๋ํด์๋ ์๋ฌด ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋น์ ์ ์ ์ ์ฌ๋๋ค์ด ๋ง์ ๋์ ์์ด๋์ด๋ฅผ "๋ฐ๋ช "ํ์ต๋๋ค. ๊ฐ์ฅ ์ ๋ช ํ ๊ฒ์ "์ฌ์ฌ์ฉ' .xxx(ํด๋์ค ์ ํ๊ธฐ)๋ฅผ mixin ํ๊ธฐ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ต์ํ ์ผ๋ฐ CSS์์ ์ ์ฒ๋ฆฌ๊ธฐ๋ก ์ฝ๊ฒ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ :extend ๊ตฌ๋ฌธ์ ๋ด๊ฐ ๋ค์ด๋ณธ ๊ฒ ์ค ์ต์ ์ ์์ด๋์ด์ ๋๋ค.
์ฐ๋ฆฌ ๋ฌธ์ ์ ๋ํด ์ด๋ฐ ์ข ๋ฅ์ ํธ์ธ์ฅ๋ด์ ํ๊ณ ์ถ์ง๋ ์์ง๋ง ์ด๋ฐ ๋ง์ ๋ค์ ๊ฒ์ด ์ด๋ฒ์ด ์ฒ์์ด ์๋๋ฏ๋ก CSS์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ๊ณต๊ธฐ๋ฅผ ๋ง๊ฒ ํฉ์๋ค.
๋น์ ์ ์ ์ ์ฌ๋๋ค์ด ๋ง์ ๋์ ์์ด๋์ด๋ฅผ "๋ฐ๋ช "ํ์ต๋๋ค. ๊ฐ์ฅ ์ ๋ช ํ ๊ฒ์ mixin ํ๊ธฐ๋ฒ์ผ๋ก "์ฌ์ฌ์ฉ' .xxx(ํด๋์ค ์ ํ๊ธฐ)์ ๋๋ค. .... :extend ๊ตฌ๋ฌธ์ ๋ด๊ฐ ๋ค์ด๋ณธ ๊ฒ ์ค ์ต์ ์ ์์ด๋์ด์ ๋๋ค.
.xxx
๋ ์์์ ๋ฏน์ค์ธ์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ํ๋ฉฐ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. ์ฌ์ค, ์ด ๊ตฌ๋ฌธ์ CSS ์ฌ์์์ ์๋ฅผ ๋ค์ด ์ค์ ์คํ์ผ์ ์ง์ ํ๊ธฐ ์ํด at-๊ท์น์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ "์นจ์ต์ "์ด ์๋๋๋ค. @keyframes
๋ ์คํ์ผ ์ง์ ์ ๊ฐ์ฅ ๊ฐ๊น๊ณ CSS ๊ตฌ๋ฌธ์์ ์๋ณ์ ์์ฑ๊ณผ ์ผ์นํ๋ ์๋ณ์๊ฐ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ๋งํ๋ ๊ฒ์ ์์ธ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค. ํคํ๋ ์ ์ธ์๋ ์ผ๋ฐ์ ์ผ๋ก CSS at-rules๋ ๋ฌธ์ ์ธ์ฝ๋ฉ( @charset
)๊ณผ ๊ฐ์ด ์คํ์ผ ์์ฒด ์ธ๋ถ๋ฅผ ์๋ฏธํ๋ "์ธ๋ถ" ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ ๋์ ์์ค์ ๊ตฌ์ฑ ๋ฐ ์คํ์ผ ๋๋ ์คํ์ผ์ํธ ์กฐ์์ ์ํด ์์ฝ๋์ด ์์ต๋๋ค. ์ฅ์น๋ณ ์กฐ๊ฑด( @media
)์ ์๋ตํฉ๋๋ค.
๊ฒ๋ค๊ฐ, ๋๋ ๋ ๋์ ์์ด๋์ด๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค. ์คํ์ผ๋ง์ at-rules๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ผํ ๊ธฐ๋ฅ์ ๋ํด ๋ ๊ฐ์ at-rules๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ค๋ฅธ ๊ฒ์ ๋๋ค. ๋ฌผ๋ก , ๊ทธ๊ฒ์ ๋ชจ๋ ๋ชฉํ์ ๋ฌ๋ ค ์์ต๋๋ค. ์คํ์ผ์ ๊ฐ์ธ์ ์ผ๋ก ๊ฑด๋๋ฆฌ์ง ์๊ณ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์กฐ์ํ๋ ค๋ ๊ฒฝ์ฐ ํ์๊ฐ ์ ํํ๊ธฐ ๋ ์ฌ์ธ ์ ์๋ ๋ ๋ํ๊ณ ๋ถ๋ช ํ ๋ฌธ๋ฒ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ง๋ ์ด์ ์ด ์์ ๊ฒ์ ๋๋ค. Stylus๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ผ๋ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ด ์ ๋ฆฌํ ์ด์ ์ ๋ํ ๊ทํ์ ๊ฒฌํด๋ฅผ ๋ฃ๊ณ ์ถ์ต๋๋ค.
"extend sth"๋ "match sth"์ ๊ฐ์ง ์์ต๋๋ค. ์ ํ์๊ฐ ํด์ผ ํ๋ DOM ๊ตฌ์กฐ์ ๋ํด์๋ ์๋ฌด ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ณ์. nth
_something_์ด ์๋ ์์ฌ ํด๋์ค๋ CSS ์ฌ์์์ " ๊ตฌ์กฐ์ " ์์ฌ ํด๋์ค๋ก ์ค๋ช
๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์์ฌ ํด๋์ค์๋ "๋์ ", "๋ถ์ ", "๋์", "๊ณต๋ฐฑ", "UI ์์ ์ํ" ๋ฐ "์ธ์ด"์ 6๊ฐ์ง ์ ํ ์ด ์์ต๋๋ค. CSS ์ฌ์์ด ์ค์ ๋ก "ํ์ฅ" ๊ธฐ๋ฅ์ ์ค๋ช
ํ๋ค๋ฉด "๋ถ์ "๊ณผ "ํ๊ฒ" ์์ฌ ํด๋์ค ์ฌ์ด์ ๋ฒ์ฃผ๋ก ๋งค์ฐ ์ฐ์ํ๊ฒ ์๋ฆฌํ ์ ์์ต๋๋ค.
์์ฌ ํด๋์ค๋ ๋ฌธ์ ํธ๋ฆฌ์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ์ ํ์ฉํ์ง๋ง ํ์ฅ ๊ธฐ๋ฅ์ ์ต์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์๋๋๋ค.
์์ ํ ํ๋ ธ๋ค
๋ค๋ฅธ ๋ชจ๋ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํฉ์น ๊ฒ๋ณด๋ค ๋ ํฐ ์ปค๋ฎค๋ํฐ๋ ์๋ชป๋ ์ ์์ต๋๋ค. ๋ ๋ฌด์จ ํ ๋ง์ด ์์ต๋๊น?
@hax - :extend
์ค๋ ๋์์ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์ฒ๋ผ ์์ ๋ง์ ์๋ฃจ์
์ ์ ์ํ๋ฉด ๋ง์ ์๋ ์กฐ๋กฑ ์ด ๊ต์ก์ ์ธ ํ ๋ก ์ผ๋ก ๋ฐ๋ ์ ์์ต๋๋ค. ๊ฒฝํ์ด ํ๋ถํ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ LESS๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์ฌ์ฉ์ ์ฌ์ด์์ ๋ช ์ฃผ ๋์ ๋ค์ํ ์ ์๊ณผ ์๊ณ ๋์ :extend
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ง์กฑ์ค๋ฌ์ด ์๋ฃจ์
์ ๋๋ฌํ์ต๋๋ค. ๋ ๋์ ์ ์์ด ์์ผ๋ฉด ์ ๋ฅผ ๋ฏฟ์ผ์ญ์์ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ท์
๋๋ค.
@jonschlinkert ์ ์ถ๊ฐํ๋ ค๋ฉด .this:not(.that) { }
๋ฐ .this:matches(.that) { }
๋ฐ .this:extend(.that) { }
๊ฐ ๋ฒ์ฃผ์ ์ผ๋ก ์ ์ฌํฉ๋๋ค. ์ฆ, "์ ํ์ 'this'๊ฐ ์ฃผ์ด์ง๋ฉด ํน์ ๋ฐฉ์์ผ๋ก ์ ํ์ 'that'๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค." LESS๋ ์ข
์ข
CSS์ ๋์
๋ ๊ฐ๋
๊ณผ ๊ตฌ๋ฌธ์ ํ์ฅํ๊ธฐ ๋๋ฌธ์ ์ธ์ด์ ๊ฝค ๋
ผ๋ฆฌ์ ์ธ ํ์ฅ์
๋๋ค. ์ฐ๋ฆฌ๋ CSS ์ฌ์์ ์ธ์ฌํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ทธ ํน์ฑ์ ๋ฐ์ํฉ๋๋ค. ๊ฐ๋
์ ์ด์ํ ์ ์ด ์์ผ๋ฉด CSS์์ ๋จผ์ ์์๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ ๋ฏน์ค์ธ ๊ฐ๋์์ "AND"๊ฐ "and"๋ผ๋ ๋จ์ด๋ก ํ์๋๊ณ "OR"์ด ์ผํ๋ก ํ์๋๋ ์ด์ ์
๋๋ค. ์๋ํ๋ฉด ์ด๊ฒ์ด ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉํ๋ CSS๋ฅผ ์์ ํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ผ CSS๋ฅผ ์์
ํ๊ธฐ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค๊ณ CSS ์์ฑ์์๊ฒ LESS๋ฅผ ์์ ํ ์น์ํ๊ฒ ๋ง๋๋ ๊ฒ์
๋๋ค. :extend
๊ฐ ๊ทธ ์์
๋๋ค. :not
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๋ฉด :extend
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๋ค.
์ค์ฒฉ๋ ๊ดํธ๋ฅผ ํผํ๊ณ ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ์ ๋ ์ฝ๊ฒ ํ์ฅํ๊ธฐ ์ํด ๋ "์์์ " ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์ค๋๋ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋ผ๋ฉํธ๋ฆญ ๋ฏน์ค์ธ์ ์ฌ์ฉํฉ๋๋ค.
.square {
.border-radius(9px);
}
๋ค์๊ณผ ๊ฐ์ด ๋ฏน์ค์ธ์ ํ์ฅํ๋ ๋์ (์ผ๋ฐ ํด๋์ค๋ฅผ ํ์ฅํ ์ ์์):
.square {
&:extend(.border-radius);
}
๋ค์๊ณผ ๊ฐ์ด ํ์ฅํ ์ ์์ต๋๋ค.
.box {
.border-radius:extend(9px);
}
.square {
.border-radius:extend(9px);
}
.rectangle {
.border-radius:extend(4px);
}
์ฐจ์ด์ ์ "extended mixin"์ด ๊ดํธ ์์ ํ์ฅํ ํด๋์ค๋ฅผ ๋์ดํ๊ณ ์ค๊ดํธ๋ก ์ ์ ํ๊ธฐ ๋ธ๋ก์ ์์ํ๋ ๋์ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ๋๋๊ณ ๊ดํธ ์์ ๊ฐ ๋๋ ๊ฐ์ ์ ์ธํ๋ค๋ ๊ฒ์
๋๋ค. .border-radius:extend(9px);
.border-radius:extend(.some-class) {}
. IMHO, ์ด๊ฒ์ LESS์ ๊ฐ์ฅ ๋ฉ์ง ๊ธฐ๋ฅ ์ค ํ๋์ธ ์์์ ๋ฏน์ค์ธ( .border-radius;
)๋ณด๋ค ๋ ๋ฏธ๋ฌํฉ๋๋ค. ๋ค์ IMHO์
๋๋ค.
๋ ๋๋ง๋ ์ถ๋ ฅ์์ โโ"ํ์ฅ๋ ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ"์ ๋ค์๊ณผ ๊ฐ์ด ์๋ ๋ฏน์ค์ธ ์์น์ ๋ ๋๋ง๋ฉ๋๋ค.
.box,
.square {
-webkit-border-radius: 9px;
-moz-border-radius: 9px;
border-radius: 9px;
}
.rectangle {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.some-other-class,
.another-class,
.and-another {
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
}
๊ทธ๋์ ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ด๊ฒ์ ์ข์ํฉ๋๋ค. ์ ํ๊ธฐ ๋ธ๋ก ๋ด๋ถ์ "์ ์์ ์ธ" ํ์ฅ ๊ตฌ๋ฌธ์์ ์ถฉ๋ถํ ๋ฒ์ด๋์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ถฉ๋ถํ ๋ช ํํ๊ฒ ํ ์ ์๊ณ , ๋ฌด์์ ๊ณผ๋ํ๊ฒ ์ค๋ช ํ ํ์๊ฐ ์๋ ๊ธฐ์กด์ ์ ์ ๊ท์น์ ๋ฏธ๋ฌํจ๊ณผ ํจ๊ป ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋น์ ์ ์ฝ๋์์ ๋ฌ์ฑํ๋ ค๊ณ ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ํ์คํ ๋ด ๊ฐ์ธ ์์๋ฆฌ์คํธ์ ๋งจ ์์ ์์ต๋๋ค.
์๋ ์์ฒญ์์ ์ ๊ณตํ clearfix ์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ ๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
.clearfix() {
// ...
}
.navbar {
.clearfix:extend(); // instead of &:extend(.clearfix());
}
.banner {
.clearfix:extend();
&:extend(.some-class); // "implicit mixin" being extended
}
๋๋ ๋น์ ์ด ์ด๊ฒ์ ๊ฐ์ง๊ณ ๊ฐ๋ ๊ณณ์ ์ข์ํฉ๋๋ค. ๋ ์น์ํ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ด _existing_ mixin ๊ตฌ๋ฌธ ๋์ :extend
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
.box {
.border-radius(9px):extend;
}
.square {
.border-radius(9px):extend;
}
.rectangle {
.border-radius(4px):extend;
}
:extend
๋ค์ ๊ดํธ๋ฅผ ์๋ตํ๋ฉด ๊ธฐ์กด ํ์ฅ ๊ตฌ๋ฌธ๊ณผ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
๋๋ ์ด๊ฒ์ผ๋ก ์ด๋ค ์ ์ผ๋ก๋ ๊ฐ ์ ์์ง๋ง ํ์ฅ ๊ตฌ๋ฌธ๊ณผ ์ผ์นํ๊ธฐ ๋๋ฌธ์ .border-radius:extend(9px);
์ ํธํฉ๋๋ค. IMO๋ ์ฌ์ ํ ๋ฏน์ค์ธ์ด์ง๋ง ๋งค๊ฐ ๋ณ์/๊ฐ์ด ํ์ฅ๋๊ณ ์์์ ์๋ฏธํฉ๋๋ค. ์ค๋ช
ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ถ๋ ฅ์ด "๊ทธ๋ฃนํ"๋๋ ์ด์ .
@jonschlinkert - ์ด ์์ ์์ ์ ๋ ๊ทํ์ ์๊ฒฌ์ ๋งค์ฐ
@DesignByOnyx ์น์ ํ ๋ง์ ๊ฐ์ฌํฉ๋๋ค. ๋น์ ์ด ๋งํ๋ ๊ฒ์ ๋ง์ ์๋ฏธ๊ฐ ์์ต๋๋ค. extends (Less)์ "๋ ์ฆ"๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
.this:extend(.that) {}
๊ทธ๋์ ๋น์ ์ ์์ ์ ๋ด ์์ ์ ๊ฒฌํด์ ์ผ์นํฉ๋๋ค. @matthewdl ๋๋ @lukeapage ๋ ์ค ํ๋๊ฐ ์ด์ ๋ํ ๊ฒฌํด/์๊ฒฌ์ด ์์ต๋๊น? ๋ ๊ตฌ๋ฌธ ๋ชจ๋(์๋ง๋ ๋ค๋ฅธ ๊ตฌ๋ฌธ๋) ์๋ํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋ ๊ตฌ๋ฌธ ๋ชจ๋ "๋ฏธ๋ ๋ณด์ฅ"์ ์ค์ ์ ๋์ง ์์์ผ๋ฏ๋ก ๋ ์ค ํ๋์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ์ผ์ด๋๋ ๊ฒ์ ๋ณด๊ณ ์ถ๋ค. ๋๋ ๋ฏน์ค์ธ์ ํ์ฅํ๋ ๊ฒ์ด Less๋ฅผ ์ํ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ํ์ฌ ์๊ฐํ ์ ์๋ ์ด๋ค ๋ค๋ฅธ ๊ธฐ๋ฅ๋ณด๋ค DRY ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋ ๋ง์ ์ผ์ ํ ๊ฒ์ด๋ค.
Less ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก "์ฌ๋ฐ๋ฅธ ์์ ์ ์ํ"ํ ์ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฆ, ๋ด ์ฝ๋์ ์ด ๋ฏน์ค์ธ์ ์ ์ธํ๋ค๋ฉด:
.someMixin {
color: red;
}
๊ทธ๋ฐ ๋ค์ ๋์ค์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
#someElement {
.someMixin;
}
์ปดํ์ผ๋ฌ๊ฐ ์ด Less ์ฝ๋๋ฅผ ์ด CSS์ ์ต์ ํํ ๋งํผ ์ถฉ๋ถํ ๋๋ํ ์ ์๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
.someMixin,
#someElement
{
color:red;
}
๋ด๊ฐ ์ฌ์ฉ์๋ก์ ์ด ๋์์ ์ป๊ธฐ ์ํด ์๋์ผ๋ก :extens ํค์๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ปดํ์ผ๋ฌ๋ ์ด ์ต์ ํ๊ฐ ์ํ๋ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ณ ์ํํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ๋๋ํด์ผ ํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก, ๋๋ this :Extended ์์ด๋์ด๊ฐ ํผ๋์ค๋ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. "ํ์ฅ" ํค์๋์ ์ ์ฒด ๊ฐ๋ ์ "์ด X์ A, B ๋ฐ C๋ฅผ ์ถ๊ฐํ์ญ์์ค."๋ผ๋ ์๋ฏธ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ปจํ ์คํธ์์ ํ์ฅ์ ์ฌ์ ์ํ ๊ฒ์ ์ ์ํฉ๋๋ค. "์ด X๋ ์ค์ ๋ก Y์ ๊ฐ์ผ๋ฏ๋ก Y์ X๊ฐ ๊ฐ๋ค๊ณ ์ ์ธํ๊ณ ํ ๋ฒ๋ง ์ธ ์ ์์ต๋๋ค." ์ด๊ฒ์ ๋ฌด์ธ๊ฐ๋ฅผ "ํ์ฅ"ํ๋ค๋ ํ์ค ๊ฐ๋ ์ ์๋ฐฐ๋ฉ๋๋ค.
๋ค, ์ ๋ ์์ ์ ๋๊ฐ์ ์๊ฐ์ ํ๊ณ ํฌ์คํ ์ ํ๋ ค๊ณ ํ๋๋ฐ ์๊ฐํด๋ณด๋ ์๋์ผ๋ก ๋ฏน์ค์ธ์ "๋์ ํ์ฅ"์ ์ ์ฉํ๋ ๊ฒ์ Less.js์์๋ ๋๋ฌด ๋ ๋จ์ ์ด๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ํนํ ์ ํ๊ธฐ ์์(ํ์ฅ)์ด ์ฝ๋ ์ถ์์ ๋งค์ฐ ์ ์ตํ ๋ฉ์ง ๊ฐ๋ ์ด์ง๋ง ์ด ๊ธฐ๋ฅ์ ๋ํด ์ฝ์ ๋๋ถ๋ถ์ ๋ถ๋ง ์ฌํญ์ ์ฝ๋๋ฅผ ํตํด ๋น์งํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ์ถ์ํ ๊ณ์ธต์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฌธ์ ๊ฐ ์์ ๋ ๋๋ฒ๊ทธํฉ๋๋ค.
ํ๋ฅญํ ์ฌ๋๋ค์ ๋น์ทํ๊ฒ ์๊ฐํ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ๊ทธ ์์ด๋์ด์ ๋ฐ๋ ํฌํ๋ฅผ ํฉ๋๋ค. ์๋ํ๋ฉด) extend
๊ธฐ๋ฅ์ด ์์ ํ ์์ ๋๊ณ ์ฌ์์ด ๋ ์์ ํด์ง ๋๊น์ง "์ผ๋ฐ" ๋ฏน์ค์ธ์ ์ ํ ์๋ง์ผ๋ก ๋ง๋ค์ด์๋ ์ ๋๊ธฐ ๋๋ฌธ์
๋๋ค. b) ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ค์ค๋ก ์ด ์์ฒญ์ ํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ c) ์ข
์ข
์ํฉ์ด ๋๋ฌด ๋ช
๋ฐฑํ๊ณ ์๋ ค๋๊ฐ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ ๋ฏน์ค์ธ์ ๋ํด ์ด ์ ์์ ์ต์ํ ๊ตฌํํ๊ธฐ ์ด๋ ต๊ณ ๊ตฌํํ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ ์๋ ์์ง๋ง ๊ฐ๋ฐ์๋ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ๋ชจ๋ "mixin ํต"์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด, ๊ทธ๋ค์ ์๊ฒ ๋์๊ณ ์ฌ๋ํ๊ฒ ๋์์ต๋๋ค.
:extents() ๊ตฌ๋ฌธ์ ์ฌ์ ํ โโ์ง๊ด์ ์ด์ง ์๊ณ ์๋ก์ด ์ฌ์ฉ์์๊ฒ ์ค๋ช ํ๊ธฐ ์ด๋ ค์ด ๋งค์ฐ ์ํฌ๋ฅธ ํดํน์ ๋๋ค.
๋ ๋์ ์๋ฃจ์ ์ ์ฌ์ฉ์๊ฐ ์ ์ ํ ์ถ๋ ฅ ์คํ์ผ(์์ถ, ์ต์ ํ ๋ฑ)์ ์ ํํ์ ๋ ์์์ ์ค๋ช ํ ๋๋ก ์ปดํ์ผ๋ฌ๊ฐ CSS๋ฅผ ์๋์ผ๋ก ์ต์ ํํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์์ถ๋์ง ์์ ์ถ๋ ฅ ์คํ์ผ์ ์ ํํ๋ฉด ์ปดํ์ผ๋ฌ๋ ์ด๋ฌํ ์ต์ ํ๋ฅผ ํผํ๊ณ ๋ ์ ์ DRY ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
๋ํ ์์ค ๋งต์ ์ฌ์ฉํ์ฌ ๋๋ฒ๊น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. Less mixin์์ ๊ฐ์ ธ์จ ์ปดํ์ผ๋ CSS์ ์์น๋ฅผ โโ์ฝ๊ฒ ์ง์ ํ ์ ์์ต๋๋ค.
@bdkjones ๋ ์ฝ๋์์ ์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์๊ณผ ํจ๊ป "CSS ์๋ ์ต์ ํ"์ ๋ํ ์๋ก์ด ๊ธฐ๋ฅ ์์ฒญ์ ์์ฑํ์ญ์์ค. ์ด๋ฐ ์ ๋ ฅ์ ์ธ์ ๋ ํ์์ ๋๋ค.
์์ ์ ์์์ด! ๋๋ ๋์ ๋ง์ง๋ง ์ฝ๋ฉํธ์์ ์์ฃผ ๊ฐํนํ ๊ฒ์ ์๋ํ์ง ์์๋ค; ๋๋ ๋๋๋ก ๋์ทจ๋๋ค.
์ฝ๋์ ๊ดํด์๋ CodeKit์ผ๋ก ์์ ํ ๋ฐ๋น ์ ์ ๊ฐ์ ๋๋ค. ๋๋ ๋ํฌ๋ค์๊ฒ ์ธ์ด๋ฅผ ํด์ํ๊ฒ ํด!
๋ณ๋ง์์ ์! ์ ๋ง๋ก, CodeKit์ ์ฐธ์ฌํ๊ณ ์๋ ๊ฒ์ ๋ณด์๊ณ ๊ณ์ํด์ ์๊ฒฌ์ ์ฃผ์ จ์ผ๋ฉด ํฉ๋๋ค. ๋ชจ๋ ๊ธฐ๋ฅ์ด ๋ชจ๋ ์ฌ๋์ ๋ง์กฑ์ํค๋ ๊ฒ์ ์๋์ง๋ง ํผ๋๋ฐฑ๊ณผ ๊ฐ๋ ฅํ ์๊ฒฌ์ด ๋ฐํด๋ฅผ ๋๊ฒ ๋ง๋๋ ์ ์ผํ ๊ฒ์ ๋๋ค!
@bdkjones ๋ฌธ์ ๋ ์บ์ค์ผ์ด๋์ ๋๋ค. ์ฌ์ฉ ์ฌ๋ก์์๋ ์๋ํ์ง๋ง ์ ํ๊ธฐ๋ฅผ ๋ฎ์ด์ฐ๋ ์ ์ธ์ ๋ฐฉ์งํ๋ ๋ฌธ์์์ ์ ํ๊ธฐ๋ฅผ "๋ ์ผ์ฐ" ์ด๋์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํ๊ธฐ ๊ทธ๋ฃนํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง๋ ๋ชปํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์์ ๋ฐ์ ํ mixin ํ์ฅ ๊ตฌ๋ฌธ์ ๋ํ ๊ทํ์ ์ง์ ์ ๋์ํฉ๋๋ค. Selector X๋ Selector ๋๋ mixin Y๋ฅผ ํ์ฅํด์ผ ํ๋ฏ๋ก ์ด์ํ๊ฒ ๋ณด์ ๋๋ค.
.border-radius(9px):extend;
๋๋ ์ฐ๋ฆฌ๊ฐ ํ์ฅ ๊ตฌ๋ฌธ์ ์๋ชป ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์กด์ฌํ๋ ํ์ฅ ๊ตฌ๋ฌธ์ด ๋ฏน์ค์ธ์ ๋ง์ง ์์ผ๋ฉด(์๋ฒฝํ๊ฒ ๊ทธ๋ด๋ฏํฉ๋๋ค), @bdkjones๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฒ์ฒ๋ผ ์์ ๋ฅผ ๋ง๋๋ ๋ฐฉ์์ผ๋ก ํ์ฅ ๊ตฌ๋ฌธ์ ํ์ฅํ๊ธฐ๋ณด๋ค๋ ๋ฏน์ค์ธ์ ๋ํ ์ฌ๋ฐ๋ฅธ ๊ตฌ๋ฌธ์ ์ฐพ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฐ.
๋๋ ์ฐ๋ฆฌ๊ฐ ํ์ฅ ๊ตฌ๋ฌธ์ ์๋ชป ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๋์ํ์ง ์๋๋ค. ์๋ํ๋ฉด ์ฌ์ฉํ์ญ์์ค. ์ด์ ์์ด ์๋ก์ด ๊ตฌ๋ฌธ์ ๋ง๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋๋ ์ฐ๋ฆฌ๊ฐ ์ ์๋ ๊ตฌ๋ฌธ์ ๋ํ ํ๋ฅญํ ์ ๋ก๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ ์ ๋ค์ ๋ง์ ์์ ๋ท๋ฐ์นจํ๋ ์ด์ ๋ฅผ ์ ์ํ์ง๋ง ์ ์๋ ๊ตฌ๋ฌธ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ๋งค์ฐ ์ฃผ๊ด์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ ์ต๊ทผ์ ๊ทธ ์ง์ ์ ๋ช ๋ฒ ํ๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ฌธ์ด ๋จ์ฉ๋๊ณ ์๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ฅผ ์ค๋ช ํ ์ ์์ต๋๊น? ๋๋ ๊ตฌ๋ฌธ์ด ๋จ์ฉ๋๋ ์์ ์ ์ค๋ช ํฉ๋๊น? ๋๋ "ํ์ฅ" ๊ตฌ๋ฌธ ์์ด ๋ฏน์ค์ธ์ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๊ฐ์ ๊ณต์ ํ์๊ฒ ์ต๋๊น?
์ฌ์ฉ ์ฌ๋ก์์๋ ์๋ํ์ง๋ง ์ ํ๊ธฐ๋ฅผ ๋ฎ์ด์ฐ๋ ์ ์ธ์ ๋ฐฉ์งํ๋ ๋ฌธ์์์ ์ ํ๊ธฐ๋ฅผ "๋ ์ผ์ฐ" ์ด๋์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํ๊ธฐ ๊ทธ๋ฃนํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง๋ ๋ชปํฉ๋๋ค.
...
๋๋ ์ฐ๋ฆฌ๊ฐ ํ์ฅ ๊ตฌ๋ฌธ์ ์๋ชป ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ฅ ๊ตฌ๋ฌธ์ด ์กด์ฌํ๋ ๊ทธ๋๋ก ๋ฏน์ค์ธ์ ๋ง์ง ์๋๋ค๋ฉด(์๋ฒฝํ๊ฒ ๊ทธ๋ด๋ฏํฉ๋๋ค), bdkjones๊ฐ ์ง์ ํ ๊ฒ์ฒ๋ผ ์์ ๋ฅผ ์๋ง์ผ๋ก ๋ง๋๋ ๋ฐฉ์์ผ๋ก ํ์ฅ ๊ตฌ๋ฌธ์ ํ์ฅํ๊ธฐ๋ณด๋ค๋ ๋ฏน์ค์ธ์ ๋ํ ์ฌ๋ฐ๋ฅธ ๊ตฌ๋ฌธ์ ์ฐพ๋ ๊ฒ์ด ์ข์ต๋๋ค. .
์๋์. ๊ทธ๋ ์๋ฌด ๊ฒ๋ ์ง์ ํ์ง ์์๊ณ Less๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ๊ฒ์ ์ด๊ตฌํ์ต๋๋ค. ์ด๊ฒ์ด ๊ทธ์ ๊ฒฐ๋ก ์ด์์ต๋๋ค. ๊ทธ๊ฐ ์ ์ํ ๋ฐฉ๋ฒ์ ์๋ชป ์ธ๋๋์์ง๋ง ์๋๋ ์ข์์ต๋๋ค. ๊ทธ๊ฐ ์๊ฐํ์ง ์์ ๊ฒ์ ๋น์ ์ด ๋ฐฉ๊ธ ์ง์ ํ ํญํฌ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์ฅ์ ์ฌ์ฉํ ๋๋ ์บ์ค์ผ์ด๋๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. mixin ๋์ extend๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ ๋๊ตฌ๋ ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ Less.js๊ฐ ํฉ๋ฆฌ์ ์ผ ๋ ์ฌ์ฉํ๊ฑฐ๋ ๊ทธ๋ ์ง ์์ ๋ ์ฌ์ฉํ์ง ์๋ _not_ ์ ํ๊ถ์ ์ ๊ณตํ๋ ์ด์ ์ ๋๋ค. CSS์ ์ฒซ ๋ฒ์งธ "C"๊ฐ cascading์ ์๋ฏธํ๋ค๋ ์ฌ์ค์ cascade๊ฐ ์ค์ํ์ง ์์ ๋ ์ค๋ณต ์คํ์ผ์ ํตํฉํ๋ ์ด์ ์ ๋ฌดํจํํ์ง ์์ต๋๋ค. ๋ด๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น?
๊ทธ๋์ ๋น์ ์ ๊ฐ์ ์ ๋ช ํํ ํ ์ ์์ต๋๊น? ์ด ๊ธฐ๋ฅ์ ๋ฐ๋ํ์ญ๋๊น, ์๋๋ฉด ๊ตฌ๋ฌธ์ ๋ฐ๋ํ์ญ๋๊น? ๊ตฌ๋ฌธ์ ๋ฐ๋ํ๋ ๊ฒฝ์ฐ ๊ณ์ ์งํ๋๋๋ก ๋ค๋ฅธ ๊ฒ์ ์ ์ํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ์ด์ ๋ํด ์ด๋ ๊ฒ ์ ๋งํ ๊ธฐ๋ฅ์ ์งํ์ ๋ฐฉํดํ์ง ๋ง์๋ค.
์ด ๊ธฐ๋ฅ์ ๋ฐ๋ํ์ญ๋๊น, ์๋๋ฉด ๊ตฌ๋ฌธ์ ๋ฐ๋ํ์ญ๋๊น?
๋๋ ๊ธฐ๋ฅ์ ์ํด, ์ ๋์ ์ผ๋ก. ์ด๊ฒ์ ๋ถ๋ช ํ ๋ฐฉํฅ์ ๋๋ค. ์ด ์ค๋ ๋์์ ๊ตฌ๋ฌธ์ ๋ค์ ๊ฒํ ํ์ต๋๋ค. ๋ช ๊ฐ์ง ์๊ฐ:
์ฒซ์งธ, ์ด๊ฒ์ ๋์๊ฒ ์ด์ํฉ๋๋ค.
.something:extend( .clearfix() ) { }
์ด์ค ๊ดํธ๊ฐ ์ด์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๊ธฐ์กด ํ์ฅ ๊ตฌ๋ฌธ์ ์ถฉ์คํ ์ฑํํ ๊ฒ์ด๋ฏ๋ก ์ถฉ๋ถํ ๊ณตํํฉ๋๋ค. ๊ทธ๋์ ์ ๊ฐ ๋ค๋ฅธ ๊ฒ, ์๋ง๋ ํ์ฅ์ด ์๋ ๋ค๋ฅธ ๊ฒ์ ์นํธํ๊ณ ์์๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋น์ ์ด ์ ์ํ ๊ฒ์ด ์์ต๋๋ค. ๋น์ทํ ์ด์ ๋ก ์๊ฐํฉ๋๋ค.
.border-radius(9px):extend;
...๊ธฐ์กด ํ์ฅ ์ฌ์๊ณผ ๋ฐ๋๋๋ ๊ฒ ๊ฐ์์ ์๋ ๋ฅด๊ธฐ ๋ฐ์์ด ์์์ต๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ๋์๊ฒ ์ค์ฉ์ฒ๋ผ ๋ณด์์ต๋๋ค.
ํ์ง๋ง
๋๋ ๊ฑฐ๊ธฐ์ ์ค์ ๋ก ๋ ๊ฐ์ง ์ต์ ์ด ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ํ๋๋ ๋ฏน์ค์ธ์ ๋ํด ๋ค๋ฅธ ์์ ์ ์ํํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ ๋ฏน์ค์ธ์ ํฌํจํ ๋ชจ๋ ๊ฒ์ ๋ํด ๊ธฐ์กด ํ์ฅ ์ฌ์์ ์์ ํ๋ ๊ฒ์ ๋๋ค.
#namespace {
.box-template {
.subelement {
// we'll add the all flag to extend everything here
}
}
}
.clearfix() {
// a clearfix mixin
}
.text-shadow(@shadow) {
-moz-text-shadow: @shadow;
text-shadow: @shadow;
}
.some .random .selector {
// with properties
}
.mybox {
.clearfix:extend;
#namespace > .box-template:extend !all;
.text-shadow:extend(2px 2px #ff0000);
.some .random .selector:extend;
}
ํ์ง๋ง.... ์ ์ฒด ์ ํ๊ธฐ( .some .random .selector
)๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ชป ์ฝ๊ธฐ ์์ํฉ๋๋ค. .selector์ ํ์ฅ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ "extend"๋ผ๋ ๋จ์ด๋ ์ด ์ ์ธ์์ ์ค์ํ ๋จ์ด์ผ ๋ ๊ธธ์ ์๊ธฐ ์์ํฉ๋๋ค. &:extend()
๋ก ์์ฑ๋์์ ๋๋ ๊ทธ๋ ์ง ์์์ง๋ง(์ฒ์์ ๋ํ๋ฌ๊ธฐ ๋๋ฌธ์), ํด๋น ๊ตฌ๋ฌธ์ ๋ฏน์ค์ธ์ผ๋ก ์ธํด ๋ถํด๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ๋ค์ ์ต์ ์ค ํ๋๋ฅผ ์ ์ํฉ๋๋ค.
// Migrating existing syntax, but ommitting a parens requirement when used with &:
.mybox {
&:extend .clearfix;
&:extend #namespace > .box-template !all;
&:extend .text-shadow(2px 2px #ff0000);
&:extend .some .random .selector;
}
// Adopting something similar to the SASS approach
.mybox {
<strong i="24">@extend</strong> .clearfix;
<strong i="25">@extend</strong> #namespace > .box-template !all;
<strong i="26">@extend</strong> .text-shadow(2px 2px #ff0000);
<strong i="27">@extend</strong> .some .random .selector;
}
๋ฏน์ค์ธ ๋ฐ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ํ์ฅ์ ๋ํ ๋
ผ์์์ :extend
๋ํ ์๋ ๊ตฌ๋ฌธ ์ ๊ทผ ๋ฐฉ์์ด ์ ์ฐํ์ง ์๋ค๋ ์ ์ ๊ฐ์กฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํนํ ๋ค์ค ์ ํ๊ธฐ ๋ฐ ๋ฏน์ค์ธ์ ํ์ฅํ๋ ค๋ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ป๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค :extend right. ๋ฏน์ค์ธ์ "extend"๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํ์ฅ ๊ตฌ๋ฌธ์ ์์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ .border-radius(9px):extend;
๋ฅผ ์ ์ ํ์ง ์์๊ณ .border-radius:extend(9px);
์ ์
๊ทธ๋ฌ๋ ์ด๋ ๊ตฌ๋ฌธ์ด๋ ์ ์๊ฒ๋ ๊ด์ฐฎ์ต๋๋ค. ๋๋ .border-radius(9px) !extend;
๋๋ .border-radius:shamallamadingdongscoobiedoo(9px):extendmyass
(jk)๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๋ฏน์ค์ธ์ ๋์์ผ๋ก ๋ณ๊ฒฝ๋๊ฑฐ๋ ํ์ฅ๋๋ ๊ฒ์ด ์ ํ ์๊ธฐ ๋๋ฌธ์ ์ ์๊ฒ๋ ์ค์ํ์ง ์์ต๋๋ค.
๊ทธ๋์ ๋๋ ๋น์ ์ด ๊ทธ ๋ชจ๋ ๊ฒ์ ํ ํ์์ฑ์ ์ด๋ป๊ฒ ์๊ฐํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋น์ ์ ์๋ง๋ ๋น์ ์์ ์ ์ํด ์ผ์ ์ง๋์น๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ์์ ๊ฒ์ ๋๋ค.
์ด ๊ธฐ๋ฅ ์์ฒญ์ ๋ฏน์ค์ธ์ ์์๋ ์์ฑ์ ๋ฏน์ค์ธ์ ์์น๋ก ๋ณต์ฌํ๋ ๊ธฐ๋ฅ์ ๊ฐ๋ ๊ฒ์ ๋ํ ๊ฒ์ด๋ฉฐ, ํ์ฌ ๋ฏน์ค์ธ ๋์์ผ๋ก ์ด๋ฏธ ์ ํ๋ฆฝ๋ ๊ท์น์ ๋ฐ๋ฅผ ๊ฒ์ด๋ฉฐ, ์ด์ ๋ฏน์ค์ธ๊ณผ ๋์ผํ ๋์ ๊ณผ ์ฐ์ ์์๋ฅผ ๊ฐ์ต๋๋ค. <strong i="14">@import</strong> (reference)
๊ธฐ๋ฅ(btw, ์ฐ์ต๊ณผ ์ฌ๋์์ ๊ฝค ๋ง์ด ์ฌ์ฉํ์ต๋๋ค). ๊ฐ๋จํ ๋งํด์:
2๋
๊ฐ์ ํ ๋ก , > 100๊ฐ์ ๊ฒ์๋ฌผ, ๋ง์ ์ฐ๊ตฌ ๋ฐ @extend
๋ณด๋ค _ํจ์ฌ ๋_ ์ ์ฐํ๋ค๋ ์ฌ๋ก๊ฐ ์ด๋ฏธ ํ์ธ๋ ํ ํ์ฅ ๊ตฌ๋ฌธ์ ๋ํ ํ ๋ก ์ ๋ค์ ์์ํ๋ ค๋ ์ด์ ๊ฐ ํ์คํ์ง ์์ต๋๋ค
Btw, ๋๋ ๋น์ ์ด ์ฌ๊ธฐ์ ๋ฌด์์ ์๋ฏธํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ ์ฒด ์ ํ๊ธฐ(.some .random .selector)๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ชป ์ฝ๊ธฐ ์์ํฉ๋๋ค. .selector์ ํ์ฅ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ "extend"๋ผ๋ ๋จ์ด๋ ์ด ์ ์ธ์์ ์ค์ํ ๋จ์ด์ผ ๋ ๊ธธ์ ์๊ธฐ ์์ํฉ๋๋ค.
๊ทธ๊ฒ์ด ์ง๊ธ ์ค์ ๋ก ์๋ํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ด ํผ๋์ค๋ฝ๋ค๋ ๊ฒ์ ๋์ํ์ง ์์ต๋๋ค. "CSS ๊ฐ๋ฐ์๋ ๊ทธ๋ฃนํ๋ ์ ํ๊ธฐ์ ์๋ ๋ฐฉ์์ ๋ชจ๋ฆ
๋๋ค"๋ผ๊ณ ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ง ์์ต๋๊น? :hover
๋๋ :after
์ด๋ป์ต๋๊น? CSS ๊ฐ๋ฐ์๋ ์ด๊ฒ์ ์ ์์๋ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ์์ฌ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
.some .random .selector:extend(.something) {}
๋๋ .some .random .selector
๊ฐ ์๋ .selector
.some .random .selector
์ธ ์ ํ์์ ํ์ฅ์ ์ ์ฉํ๊ฑฐ๋ ์ ํ์ ๋ธ๋ก ์์ ๋ฃ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ ๊ณตํ๋ ์ ์ฐ์ฑ์ ์ข์ํฉ๋๋ค.
๋ฏน์ค์ธ ๋ฐ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ํ์ฅ์ ๋ํ ๋ ผ์
๋ฏน์ค์ธ์ ํ์ฅํ๋ฉด ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๊ธฐ ๋๋ฌธ์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋ฌธ์ ๋ฅผ ๋ซ์์ต๋๋ค. "๋ชจ๋ ๋๋ก๋ _____๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค" ํ์ฅ ๋ฏน์ค์ธ. ;-)
์ ๋ :extend( .some-mixin() )
์์ ์๋ ๊ดํธ ์์ ์๋ ๊ดํธ๊ฐ ๊ทธ๋ค์ง ์ ๊ฒฝ์ฐ์ด์ง ์๋๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ํนํ :extend( .some-selector )
๊ฐ ์ด๋ฏธ ์ค์ ๋์ด ์๊ณ ๊ตฌ์ญ์ง๋๋ ๊ฒ์ผ๋ก ๋
ผ์๋์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋๋ ์ด์ค ๊ดํธ๊ฐ ์ด๋ค ์๋ฏธ์์๋ ์ด์์ ์ด์ง ์๊ณ ๊ทธ๊ฒ์ด ์ข ์ด์ํ๊ฒ ๋๊ปด์ง๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฏน์ค์ธ๊ณผ ์ ํ๊ธฐ๊ฐ "ํ์ฅ"์ด๋ผ๋ ์ธก๋ฉด์์ ๋์ผํ๊ฒ ์ทจ๊ธ๋๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
header {
.some-selector;
.some-mixin;
.some-mixin();
}
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ํ์ฌ ๊ทธ๋ค์ง ๋์๊ฒ(๋๋ ์ ํ์ ์ผ๋ก) ๋๋ผ์ง ์์ต๋๋ค.
header {
&:extend( .some-selector );
&:extend( .some-mixin );
&:extend( .some-mixin() );
}
๊ทธ๋ฌ๋ ๋๋ mixin๊ณผ selector๊ฐ "ํ์ฅ"์ด๋ผ๋ ์ธก๋ฉด์์ ๋์ผํ๊ฒ ์ทจ๊ธ๋๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๊ทธ ์ ์ ๋ํด ๊ฐ์ ์ ์ฅ์ด๋ค.
2๋ ๊ฐ์ ํ ๋ก , > 100๊ฐ์ ๊ฒ์๋ฌผ ์ดํ ํ์ฅ์ ๋ํ ๊ตฌ๋ฌธ์ ๋ํ ํ ๋ก ์ ์ ๋ค์ ์์ํ๋ ค๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํ๊ณ ์ถ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์๋, ๋ ์ํ์ง ์์. ๊ทธ๋ฌ๋ ๊ทธ ๋น์ ์ฐ๋ฆฌ๋ ๋์ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ผ์ข ์ ๋ฏน์ค์ธ์ ์์์ต๋๋ค. ์ด ๊ตฌ๋ฌธ์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ์๋ํ๋์ง ํ์ ํ ์ ์๋์ง ๋ฌป๊ณ ์ถ์ต๋๋ค. ๋ฌธ์ ๊ฐ ์๋ํ์ง ์๊ฑฐ๋ ์ผ๋ถ ์ฉ๋์ ๋ถ์ ์ ํ๋ค๊ณ ์๊ฐ๋๋ฉด ์ง๋ฌธ์ ๋ค์ ๋ฐฉ๋ฌธํ๋ ๋ฐ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. LESS๋ ์ฐ์ฅ ์์ด ์ค๋ ์ ๋ถํฐ ์กด์ฌํด ์์ต๋๋ค. ๋นจ๋ฆฌ ๋๋ด๋ ๊ฒ๋ณด๋ค ์ ๋๋ก ํ๋ ๊ฒ์ด ๋ ์ค์ํ๋ค.
๊ทธ๋์, ์ฐ๋ฆฌ๋ ์ด๊ฒ์ผ๋ก ๊ด์ฐฎ์ต๋๊น?
.mybox {
&:extend(.clearfix());
&:extend(#namespace > .box-template all);
&:extend(.text-shadow(2px 2px #ff0000));
&:extend(.some .random .selector);
}
parens ๋ด๋ถ์ parens - :extend( .some-mixin() ) - ํนํ :extend( .some-selector ) ๊ฐ ์ด๋ฏธ ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ์ ๊ฒฝ์ฐ์ง ์์ต๋๋ค.
๊ทธ๋ ์ต๋๋ค. ์ฌ์ค ์ฐ๋ฆฌ๋ ์ด๋ฏธ Less.js์์ ์ด์ค ๊ดํธ์ ๋ํ ์ ๋ก๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ธฐ์กด ํ์ฅ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ์ค์ ๋ ์ ๋ก๋ ์ฐ๋ฆฌ๊ฐ mixin์ผ๋ก ์ ์ํ๋ ๊ฒ๋งํผ ๋์ ์ฝ์ง ์์ต๋๋ค. ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
.one:nth-child(5) {
color: red;
}
// We can extend psuedos
.two:extend(.one:nth-child(5)) {
background: blue;
}
// And attributes
.two:extend(.one, [hidden]) {
width: 2px;
}
๊ธฐ์กด CSS ๊ตฌ๋ฌธ ์์ ์ค์ฒฉ๋ ๊ดํธ๋ฅผ ์ฐพ์ ์๋
๊ทธ๋์ ์ฌ๊ธฐ์ _nested parens_ ๋ฐ _nested pseudo-class_ ๊ตฌ๋ฌธ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ ๋ํด ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. IMO๊ฐ ๋ถ๋ช ํฉ๋๋ค.
๊ทธ๋์ ์ ๋ @DesignByOnyx ์ ๋์ํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ ์๋ ์ ์์ด์๊ณ ์ด๋ค ์ด์ ๋ก ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ๋ถ์พํด ๋ณด์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ํ์ฅ์ ๊ดํธ ์์ ์๋ ์ผ๋ฐ ์ด์ ๋ฏน์ค์ธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ต์ ์ ๋คํ๊ณ ์์ต๋๋ค.
์ฌ์ค, ์๋ ๊ตฌ๋ฌธ์ ์ฌ๋ฌ ์ผํ๋ก ๊ตฌ๋ถ๋ ํด๋์ค ๋๋ ๋ฏน์ค์ธ์ ํ์ฅํ ์ ์์ต๋๋ค.
.banner {
&:extend(.clearfix(), .border-radius(4px), .alert, .navbar-fixed-top, [hidden]);
}
๊ทธ๊ฒ์ ์์ ์ ์ํํ๊ณ ๋นก๋นกํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ถ๋ง์ด ์์ต๋๋ค.
๊ทธ๋์, ์ฐ๋ฆฌ๋ ์ด๊ฒ์ผ๋ก ๊ด์ฐฎ์ต๋๊น?
๋ค. ์์ ํ. ๊ทธ๊ฒ์ ์ด๋ฏธ CSS์ ์๋ ๋ฐฉ์์ ๋๋ค. ๊ทธ๋์ ์ํด์.
๋ค. ์์ ํ. ๊ทธ๊ฒ์ ์ด๋ฏธ CSS์ ์๋ ๋ฐฉ์์ ๋๋ค. ๊ทธ๋์ ์ํด์.
๊ทธ๋์ ๊ทธ๊ฒ์ ํต๊ณผํด์ผํฉ๋๋ค.
์ง๋ฌธ, ํ์ฌ :extend์์ ๋ค์ค ์ ํ์๋ฅผ ์ง์ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ "all" ํค์๋๊ฐ ํด๋น ํ์์ ๋ง๋ ์์น๊ฐ ์ด๋์ธ์ง ๊ถ๊ธํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์๋ง๋ ๋ณ๋์ ๋ฌธ์ ์ ์ผ๋ถ์ผ ๊ฒ์ ๋๋ค.
๋น์ ์ ๋น์ ์ ๊ฒฝ์ฐ๋ฅผ ๋ง๋ค์์ต๋๋ค, Mr. Schlinkert. ๋น์ ์ ๋ฒ์ ๊ฐ์ด์ผ ํ๋ค. ;)
ํ์ฌ :extend์์ ๋ค์ค ์ ํ์๋ฅผ ์ง์ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ ;-) ๊ด๋ฒ์ํ๊ฒ ํด์์ต๋๋ค. ๋ฐฉ๊ธ ์ ์ ์ด๋ ๊ฒ ํ์ต๋๋ค.
.global-nav {
// Extend and override bootstrap styles
&:extend(.navbar, .navbar-fixed-top all, .navbar-inverse); // this works, and it's pretty handy
&.hidden:extend(.navbar.hidden) {}
&.visible:extend(.navbar.visible) {}
&:hover {
background: lighten(@brand-primary, 5%);
}
.navbar-brand {
padding-left: 20px;
}
.navbar-nav > .active > a {
&, &:hover, &:focus {
background-color: darken(@brand-primary, 5%);
}
}
}
๋น์ ์ ๋น์ ์ ๊ฒฝ์ฐ๋ฅผ ๋ง๋ค์์ต๋๋ค, Mr. Schlinkert. ๋น์ ์ ๋ฒ์ ๊ฐ์ด์ผ ํ๋ค. ;)
Pfft, lol ์ค ๊ทธ๋ง!
์ด ๊ตฌ๋ฌธ์ ์๊ฐํ๋ค๊ณ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค.
.foo {
&:extend( .bar() );
}
์ค๋ํ๋ค. ์ ๋ ๊ดํธ๊ฐ ์ ํ ์ด์ํ์ง ์์ต๋๋ค.
ํ์ง๋ง ์ฃผ๋ก ์ ๊ฐ ์ข์ํ๋ ์ ์ฒ๋ฆฌ๊ธฐ์์ SASS์์ ์์ ํ๊ณ ์๋ ๋ฉ์ง ์์ ์ ๋ชจ๋ ์ํํ ์ ์๋๋ก ์ฌ๋ฌ๋ถ์ด ์๋๋ฌ ์ฃผ์ จ์ผ๋ฉด ํฉ๋๋ค.:D
์๊ฒฌ์ ๋ณด๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. @mgerring !
+1 ์ด ๊ธฐ๋ฅ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ์ข์ ์ผ์ ๊ณ์ํ์ญ์์ค :)
์๋ณธ ๊ฒ์๋ฌผ๋ก:
.clearfixed {
// stuff
}
.clearfix() {
&:extend(.clearfixed);
}
.navbar {
.clearfix();
}
.banner {
.clearfix();
}
๊ฒ์ํ ๋ ์๋ํ์ง ์์์ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฐ๊ณผ๋ ์ํ๋ ๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
.clearfixed,
.navbar,
.banner {
// stuff
}
@aaronmw , ์, ๊ทํ์ ์์ ๊ฐ ๋์ผํ ์์ ์ ์ํ
์, @seven-phase-max์ ์์ ์ ๋ฐ๋ผ ์ค๋ช ํ๋ ๋ฐฉ์์ผ๋ก ์ํํ ์ ์์ง๋ง ๊ด์ฉ์ ์ด์ง๋ ์์ต๋๋ค.
๋ง์ต๋๋ค. ์ฃ์กํฉ๋๋ค. ์ด์ ์ด ์ค๋ ๋๋ฅผ ๋ ๋ง์ด ์ฝ์๊ณ ์ฐ๋ฆฌ๊ฐ ๋ชฉํ๋ก ํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ํ์ธํ์ต๋๋ค. ๋ด๊ฐ ์ฌ์ฉํ "์ค์ผ๋ ํค" ํด๋์ค๋ ์ปดํ์ผ๋ ์ถ๋ ฅ์์ โโ์ฐ๋ ๊ธฐ์ผ ๋ฟ์ ๋๋ค. .clearfixed ํด๋์ค๋ ๋ฏน์ค์ธ ์ธ๋ถ์์ ๋ช ์์ ์ผ๋ก ์ฐธ์กฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. &:extend(.clearfix()) ๋ ์ด์ ๋์๊ฒ ์๋ฏธ๊ฐ ์๊ณ ๊ฝค ํฅ๋ฏธ์ง์งํฉ๋๋ค. ์ง๊ธ์ CSS๋ฅผ ์ด์ง๋ฝํ๋ ์ค์ผ๋ ํค ํด๋์ค๋ฅผ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์์ ํ๋ฅญํ ํ ๋ก !
:+1:
์ด ๊ธฐ๋ฅ์ ์ธ์ ์์ํ ์ ์์ต๋๊น? OOCSS์ ๊ฐ์ ๊ฐ๋ ์ด "์ถ์ ํด๋์ค"์ ๊ฐ์ ๊ตฌ์ฑ์ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
.a {
color: green;
}
#thing {
.a() {
color: black;
}
}
.b:extend(#thing .a) {} //
.b:extend(.a) {} // and if so is the output wrapped by #thing?
.b:extend(.a()) {} // do I need special format to say extend only that mixin?
๊ฐ์ฅ ์ด๋ ค์ด ๋ถ๋ถ์ ์ค์ ๋ก ์๋ ๋ฐฉ์์ _์ ํํ๊ฒ_ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค.
์ค์ฒฉ/๋ฒ์ ๋ฐ ๋ฏน์ค์ธ ๋ ์ผ๋ฐ ํด๋์ค์ ๋์ฒํ๋ ๋ฐฉ๋ฒ ๊ฒฐ์
๋๋ mixin ํ์ฅ์ ์ด๋ฐ ์์ผ๋ก ํด์ํ๋ ค๊ณ ํ ๊ฒ์
๋๋ค.
.b:extend(.a(1, 2, 3)) {}
๋ ๋ด๋ถ์์ .a(1, 2, 3)
๋ฅผ ํธ์ถํ ๋ค์ ์ผ๋ฐ์ ์ธ ๋ฐฉ์์ผ๋ก ํ์ฅํ๋ 'b' ๋ฒ์์์ ์ต๋ช
์ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ฏน์ค์ธ(์ฆ, ๋จ์ ์ ํ๊ธฐ)์ ๋ง๋๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์๋ํด์ผ ํฉ๋๋ค. ์ฆ, ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
.a(<strong i="11">@a</strong>, <strong i="12">@b</strong>, @c) {
// ...
}
.b:extend(.a(1, 2, 3)) {}
๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
.a(<strong i="16">@a</strong>, <strong i="17">@b</strong>, @c) {
// ...
}
#__anon_a_1_2_3 {.a(1, 2, 3);}
.b:extend(#__anon_a_1_2_3) {}
์ถ๋ ฅ์ #__anon_a_1_2_3์ด ๋ํ๋์ง ์๋๋ค๋ ์ ์ ์ ์ธํ๊ณ . ๋๋ ๊ทธ๋ฌํ ์ ๊ทผ ๋ฐฉ์์ด ํน๋ณํ ๊ท์น์ ๋ฐ๋ช ํ์ง ์๊ณ ๋ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ๋
์ #thing .a
์์ ์ ์ ์ฉํ๋ฉด ๋ค์์ ์ป์ต๋๋ค.
.a {
color: green;
}
#thing {
.a() {
color: black;
}
}
.b:extend(#thing .a) {} // since we do ignore parens on mixin call and have ...
// no plans changing this (?), it should probably create .b {color: black}
.b:extend(.a) {} // there's only one .a in this scope so it's -> .b {color: green}
.b:extend(.a()) {} // same as above -> .b {color: green}
๋ฐ๋ฉด์ "์ ํ์ ๊ดํธ"๋ ์ค์ฉ์ ์ธ ๊ด์ ์์ ๋ณผ ๋ ์์ฃผ ์ฌ์ํ ๊ฒ์ด๋ฏ๋ก ๋ ์๊ฒฉํ๊ฒ ๋ง๋ค๊ณ extend
๋ด๋ถ์ ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ์ ๋ํด ๊ดํธ๋ฅผ ์๊ตฌํ๋ ๊ฒ๋ ๊ด์ฐฎ์ ์ ์์ต๋๋ค. extend
๋ ์ด์จ๋ ์์ ํ ํธํ๋์ง ์์ผ๋ฏ๋ก ์ผ๋ฐ mixin ํธ์ถ ๊ตฌ๋ฌธ์ ์์ํฉ๋๋ค.
๋ฏน์ค์ธ์ ๋์ผํ ์ธ์๋ก ๊ฒฐํฉํฉ๋๊น?
์ด์์ ์ผ๋ก๋ ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ธ๋ชจ์๊ฒ ๋ ๊ฒ์ ๋๋ค. ์:
.b:extend(.a()) {}
.c:extend(.a()) {}
๋ค์์ ์์ฑํด์ผ ํฉ๋๋ค.
.b, .c {color: green}
ํ , ๋ณํฉ์ด ๊ตฌํํ๊ธฐ ๊ฐ์ฅ ์ด๋ ค์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์ค์ฝํ์ ๋๋ค. ์ต๊ทผ #1730์์ ๋ฏน์ค์ธ์ '์๋' ์ค์ฝํ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ณ ํ์ฅ์ '์ ๋'๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ ๊ฐ์ง๋ฅผ ๊ฒฐํฉํ ๋ ์ผ์ข ์ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
.div {color: green}
body {
.div {color: red}
p-a {.div()} // -> body p-a {color: red}
p-b:extend(.div) {} // -> body p-b {color: green}
p-c:extend(.div()) {} // -> ???
}
ํ๋ผ๋ฉํธ๋ฆญ ๋ฏน์ค์ธ์ผ๋ก ์ด ์์ ๋ฅผ ๋ค์ ์์ฑํ๋ฉด ํจ์ฌ ๋ ํผ๋์ค๋ฝ์ต๋๋ค.
์ ๋ ์ง๊ธ์ด ํ๋ฐ ๋ฌผ๋ฌ์์ "ํ์ฅ ๋ฏน์ค์ธ์ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง"๋ผ๊ณ ๋งํ ์ ์๋ ์ข์ ์๊ฐ์ด ๋ ์ ์๋ค๊ณ ๋งํ๊ธฐ ์ํด 2์ผํธ๋ฅผ ์ ์ํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ @donaldpipowitch ๊ฐ ์ฝ๊ฐ์ OOCSS ๋ฅ๋ ฅ์ ๊ฐ์ ธ์จ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค. . ๋ฐ๋ผ์ ํ์ ํด๋์ค("์์ฑ", ์ํ๋ ๊ฒฝ์ฐ)๊ฐ ํด๋์ค ์์ฒด ๋ด์์ ํ์ฅ๋๋ ๋ฐฉ์์ ๋๋ฌด ์ฝ๋งค์ฌ์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๋ "์์ฑ"(์ค์ฒฉ ์ ํ๊ธฐ)์ด ์๋ ํน์ "ํด๋์ค"(๊ตฌ์ฑ ์์)๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
.dog() {
.leg { ... }
.ears { ... }
.fur { ... }
}
์ฌ์ฉ์๊ฐ ๋ค์์ ์ํํ๋ ค๋ ์ํฉ์ ์ด์ ์ ๋ง์ถฐ์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
.dog() {
.leg { ... }
.ears { ... }
.fur { ... }
.tail:extend( .leg() ) {
.toes { display:none; }
}
}
์ด๊ฒ์ IMO์ ํ๋ฆฐ์ง ์ผ์ด์ค ์๋๋ฆฌ์ค์ผ ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์๋ ์ด์จ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ์ ์คํ์ผ์ ์์ฑํด์ผ ํฉ๋๋ค.
.dog() {
.leg, .tail { ... }
.ears { ... }
.fur { ... }
.tail .toes { display:none; }
}
๋ฏน์ค์ธ ํ์ฅ์ 99.8% ์ฌ์ฉ ์ฌ๋ก๋ ๊ฐ๋ฐ์๊ฐ ์๋ ๋์ ์ถ์ ํ ์คํ์ผ๋ก ๊ฐ๋ ์ฐฌ ๋ฐฉ๋ํ LESS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ฐฉ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ๋ ์ฐจ ์์ต๋๋ค.
.clearfix() { ... }
.modal() { ... }
.alert-box() {
&:extend( .modal() );
&.message { ... }
&.warning { ... }
&.error { ... }
}
.grid-wrap() { ... }
.form-input() { ... }
.form-select() { ... }
.button( <strong i="16">@bgColor</strong>, <strong i="17">@textColor</strong> ) { ... }
[... thousands more like this ...]
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ์๋ฌธ ์คํ์ผ์ ์ง์คํ ์ ์์ต๋๋ค.
.page-wrap:extend( .grid-wrap(), .clearfix() ) { ... }
input[type="text"]:extend( .form-input ) { ... }
textarea:extend( .form-input() );
๊ทธ๋ค์ด ์ํ๊ณ "๋ชจ๋ฌ" ์คํ์ผ์ด ์ด ํ๋ก์ ํธ์์ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ต์ข ์ถ๋ ฅ์ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ์ด ์์ ์ ์ํํ ์๋ ์์ต๋๋ค.
.inline-error:extend( .alert-box.error )
์, @DesignByOnyx์ ์์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋์ค์ ๋ ๋ณต์กํ ๊ฒ์ ์์๋ด๋ ๋ฐ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ค, ํ์ฌ๋ก์๋ _๋น๋งค๊ฐ๋ณ์๊ฐ ์๋_ ๋ฏน์ค์ธ ํ์ฅ์ ๋จผ์ ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ์๋ง๋ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์ 80 โ 90%๋ฅผ ์ปค๋ฒํ ๊ฒ์ ๋๋ค(์คํ์ผ์ํธ์ ๋ณด๋ค ๊ฐ์ฒด ์งํฅ์ ์ธ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ ๋ฑ). ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ํจ์น ๋๋ ๋ ๊ฐ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค.
@DesignByOnyx ์ @calvinjuarez ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋์ค์ ์์๋ผ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ด๋ค ์์ผ๋ก๋ ์ฝ๋ฉ๋์ด์ผ ํฉ๋๋ค. ์๋ฃจ์ ์ ๋ฐ์ด๋ค์๋ค๊ฐ ๋์ค์ ๋ณ๊ฒฝํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ๋ธ๋ ์ดํน ์ฒด์ธ์ง๊ฐ ๋์ ๋๋๋ฐ ์ด๋ ์ข์ง ์์ต๋๋ค.
ํ๋ฆฐ์ง ์๋๋ฆฌ์ค๋ฅผ ์ง์ํ์ง ์๋ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ฐํ ์ ์๋ค๋ฉด ๋ํ ๋์ ์์ด ๊ธฐ์ฉ๋๋ค. ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ฃผ์ ํ์ฅ ์ง์์ผ๋ก ๋๋ธ ์ผ์ ๋๋ค(ํ์ํ ๊ฒฝ์ฐ ๋ ๋ง์ ํค์๋๋ก ํ์ฅํ ์ ์์). ๊ทธ๋ฌ๋ ์ง์ ๋์๊ณผ ๋ฐฉ๋ฒ์ ๋ํ ๊ณํ์ด ํ์ํฉ๋๋ค.
์์ ๋งฅ๋ฝ์์ @seven-phases-max, ์ง๊ธ์ ํ๋ผ๋ฉํธ๋ฆญ ๋ฏน์ค์ธ์ ๋ฌด์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ , ๋ณํฉ์ด ๊ตฌํํ๊ธฐ ๊ฐ์ฅ ์ด๋ ค์ธ ๊ฒ ๊ฐ์ต๋๋ค.
- ๊ทผ๋ฐ ํฉ์ณ์ง๋ค? ๋๋ ๊ธฐ์กด ํ์ฅ๊ณผ ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ผ์น ํญ๋ชฉ์ ์ฐพ์ ์ถ๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๋ ํ์ฅ์ ๋ชจ๋ 3๋ฒ์งธ ์์น์ธ mixin์ ๋ฃ๋ ๊ฒ๋งํผ ๋ณํฉํ์ง ์๊ณ ํน์ ํ์ผ๋ก ์ถ๋ ฅ๋ฉ๋๋ค. genCSS์ ๊ฒฝ์ฐ
๋๋ ๋ํ ๋ฒ์์ ๋ํ @seven-phases-max ์ ๋ ๋ฒ์งธ ์์ ๊ฐ ๋๊ตฐ๊ฐ์๊ฒ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฆ์ด ๊ฐ์ ๋ฏน์ค์ธ๊ณผ ๋น ๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ๋ง ์์ผ๋ฉด ๋ฉ๋๋ค.
@lukeapage :+1: ์ฌ์ค, ํํค์น ์ ์์ต๋๋ค. ์ข์ ์ ํ์ ๋๋ค.
์ฌ์ค, @seven-phase-max๊ฐ ์ณ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ :+1: ๊ทธ๊ฒ๋ ์์ต๋๋ค.
@lukeapage - ๋๋ "ํ ๊ฐ์ง ๋๋ ๋ค๋ฅธ" ์ ํ์ ์๋ฃจ์
์ ์นํธํ๋ ค๋ ๊ฒ์ด ์๋๋ผ (๋น์ ์ด ๋งํ๋ฏ์ด) ํ๋ฆฐ์ง ์ฌ๋ก๋ฅผ ์ง์ํ์ง ์๋ ์ ๊ทผ ๋ฐฉ์์ ์นํธํ๋ ค๊ณ ํ์ต๋๋ค. ์ฌ์ค, ์ฐ๋ฆฌ๋ ์ด๋ฏธ "๋ก์ปฌ" ๋ฒ์์ ๋ํ ๊ธฐ๋ฅ์ ์ง๋์ณค๊ณ :extend
๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์๋ํ๊ธฐ ๋๋ฌธ์ "๋์๊ฐ๊ธฐ์๋ ๋๋ฌด ๋ฆ์" ๋จ๊ณ IMO์ ๋ค์ด๊ฐ์ต๋๋ค.
.block { color: green; }
.component {
.block { color: red; }
div:extend( .block ) {};
}
/*
.block,
.component div {
color: green;
}
.component .block {
color: red;
}
*/
๋ค์ ์ฝ๋๊ฐ ์์ ๋ค๋ฅด๊ฒ ์๋ํด์ผ ํ ์ด์ ๊ฐ ์์ต๋๋ค. ์ต์ข
์ถ๋ ฅ์ .block
ํด๋์ค๊ฐ ์๋ค๋ ์ด์ ์ด ์์ต๋๋ค.
.block() { color: green; }
.component {
.block() { color: red; }
div:extend( .block() ) { };
}
/*
.component div {
color: green;
}
*/
Btw., ๋ช
๋ช
๊ท์น์ ์ฝ๊ฐ์ ๋๋ฆฌํํธ๊ฐ ์์ต๋๋ค. :) ์๋ฅผ ๋ค์ด "๋งค๊ฐ๋ณ์ ๋ฏน์ค์ธ"์ ๋งค๊ฐ๋ณ์๊ฐ 0์ธ ํญ๋ชฉ์ ํฌํจํ์ฌ ๊ดํธ๋ก ์ ์๋ ๋ชจ๋ ๋ฏน์ค์ธ์ ์๋ฏธํฉ๋๋ค(์: .mixin() {}
๋ "๋งค๊ฐ๋ณ์"์). ๊ทธ๋ฆฌ๊ณ "๋น๋งค๊ฐ๋ณ์" mixin์ ๋จ์ํ ์ ํ๊ธฐ(์: .mixin {}
)์
๋๋ค. ์ง๊ธ๊น์ง๋ ์ด ๋๋ฆฌํํธ๊ฐ ์คํด๋ฅผ ์ผ์ผํค์ง ์์๋ค๊ณ ์๊ฐํ์ง๋ง(์: ์์ ๋๋ถ๋ถ์ ์์์ .mixin() {}
๊ฐ "๋น๋งค๊ฐ๋ณ์" ๋ฏน์ค์ธ์ผ๋ก ์ธ๊ธ๋ ๊ฒฝ์ฐ ์ปจํ
์คํธ์์ ๋ช
ํํ์ต๋๋ค)...
๋ฌธ์ ์์ ๊ฐ๋จํ ์ ํ๊ธฐ์ ์ด๋ฆ๋ "mixin"์ผ๋ก ์ง์ ๋๊ณ (ํผํฉ๋๋ ์ฆ์) "๋น๋งค๊ฐ๋ณ์" mixin์ธ ๊ฒ๋ ๋์น์ง ๋ง์ธ์. ๋ฐ๋ผ์ .mixin() {}
๋ฅผ "๋น๋ชจ์์ "์ผ๋ก๋ง ์ธ๊ธํ๋ ๊ฒ์ ์๋นํ ๋ชจํธํ ์ ์์ต๋๋ค(๊ธฐ์ ์ ์ผ๋ก ์ฐจ์ด์ ์ ์ธ์์ ์๊ฐ ์๋๋ผ ์ ์ ๊ดํธ์ ์กด์ฌ ์ฌ๋ถ์ ์์ต๋๋ค).
์ข์, ์ด๊ฒ์ ๋์ ํ์์ boo-boo-boo์์ต๋๋ค. :)
@lukeapage
์ง๊ธ์ ํ๋ผ๋ฉํธ๋ฆญ ๋ฏน์ค์ธ์ ๋ฌด์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฆ, 0์ด ์๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ฏน์ค์ธ์ ๋ํด ํ์ฅ์ ์ง์ํ์ง ์์ต๋๊น? ๋๋ ๊ด์ฐฎ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๊ตฌํ๋ ์ ์๋์ง ์ถ์ ํ๋ ค๊ณ ํ์ ๋ฟ์ ๋๋ค.
๊ทผ๋ฐ ํฉ์ณ์ง๋ค? ๊ธฐ์กด ํ์ฅ๊ณผ ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ผ์น ํญ๋ชฉ์ ์ฐพ์ ์ถ๊ฐํฉ๋๋ค.
๋ง์์, ๊ฑฐ๊ธฐ์์ ๋ฏน์ค์ธ์ ํ์ฅ์ ์ค์ ์ธ์์ ๋ณํฉํ ๋ ๋ฐ์ํ ์ ์๋ ์ด๋ ค์์ ๋ํด ๋ ๋ง์ด ์๊ฐํ๊ณ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์:
.b:extend(.a(1, 2, 3)) {}
.c:extend(.a(1, 2, 3)) {}
๋ฐ๋ฉด์ ๋งค๊ฐ๋ณ์๊ฐ 0์ธ ๋ฏน์ค์ธ์๋ ์จ๊ฒจ์ง ๋๋ผ์์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
.a {color: red}
.a {width: 2px}
.b:extend(.a) {} // creates two `.b` blocks (it is expected since there're two `.a` blocks anyway)
.c {.a} // creates one `.c` block (OK, this is just how mixins work)
.d() {color: blue}
.d() {width: 10px}
.e {.d()} // creates one `.e` block (OK, this is just how mixins work)
.f:extend(.d()) {} // tada! another room for complains if this creates two `.f` blocks :)
๊ธ์, ์๋ง๋ ์ด๊ฒ์ ๋๋ฌด ๊น์์ด ๋ค์ด๊ฐ ๊ฒ์ ๋๋ค.
.f:extend(.d()) {} // tada! another room for complains if this creates two
.fblocks :)
"์ด ์์์ .d()
๋ ๋งค๊ฐ๋ณ์์ด๋ฏ๋ก ๋ ๊ฐ์ .f
๋ธ๋ก์ ์์ฑํด์๋ ์ ๋๋ค"๋ ์๊ฐ์ผ๋ก?
์, mixin์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๊ทํ์ ์์ ์ ์ ์ ์์ต๋๋ค.
.f {
color: #0000ff;
width: 10px;
}
IMHO ๋จ๊ณ์ ์ผ๋ก ์ํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๋ฉด ์ค๋ช ๋ง ํ๋ฉด ๋์ง๋ง ๋ถ๋ง ์์ฒด๋ฅผ ํผํ๊ธฐ ์ํด ๊ตฌํํ์ง๋ _ํ์ง_ ์์ ๊ฒ์ ๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ๋ด 2c์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ช ๋ ๋์์ผ๋ก ๊ตฌํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ "ํ์ฅ๋ ์ ํ๊ธฐ์์ CSS ๋ธ๋ก ๋ณํฉ"์ ๋ํ ๊ธฐ๋ฅ ์์ฒญ์ ์์ฑํ์ฌ ๋ถ๋ง์ ํด์ํ ์๋ ์์ต๋๋ค...?
๊ทธ๋ฌ๋ ๋๋ ๋ถ๋ง ๊ทธ ์์ฒด๋ฅผ ํผํ๊ธฐ ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ๊ตฌํํ์ง ์์ ๊ฒ์ ๋๋ค.
์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋๋ ๋จ์ง "๋ณ๊ฒฝํ๊ธฐ์๋ ๋๋ฌด ๋ฆ์๋ค"๋ ๊ฒ ์ค ํ๋๊ฐ ๋ ์ ์๋ ๋ชจ๋ ๋๋ผ์์ ์์ธกํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
:+1: ๋ค, ๋น์ ์ด ์๊ฐํ๋ ๋ฐฉ์์ด ์ข์์!
๋๋ ์ด ํ ๋ก ์ด ์ฌ์ ํ ์งํ๋๊ณ ์๋ค๋ ๊ฒ์ ์ข์ํ๋ค. ์ด ํ ๋ก ์ ๋ช ๊ฐ์ง ์์ ์ผ๋ก ๋์๊ฐ๊ฒ ์ต๋๋ค. ์ฒซ์งธ, ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ ์์ด์๋ ๋์ผํฉ๋๋ค.
.mixin {} == .mixin() {}
.mixin { }๊ฐ ์ถ๋ ฅ์ ํด๋์ค๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ ์ธํ๊ณ . ๋๋ ํ์์์ ๊ทธ๊ฒ๋ค์ด ์๋ง๋ ๋ค๋ฅด๊ฒ ์ทจ๊ธ๋๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ฌ์ฉ๋ฒ์์๋ ์์ฑ/๊ฐ ์์ ๋คํํฉ๋๋ค.
์๋ฏธ:
.mixin1() {
color: red;
}
.mixin2 {
color: blue;
}
.use1 {
.mixin1;
foo:bar;
}
.use2 {
.mixin2;
foo:bar;
}
์ด Less ๊ตฌ๋ฌธ ๊ธฐ๋ก ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
.mixin1() {
color: red;
}
.mixin2 {
color: blue;
}
.use1 {
&:extend(.mixin1);
foo:bar;
}
.use2 {
&:extend(.mixin2);
foo:bar;
}
์ ์๊ฒ ์ด๊ฒ์ ๋ ผ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ข ์ข :extend๋ ์๋ ๋ฏน์ค์ธ ์ฌ์ฉ์ ๋ง์ ์ธ์คํด์ค์ ๋๋กญ์ธ ๊ต์ฒด์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค.
์ผ๋ฐ์ธ์ ๊ฒฝ์ฐ ์ด๋ ์ง๊ด์ ์ผ๋ก ๋์ผํ ๊ฒ์ ๋๋ค. .mixin1์ด ๊ดํธ๋ก ์์ฑ๋์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ญ์ฌ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฐธ์กฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
.use1 {
&:extend(.mixin1);
foo:bar;
}
.use1 {
&:extend(.mixin1());
foo:bar;
}
๊ทธ๋์, ๋๋ ์ด๊ฒ์ ๊ธฐ๋ํ ๊ฒ์ ๋๋ค :
.mixin1() {
color: red;
}
.use1 {
&:extend(.mixin1());
foo:bar;
}
.use2 {
&:extend(.mixin1());
bar:foo;
}
...์ถ๋ ฅํ๋ค...
.use1, .use2 {
color: red;
}
.use1 {
foo:bar;
}
.use2 {
bar:foo;
}
mixin์ด ๋ ๋ฒ ์ ์๋๋ฉด ํด๋์ค ์ ํ์์ธ ์๋งค์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ฅ ์ ๋ ๋ฒ ๋์ฒด๋ฉ๋๋ค.
.mixin1() {
color: red;
}
.mixin1() {
width: 30px;
}
.use1 {
&:extend(.mixin1);
foo: bar;
}
.use2 {
&:extend(.mixin1);
}
//output
.use1, .use2 {
color: red;
}
.use1, .use2 {
width: 30px;
}
.use1 {
foo: bar;
}
์ด๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฏน์ค์ธ ์ ์์์ ๊ดํธ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ ์ง๊ธ ํ์ฅ์ด ์๋ํ๋ ๋ฐฉ์์ ๋๋ค. ๋จ, ๋ฌผ๋ก ๋ฏน์ค์ธ ์ด๋ฆ์ด ์ถ๋ ฅ์ ํ์๋๋ฏ๋ก ๊ธฐ์กด ํ์ฅ ๋์์ ๋ฐ๋ฅด๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
๋งค๊ฐ๋ณ์(๋ด 90% ์ฌ์ฉ ์ฌ๋ก)์ ๊ฒฝ์ฐ ์ ๋ ฅ์ผ๋ก ๊ตฌ๋ถ๋๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ๋์ผํฉ๋๋ค.
.col(@width) {
width: @width;
display: table-cell;
}
.col1:extend(.col(10%)) { }
.col2:extend(.col(10%)) { }
.col3:extend(.col(80%)) { }
//output
.col1, .col2 {
width: 10%;
display: table-cell;
}
.col3 {
width: 80%;
display: table-cell;
}
์ ์๊ฒ ๋ฏน์ค์ธ์ ํ์ฅํ๋ ์ด์ ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ทธ๋ฃนํํ์ฌ ๋งค์ฐ ๊ฐ๊ฒฐํ ์ถ๋ ฅ์ ์์ฑํ ์ ์๋ ๋ณด๋ค ๊ฐ๋ ฅํ ๋ฏน์ค์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ด์ด์ง๊ธฐ ์ํจ์ ๋๋ค. ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋ฏน์ค์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด ์ค๋์ ๊ธฐ์กด Less ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฅผ ๊ณ์ ์ถ์งํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊ฝค ๊ฐ๋ ฅํ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
:+1 ํฌ๊ด์ ์ธ ๋ถ์์ ๋ํด @matthew-dean์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทํ๊ฐ ๋ค๋ฃฌ ๋ชจ๋ ๋ด์ฉ์ ๋์ํฉ๋๋ค. ์ต๊ทผ ํ ๋ก ์ฃผ์ ์ค ํ๋์ธ ์ด ์๋๋ฆฌ์ค์ ๋ํด ์๊ฒฌ์ ์ ์ํด ์ฃผ์๊ฒ ์ต๋๊น?
.mixin() { color: red; }
.component {
.mixin() { color: blue; }
> li:extend( .mixin() ) { ... }
}
LESS๊ฐ ํ์ฌ ์๋ํ๋ ๋ฐฉ์์ ์ ์ญ ๋ฒ์์ ๋ฏน์ค์ธ๋ง ํ์ฅ๋ฉ๋๋ค. ์ฆ, ๋นจ๊ฐ์ ์คํ์ผ์ด ํ์ฅ๋ฉ๋๋ค. ์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ด ๋์์ ๋์ํ๋ฉฐ ๋๊ตฐ๊ฐ๊ฐ ์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ํ๋์ ์คํ์ผ์ด ์ฐ์ธํ ๊ฒ์ผ๋ก ์์ํ์ง๋ง extends์ "์ ์ญ์ " ๋์์ ๋ฌธ์์์ ํ ์ค์ง๋ฆฌ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
// this is ".mixin()", which is being extended
.mixin() { color: red; }
.component {
// this is ".component .mixin()", which is not.
.mixin() { color: blue; }
> li:extend( .mixin() ) { ... }
}
๋๋ extends์ "์ ์ญ"๋์์ด ๋ฌธ์์์ ํ ์ค์ง๋ฆฌ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์์ ํ ๋์ํฉ๋๋ค. ์ฌ๊ธฐ์ ํ์ ์์ญ์ ๋์ ํ๋ ๊ฒ์ ๋์ฐํ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ์๊ฒ ์ค์ํ ๊ฒ์ ์ผ๊ด์ฑ์ ๋๋ค. ํ์ฌ ๋์์ด ๋ก์ปฌ ๋ฒ์์์ ์ ํ๊ธฐ๋ฅผ ํ์ฅํ์ง ์๋ ๊ฒฝ์ฐ๋ ๋ฏน์ค์ธ์์๋ ํ์ฅํด์๋ ์ ๋ฉ๋๋ค. ๋์ค์ ๋ก์ปฌ์์ ์ ํ๊ธฐ๋ฅผ ํ์ฅํ๋ฉด ๋ฏน์ค์ธ๋ ํ์ฅํด์ผ ํฉ๋๋ค. ์ฌ๋๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฒด์ ๊ฑธ์น :extend ํจํด์ ์ ๋ขฐํ ์ ์์ด์ผ ํฉ๋๋ค.
(๋ด๊ฐ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋งํ ์๋ ์์์ง๋ง: " @jonschlinkert ์ ์๊ฒฌ์ +1". ;-)
์ด ์์ ์์ ๋๊ตฌ๋ ์ง ์ด ๊ธฐ๋ฅ์ ํผ๋์ค๋ฝ๊ฒ ๋ง๋๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? @matthew-dean์ ํฌ๊ด์ ์ธ ๊ฐ์ ์ ์ดํ์ ์๋ต์ผ๋ก ์์ํ์ฌ ๋ค๋ฃจ์ง ์์ ์ค์ ์ํฉ์ ์๋ํด ๋ณด์ญ์์ค.
์ฆ๊ฑฐ์ด ํด์ผ ๋ณด๋ด์ธ์. ๋ฉ๋ฆฌ ํฌ๋ฆฌ์ค๋ง์ค. ํ ๋ฆฌ์ค ํผ์์คํ์ค!
์ ๋ง ์ข์ ๊ฐ์. @matthew-dean ๋ฐ ๋ค์ ๋ชจ๋ ์๊ฒฌ์ ๋์ํฉ๋๋ค. :+1:
๋๋ ๋ํ @matthew-dean์ ๋์ํฉ๋๋ค. ๊ทธ๋ ํฝํฝํ ์น๊ตฌ์ฒ๋ผ ๋ณด์ด๋ฉฐ ๋๋ ๊ทธ์ ์ ์ํ๊ณ ์ถ์ต๋๋ค.
(-์ต๋ช ์)
@matthew-๋ ๋จ์ด. :+1:
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด Bootstrap์ ๊ทธ๋ฆฌ๋ ์์คํ ์ฝ๋๋ฅผ ํจ์ฌ ๋ ๊น๋ํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค!
:+1: @cvrebert์ ๋์ํ์ต๋๋ค! ์ข์ ๊ฒ!
๊ทธ๋ฅ ์ฌ๋ฐฉ๋ฌธ. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฑฐ์ ํฉ์์ ์ด๋ฅด๋ ๊ณ ๊ตฌํ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ต๋๊น?
๋๋ ์ด๊ฒ์ ๋ํด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ง๋ง ๋ชจ๋ ๊ฒ์ ์ฝ๋ ๋ฏธ๋ก์ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ด ๊ตฌํ๋ ์ ์ด ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ๋๊ตฐ๊ฐ ์น์ ํ๊ฒ ๋ฌธ์์ ์ ์ ํ ์์ญ์ ์๋ ค์ค ์ ์์ต๋๋ค.
@josh18 ์๋์, ๊ธฐ๋ฅ ์์ฒญ์ด ์์ง ์ด๋ ค ์์ผ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ตฌํ๋์ง ์์์์ ์๋ฏธํฉ๋๋ค.
๋ค, ๊ฐ์ฌํฉ๋๋ค. ํน์ ์ ๊ฐ ๋์น ๋ถ๋ถ์ด ์๋์ง ๋ค์ ํ ๋ฒ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
์ธ์ ๊ฐ Wiki์์ ๊ณต๊ฐ/๊ตฌํ๋ ๊ธฐ๋ฅ์ ์์ฝํ ๊ณํ์ด์ง๋ง ์์ง ์๊ฐ์ด ์์ต๋๋ค.
์ธ์ ๊ฐ Wiki์์ ๊ณต๊ฐ/๊ตฌํ๋ ๊ธฐ๋ฅ์ ์์ฝํ ๊ณํ์ด์ง๋ง ์์ง ์๊ฐ์ด ์์ต๋๋ค.
@matthew-dean +1
์๋ ์๋ค์! ๋ด๊ฐ ์ดํดํ๋ ํ ์ด ๊ธฐ๋ฅ์ SASS ์๋ฆฌ ํ์์์ ๋ค์ ์ ์ฌํฉ๋๋ค. ์ธ์ ๊ตฌํ๋๋์ง ์๊ณ ์ถ์์ต๋๋ค.
์๋
ํ์ธ์,
๋ด ์๊ฐ๊ณผ ๋ค๋ฅธ ๊ธฐ์ฌ์๋ฅผ ์์ธกํ๋ ๊ฒ์ด ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
๊ทธ๋ค์ด ๊ด์ฌ์ด ์๋ ๊ฒ์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ํ์คํ์ง ์์ต๋๋ค. ๋ด๊ฐ ๋งํ ์ ์๋ ๊ฒ์
์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋์ ์ฐ์ ์์๋ก ์๊ฐํ๋ฉฐ, ๋ด ๋ชฉ๋ก์์ ๋ค์์ผ๋ก ์ค์ํ ๊ฒ์
๋๋ค.
๋ต๋ณ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ด ๊ตฌํ๋๊ณ ์๋ํ๋ ๊ฒ์ ๋ณด๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. :)
์ด ๊ธฐ๋ฅ์ ๋ํด +1์ ๋๋ค. CSS ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ํด +1์ ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ํด +1์ ๋๋ค.
+1 ๊ด์ฌ์๊ฒ ์์ฒญํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
:+1:
์ด ๋ฌธ์ ๊ฐ ์์ฑ๋ ์ง 2๋ ์ด ์ง๋ฌ์ต๋๋ค. 2014๋ 11์ ์ดํ์ ๋์ ์ฐ์ ์์ ํ๊ทธ์ ๋๋ค. ์ด์ ํ๋ 1.6.0 ๋๋ 2.0.0์ ๋๋ค. ์์ฒญ๋. ์ง๊ธ์ 2.5 ๋ฏธ๋ง์ ๋๋ค.
@๊ทธ๋กค
ํ๋ณดํ ์ค๋น๊ฐ ๋์ จ๋์?
@seven-phases-max ์๊ฐํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋น์ทํฉ๋๋ค. ๊ทธ๋ฌํ ๊ถ๋ฆฌ์ ํ์. ;)
@seven-phases-max lol ์๋์ ์ ๋ ๊ทธ๋ฅ ํ๋ก ํธ์๋/๋์์ด๋์
๋๋ค.
@Celc ์ง์ง ๋ชป์๊ฒผ์ด ๐
์ด ๋ฌธ์ ๊ฐ ์์ฑ๋ ์ง 2๋ ์ด ์ง๋ฌ์ต๋๋ค.
๊ทธ๋, ์ด์จ๋ ๋ด๊ฐ ๋ํฌ๋ค์๊ฒ ๋์ ์ง๋ถํ๋ ๊ฒ์ ๋ฌด์์ธ๊ฐ? ;-)
์ฌํ๊ฒ๋ ์ฐธ์ฌ๋ฅผ ๋์ธ ์ ์์ง๋ง ์ด ์์ฒญ์ ์ ๊ทน ์ฐฌ์ฑํฉ๋๋ค!
์ด๊ฒ์ ๋ณต์กํ๊ณ ํจ๊ณผ์ ์ธ ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๋งค์ฐ ์ค์ํ ๊ธฐ๋ฅ์ ๋๋ค.
3๋
๊ณผ ๊ณ์ฐ. ๋คํํ Sass v4( sass-*
์ ๋์ด ๊ธฐ๋ฅ ํฌํจ)๊ฐ ์ถ์๋๊ณ Less๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
@stevenvachon ์ฐ๋ฆฌ๋ Sass์ ๋ํด ์ํ์ ํ์ง ์์ต๋๋ค. ๋ฌผ๋ก ์ด๋ค ๋ฉด์์๋ ๊ฒฝ์์์ง๋ง ํ๋ก์ ํธ๋ง๋ค ์ฒ ํ์ด ๋ค๋ฅด๊ณ ๊ทธ๊ฒ์ ๋ถ๋ฌ ์ฐ๋ฆฌ๋ฅผ ํด์น๋ ค๋ ๊ฒ์ ๋ฌด์๋ฏธํฉ๋๋ค.
๋ฌผ๋ก ๋๊ตฌ๋ ์ง ํ ๋ฆฌํ์คํธ๋ฅผ ํ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๊ธฐ๋ฅ๊ณผ ํจ๊ป ๊ธฐ๋ฅ์ pull ์์ฒญ์ ๊ธฐ๊บผ์ด ๋ณํฉํ ๊ฒ์ ๋๋ค.
๋๋ ๋๊ตฐ๊ฐ๋ฅผ ๋ค์น๊ฒ ํ๋ ค๊ณ ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ฌ์ค ์๋ง ๊ทธ๋ฌํ ๊ฒ์ ๋ฐฉ์งํ๋ ค๊ณ ํ ๊ฒ์ ๋๋ค. ์์ ์ด ๋๋ผ๋ ๊ฐ์ ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ์๋ก์ด ๋ฐฉํฅ์ ํํํ๋ ๊ฒ์ด ๋ ์ข์ ๊ฒ ๊ฐ์์. ๋นจ๋ฆฌ ์๋ ๊ฒ์ด ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ๋๊ฐ ๋ ๋๊ธฐ ์ ์. ์๋ฅผ ๋ค์ด, Bootstrap v4๋ Less.js๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ํฐ ํ๊ฒฉ์ ์ค ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๋ฌผ๋ก ๊ทธ๋ฌํ ์ ์น๋ ์ํ๋ ๋๋ก ๋ฌด์ํ ์ ์์ต๋๋ค.
@stevenvachon ์ ๊ทธ๋ ๊ฒ :extend ๊ธฐ๋ฅ ์ ์ฌ์ฉํ์ต๋๋ค. ์ด ๋ฌธ์ ๊ฐ ์ ์์ง ์ด๋ ค ์๋์ง์กฐ์ฐจ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ ์ฅ, ์ ๋ ๋ ์ผ์ฆ ๊ฐ๋ฐ์์ด๊ณ ๋ฃจ๋น ํ๋ก์ ํธ๊ฐ ์๋ ๋ gulp+LESS๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฃผ์ ๋ฅผ ๋ฒ์ด? ์ด ๊ธฐ๋ฅ์ 3๋ ๋์ ๊ตฌํ๋์ง ์์์ผ๋ฉฐ ๋งค์ฐ ์ ์ฉํ ๊ฒ์ ๋๋ค.
Sass๊ฐ JS๋ก ์์ฑ๋์์ผ๋ฉด ๋ ์ข์๊ฒ ์ง๋ง, ๊ทธ๋ ์ง๋ ์๊ณ ๊ทธ๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ฒ๋ ์๋๋๋ค. ๊ทธ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Sass๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฆฌ ํ์์๋ฅผ ํ์ฅํ ์ ์์ง๋ง Less๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฏน์ค์ธ์ ํ์ฅํ ์ ์์ต๋๋ค.
์ผ, ๊ทธ๊ฒ์ ์ ํ ์ฃผ์ ์์ ๋ฒ์ด๋์ง ์์ง๋ง ๋งค์ฐ ๊ธฐ๋๋๋ ๊ธฐ๋ฅ์ ๋๋ค! (์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์ด์จ๋ ๋ ์ ํธํ์ง๋ง)
๋ง๋ค์ด๋ฌ๋ผ๊ณ ์ ์ํ ๋ฟ์ ๋๋ค.
์ถ์ ์ ๊ฒฝ์ฐ์๋ ์ค์ ๋ก js์ ๋ํ ์ฝ๊ฐ์ ์ง์์ ๊ฐ์ง ๋์์ด๋์ ๋๋ค. ๋๋ถ๋ถ์ dom๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ less.js ์ฝ๋๋ฒ ์ด์ค์ ๊ธฐ์ฌํ ์ ์๋ ๊ฐ๋ฐ์์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋๋ค. ์ด์จ๋ ์ฌํ ์ด์ผ๊ธฐ์ ๋๋ค)
๋จ์ง ๋งค์ฐ ๊ด์ฌ ์๋ ํ๋ก์ ํธ ํ์์)
๊ณต์ต๊ด๊ณ
์ธ์ ๋ ์ง ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ๊ฑฐ๋ ๊ฐ๋ฐ์์ ํ๋ ฅํ์ฌ ํ ๋ฆฌํ์คํธ๋ฅผ ๋ฐ์ ์ ์์ผ๋ฉฐ ์ด ๊ธฐ๋ฅ์ด ๋ณํฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. Less.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด ์ค๋ ๋์ ์๋ ์ฌ๋๋ค๊ณผ ๊ฐ์ ๊ฐ์ธ์ ์ ๊ธฐ์ ์ธ ๊ธฐ์ฌ๊ฐ ๋ ํ์ํฉ๋๋ค. . ์ด๋ ํ ์ฌ๋์ ์ฑ ์์ด ์๋๋๋ค. ์ด ์ค๋ ๋๋ฅผ ๋ณด๊ฑฐ๋ ์ด ๊ธฐ๋ฅ์ ํ์๋ก ํ๊ณ ์๊ฐ์ ๋ค์ฌ ์ด๋ฅผ ์คํํ๋ ๊ฒ์ ์ ์ ์ผ๋ก ํ ๊ฐ์ธ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค.
๊ทํ์ ์๋ต์ด ๊ทํ๊ฐ ๊ฐ๋ฐ์๊ฐ ์๋๋ผ๋ ๊ฒ์ด๋ผ๋ฉด, ์๋ก์ด ๊ธฐ๋ฅ์ ํ์ํ ๋ฌธ์๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ์น์ฌ์ดํธ์์ ๋์์ธ ์ง์์ ์ ๊ณตํ๊ณ , ํ ์คํธ๋ฅผ ์คํํ๊ณ , ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๋ฑ ๋น๊ฐ๋ฐ ์ญํ ์์ ์ด ํ๋ก์ ํธ๋ฅผ ์ง์ํ ์ ์๋ ๋ค๋ฅธ ๋ง์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ฌธ์ , ํ๋ก์ ํธ ๊ด๋ฆฌ, ์คํ ์ค๋ฒํ๋ก์ ๋ํ ์ง๋ฌธ์ ๋ตํ๊ธฐ, ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์์ฑ, Less์ ๋ํด ํธ์ํ๊ธฐ, CSS ๋ฐ ์น ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ธฐ, Less ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑํ๊ธฐ.
์ด๋ฌํ ์์ ์ ๋๋ถ๋ถ์ ๊ฐ๋ฐ์์ธ ๊ฐ์ธ์ด ์ํํ๋ฏ๋ก ๊ฐ๋ฐ์ ๊ธฐ์ฌํ ์ ์๋ ์๊ฐ์ ์ด๋ฌํ ๋ค๋ฅธ ์์ ์ ํ ์ ํฉ๋๋ค.
๋น์ ์ด ๊ฐ๋ฐ์์ด๊ณ ๋น์ ์ ์๋ต์ด "์๊ฐ์ด ์์ต๋๋ค."๋ผ๋ฉด ์ด๊ฒ์ด ๋ฐ๋ก ์ด ๋ฌธ์ ๊ฐ ๊ณต๊ฐ๋ ์ ํํ ์ด์ ์ ๋๋ค. ๊ธฐ๋ฅ์ด ์๋ฃ๋์๋์ง ์ฌ๋ถ๋ 100% ๊ทํ์๊ฒ ๋ฌ๋ ค ์์ผ๋ฏ๋ก "๋๊ตฐ๊ฐ"๊ฐ ์๋ฃํ์ง ์์ ์ด์ ๋ฅผ ๋ฌป๋ ๊ฒ์ ์ ์ฉํ์ง ์์ต๋๋ค. _๋น์ ์ด ๋ฐ๋ก ๊ทธ ์ฌ๋์ ๋๋ค._ ๋น์ ์ด ์ด ํ๋ก์ ํธ์ ์ฐธ์ฌํ๋ค๋ฉด ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ ์ผ์ด๋ ๊ฒ์ ๋๋ค. ์น์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์คํ ์์ค ๋๊ตฌ ์ค ํ๋์ ์ฐธ์ฌํ ์ ์์ต๋๋ค. ๋น์ ์ ์์ฒ ๋ช ์ ์ถ์ ๋ฐ๊ฟ ์ ์์ต๋๊น? ์์ญ๋ง? ์๋ฐฑ๋ง? ๊ทธ๋ฆฌ๊ณ ๋ถ์์ ์ธ ์ด์ ์ผ๋ก ์ข์ํ๋ ๊ธฐ๋ฅ์ด ๋ ๋นจ๋ฆฌ ์คํ๋๋๋ก ํ ์ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ด๋ ์ด๋ค ๊ธฐ๋ฅ์ด ๋ฐ์ํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ๊ทธ๊ฒ์ ์คํํ์ญ์์ค . ์ฐ๋ฆฌ๋ ๋น์ ์ ๊ฐ๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋น์ ๊ณผ ํจ๊ป ์ผํ๊ณ ์ถ์ต๋๋ค! ์ด ์ปค๋ฎค๋ํฐ๊ฐ ์ฑ์ฅํ ์๋ก ๋ ์ข์์ง ์ ์์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ , ๊ฐ๋ ์ฌ๋๋ค์ด ๊ธฐ์ฌํ ์๊ฐ์ด ์ ํ ์๋๋ฐ๋ ์ฌ์ ํ ํน์ ๊ธฐ๋ฅ์ด ๊ตฌํ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ด์ฐฎ์. ๋๋ ๋น์ ์ด ๊ทธ ์๋๋ฆฌ์ค์ ์๋ค๋ฉด ๋น์ ์ ๋๊ธฐ ์ํด ์๊ฐ(๋๋ก๋ ๋)์ ๊ธฐ๋ถํ๋ ์ฌ๋๋ค์ ๋ํ ๊ณต๊ฐ๊ณผ ๊ฐ์ฌ๋ฅผ ๋ชฉํ๋ก ํ๊ณ ์์ผ๋ฉฐ Less ์ปค๋ฎค๋ํฐ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ต์ ์ ๋คํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๊ทธ๋ค์ด ํ ์ ์๋ ํ ๊ณ์ํ์ญ์์ค.
๊ฐ์ฌํฉ๋๋ค,
Matthew Dean, Less.js ํต์ฌ ํ ๋ฉค๋ฒ
๋๋ ์ด๋ฏธ ๋ด ์์ ์ ํ๋ก์ ํธ๋ฅผ ์ง์ํ๊ณ ๊ทธ๋ค์ ๊ธฐ๋ฅ ์์ฒญ์ ๋ฃ์ต๋๋ค. ์์งํ Less.js ์ฝ์ด๋ฅผ ํํค์น ์๊ฐ์ด ์์ต๋๋ค.
sass ์๋ฆฌ ํ์์(๋๋ "silent class") ์ง์์ ์ํด ์ฌ๊ธฐ์ ์ค๋ ์ฌ๋๋ค์ ์ด ์ฃผ์์ ์ฝ์ผ์ญ์์ค. (#1851๊ณผ "์ฐธ์กฐ๋" ํ์ผ์ ๊ทธ๋ฐ ํด๋์ค๊ฐ ์๊ธฐ ๋๋ฌธ์) ๊ฑฐ๊ธฐ๊น์ง ๊ฐ๋ ๊ฒ์ ์๋์ง๋ง ์๋ ๊ฒ๋ณด๋ค๋ ๋ซ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ณต์ต๊ด๊ณ
์ธ์ ๋ ์ง ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํ๊ฑฐ๋ ๊ฐ๋ฐ์์ ํ๋ ฅํ์ฌ ํ ๋ฆฌํ์คํธ๋ฅผ ๋ฐ์ ์ ์์ผ๋ฉฐ ์ด ๊ธฐ๋ฅ์ด ๋ณํฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. Less.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด ์ค๋ ๋์ ์๋ ์ฌ๋๋ค๊ณผ ๊ฐ์ ๊ฐ์ธ์ ์ ๊ธฐ์ ์ธ ๊ธฐ์ฌ๊ฐ ๋ ํ์ํฉ๋๋ค. . ์ด๋ ํ ์ฌ๋์ ์ฑ ์์ด ์๋๋๋ค. ์ด ์ค๋ ๋๋ฅผ ๋ณด๊ฑฐ๋ ์ด ๊ธฐ๋ฅ์ ํ์๋ก ํ๊ณ ์๊ฐ์ ๋ค์ฌ ์ด๋ฅผ ์คํํ๋ ๊ฒ์ ์ ์ ์ผ๋ก ํ ๊ฐ์ธ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค.
๊ทํ์ ์๋ต์ด ๊ทํ๊ฐ ๊ฐ๋ฐ์๊ฐ ์๋๋ผ๋ ๊ฒ์ด๋ผ๋ฉด, ์๋ก์ด ๊ธฐ๋ฅ์ ํ์ํ ๋ฌธ์๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ์น์ฌ์ดํธ์์ ๋์์ธ ์ง์์ ์ ๊ณตํ๊ณ , ํ ์คํธ๋ฅผ ์คํํ๊ณ , ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๋ฑ ๋น๊ฐ๋ฐ ์ญํ ์์ ์ด ํ๋ก์ ํธ๋ฅผ ์ง์ํ ์ ์๋ ๋ค๋ฅธ ๋ง์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ฌธ์ , ํ๋ก์ ํธ ๊ด๋ฆฌ, ์คํ ์ค๋ฒํ๋ก์ ๋ํ ์ง๋ฌธ์ ๋ตํ๊ธฐ, ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์์ฑ, Less์ ๋ํด ํธ์ํ๊ธฐ, CSS ๋ฐ ์น ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ธฐ, Less ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑํ๊ธฐ.
์ด๋ฌํ ์์ ์ ๋๋ถ๋ถ์ ๊ฐ๋ฐ์์ธ ๊ฐ์ธ์ด ์ํํ๋ฏ๋ก ๊ฐ๋ฐ์ ๊ธฐ์ฌํ ์ ์๋ ์๊ฐ์ ์ด๋ฌํ ๋ค๋ฅธ ์์ ์ ํ ์ ํฉ๋๋ค.
๋น์ ์ด ๊ฐ๋ฐ์์ด๊ณ ๋น์ ์ ์๋ต์ด "์๊ฐ์ด ์์ต๋๋ค."๋ผ๋ฉด ์ด๊ฒ์ด ๋ฐ๋ก ์ด ๋ฌธ์ ๊ฐ ๊ณต๊ฐ๋ ์ ํํ ์ด์ ์ ๋๋ค. ๊ธฐ๋ฅ์ด ์๋ฃ๋์๋์ง ์ฌ๋ถ๋ 100% ๊ทํ์๊ฒ ๋ฌ๋ ค ์์ผ๋ฏ๋ก "๋๊ตฐ๊ฐ"๊ฐ ์๋ฃํ์ง ์์ ์ด์ ๋ฅผ ๋ฌป๋ ๊ฒ์ ์ ์ฉํ์ง ์์ต๋๋ค. _๋น์ ์ด ๋ฐ๋ก ๊ทธ ์ฌ๋์ ๋๋ค._ ๋น์ ์ด ์ด ํ๋ก์ ํธ์ ์ฐธ์ฌํ๋ค๋ฉด ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ ์ผ์ด๋ ๊ฒ์ ๋๋ค. ์น์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์คํ ์์ค ๋๊ตฌ ์ค ํ๋์ ์ฐธ์ฌํ ์ ์์ต๋๋ค. ๋น์ ์ ์์ฒ ๋ช ์ ์ถ์ ๋ฐ๊ฟ ์ ์์ต๋๊น? ์์ญ๋ง? ์๋ฐฑ๋ง? ๊ทธ๋ฆฌ๊ณ ๋ถ์์ ์ธ ์ด์ ์ผ๋ก ์ข์ํ๋ ๊ธฐ๋ฅ์ด ๋ ๋นจ๋ฆฌ ์คํ๋๋๋ก ํ ์ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ด๋ ์ด๋ค ๊ธฐ๋ฅ์ด ๋ฐ์ํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ๊ทธ๊ฒ์ ์คํํ์ญ์์ค . ์ฐ๋ฆฌ๋ ๋น์ ์ ๊ฐ๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋น์ ๊ณผ ํจ๊ป ์ผํ๊ณ ์ถ์ต๋๋ค! ์ด ์ปค๋ฎค๋ํฐ๊ฐ ์ฑ์ฅํ ์๋ก ๋ ์ข์์ง ์ ์์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ , ๊ฐ๋ ์ฌ๋๋ค์ด ๊ธฐ์ฌํ ์๊ฐ์ด ์ ํ ์๋๋ฐ๋ ์ฌ์ ํ ํน์ ๊ธฐ๋ฅ์ด ๊ตฌํ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ด์ฐฎ์. ๋๋ ๋น์ ์ด ๊ทธ ์๋๋ฆฌ์ค์ ์๋ค๋ฉด ๋น์ ์ ๋๊ธฐ ์ํด ์๊ฐ(๋๋ก๋ ๋)์ ๊ธฐ๋ถํ๋ ์ฌ๋๋ค์ ๋ํ ๊ณต๊ฐ๊ณผ ๊ฐ์ฌ๋ฅผ ๋ชฉํ๋ก ํ๊ณ ์์ผ๋ฉฐ Less ์ปค๋ฎค๋ํฐ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ต์ ์ ๋คํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๊ทธ๋ค์ด ํ ์ ์๋ ํ ๊ณ์ํ์ญ์์ค.
๊ฐ์ฌํฉ๋๋ค,
Matthew Dean, Less.js ํต์ฌ ํ ๋ฉค๋ฒ