Less.js: : ๋ฏน์Šค์ธ ํ™•์žฅ

์— ๋งŒ๋“  2013๋…„ 02์›” 12์ผ  ยท  112์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: less/less.js

์ด ๊ธฐ๋Šฅ ์š”์ฒญ์€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 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(์„ ํƒ์ž) ์ž์ฒด๋Š” ์ปดํŒŒ์ผ๋œ ๊ฒฐ๊ณผ์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ™•์žฅ๊ณผ ๋ฏน์Šค์ธ์„ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

feature request medium priority up-for-grabs

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ณต์ต๊ด‘๊ณ 

์–ธ์ œ๋“ ์ง€ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ์ถœํ•˜๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ์ž์™€ ํ˜‘๋ ฅํ•˜์—ฌ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๊ธฐ๋Šฅ์ด ๋ณ‘ํ•ฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. Less.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด ์Šค๋ ˆ๋“œ์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ๊ฐ™์€ ๊ฐœ์ธ์˜ ์ •๊ธฐ์ ์ธ ๊ธฐ์—ฌ๊ฐ€ ๋” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. . ์–ด๋Š ํ•œ ์‚ฌ๋žŒ์˜ ์ฑ…์ž„์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ณด๊ฑฐ๋‚˜ ์ด ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœ ํ•˜๊ณ  ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์ด๋ฅผ ์‹คํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ „์ ์œผ๋กœ ํ•œ ๊ฐœ์ธ์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์‘๋‹ต์ด ๊ท€ํ•˜๊ฐ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋ผ๋ฉด, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ์›น์‚ฌ์ดํŠธ์—์„œ ๋””์ž์ธ ์ง€์›์„ ์ œ๊ณตํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ๋“ฑ ๋น„๊ฐœ๋ฐœ ์—ญํ• ์—์„œ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ, ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ, ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ, ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์ž‘์„ฑ, Less์— ๋Œ€ํ•ด ํŠธ์œ—ํ•˜๊ธฐ, CSS ๋ฐ ์›น ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๊ธฐ, Less ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑํ•˜๊ธฐ.

์ด๋Ÿฌํ•œ ์ž‘์—…์˜ ๋Œ€๋ถ€๋ถ„์€ ๊ฐœ๋ฐœ์ž์ธ ๊ฐœ์ธ์ด ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ด๋Ÿฌํ•œ ๋‹ค๋ฅธ ์ž‘์—…์— ํ• ์• ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๊ฐœ๋ฐœ์ž์ด๊ณ  ๋‹น์‹ ์˜ ์‘๋‹ต์ด "์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค."๋ผ๋ฉด ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ๊ณต๊ฐœ๋œ ์ •ํ™•ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” 100% ๊ท€ํ•˜์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์œผ๋ฏ€๋กœ "๋ˆ„๊ตฐ๊ฐ€"๊ฐ€ ์™„๋ฃŒํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ๋ฌป๋Š” ๊ฒƒ์€ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. _๋‹น์‹ ์ด ๋ฐ”๋กœ ๊ทธ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค._ ๋‹น์‹ ์ด ์ด ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•œ๋‹ค๋ฉด ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋•Œ ์ผ์–ด๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›น์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ˆ˜์ฒœ ๋ช…์˜ ์‚ถ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ˆ˜์‹ญ๋งŒ? ์ˆ˜๋ฐฑ๋งŒ? ๊ทธ๋ฆฌ๊ณ  ๋ถ€์ˆ˜์ ์ธ ์ด์ ์œผ๋กœ ์ข‹์•„ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋” ๋นจ๋ฆฌ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด๋‚˜ ์–ด๋–ค ๊ธฐ๋Šฅ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ์‹คํ˜„ํ•˜์‹ญ์‹œ์˜ค . ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์„ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ๊ณผ ํ•จ๊ป˜ ์ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค! ์ด ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์„ฑ์žฅํ• ์ˆ˜๋ก ๋” ์ข‹์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ , ๊ฐ€๋” ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ์—ฌํ•  ์‹œ๊ฐ„์ด ์ „ํ˜€ ์—†๋Š”๋ฐ๋„ ์—ฌ์ „ํžˆ ํŠน์ • ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์•„. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์žˆ๋‹ค๋ฉด ๋‹น์‹ ์„ ๋•๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„(๋•Œ๋กœ๋Š” ๋ˆ)์„ ๊ธฐ๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์— ๋Œ€ํ•œ ๊ณต๊ฐ๊ณผ ๊ฐ์‚ฌ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Less ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ตœ์„ ์„ ๋‹คํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ณ„์†ํ•˜์‹ญ์‹œ์˜ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค,
Matthew Dean, Less.js ํ•ต์‹ฌ ํŒ€ ๋ฉค๋ฒ„

๋ชจ๋“  112 ๋Œ“๊ธ€

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด .. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ „์— ํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์–ป๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค..

.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 ํ™•์žฅ์ด ์œ ๋ฆฌํ•œ ์ด์œ ์— ๋Œ€ํ•œ ์™„๋ฒฝํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์˜๊ด‘ ๋ฏน์Šค์ธ์—๋Š” ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์†์„ฑ์ด ๋ณต์ œ ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฏน์Šค์ธ ํ™•์žฅ์ด "์ผ๋ฐ˜ ๋ฏน์Šค์ธ"๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ณ  ์œ„์—์„œ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ๋ฅผ ๊ณ„์†ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ๋ฅผ ๋ณด๋ฉด ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ด๊ณ  ๊ด€๋ จ์ด ์—†๋Š” ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐฐ๋„ˆ ํด๋ž˜์Šค๋Š” ํ™•์žฅ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ปดํŒŒ์ผ๋œ CSS์— ๊ณ„์† ํ‘œ์‹œ๋˜์ง€๋งŒ ๋ฐฐ๋„ˆ ํด๋ž˜์Šค๊ฐ€ ๋ฏน์Šค์ธ์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉ(ํ™•์žฅ ๋˜๋Š” ํ˜ผํ•ฉ)๋œ ๊ฒฝ์šฐ์—๋งŒ ๊ฒฐ๊ณผ CSS์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ 
  2. ๋ฏน์Šค์ธ์„ ํ™•์žฅํ•  ๋•Œ ๋™์ผํ•œ ์†์„ฑ์„ ๊ณ„์†ํ•ด์„œ ๋ณต์ œํ•˜๋Š” ๋Œ€์‹  ์‹ค์ œ ์„ ํƒ๊ธฐ ์ž์ฒด๋ฅผ ๋ฏน์Šค์ธ ์œ„์น˜์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ•˜๋‚˜์˜ ์˜ˆ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. 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, ์—ฐ์Šต๊ณผ ์‚ฌ๋ž‘์—์„œ ๊ฝค ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ:

  • ๋ฏน์Šค์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฏน์Šค์ธ์„ ํ˜ธ์ถœํ•˜๋Š” ์„ ํƒ๊ธฐ์˜ ์œ„์น˜์— ์†์„ฑ์ด ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.
  • ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด _extending_ ์„ ํƒ๊ธฐ๊ฐ€ _extended_ ํด๋ž˜์Šค ์œ„์น˜์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ฏน์Šค์ธ์„ ํ™•์žฅํ•˜๋ฉด ํ˜ธ์ถœํ•˜๋Š” ์„ ํƒ๊ธฐ๊ฐ€ ๋ฏน์Šค์ธ ์œ„์น˜์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.

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 ์ •์˜๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋„๋ก css-visitor๋กœ ๋ณ€๊ฒฝ
  • ํ™•์žฅ ๋ฐฉ๋ฌธ์ž๊ฐ€ 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 .f blocks :)

"์ด ์˜ˆ์—์„œ .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๊ณผ "์ฐธ์กฐ๋œ" ํŒŒ์ผ์— ๊ทธ๋Ÿฐ ํด๋ž˜์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—) ๊ฑฐ๊ธฐ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์—†๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋‚ซ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰