Less.js: ๊ทธ๋ฃน ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ

์— ๋งŒ๋“  2012๋…„ 09์›” 11์ผ  ยท  64์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: less/less.js

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๋ฒ„๋ธ”๋ง์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ:

header {
    color: green;

    <strong i="6">@media</strong> only screen (max-width: 500px) { color: red; }
}

footer {
    color: green;

    <strong i="7">@media</strong> only screen (max-width: 500px) { color: red; }
}

Less๋Š” less ํŒŒ์ผ์— ์„ ์–ธ๋  ๋•Œ๋งˆ๋‹ค ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ์„ ํƒ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ๋ถ€ํ’€๋ ค์ง„ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

header {
  color: green;
}
<strong i="11">@media</strong> only screen (max-width: 500px) {
  header {
    color: red;
  }
}
footer {
  color: green;
}
<strong i="12">@media</strong> only screen (max-width: 500px) {
  footer {
    color: red;
  }
}

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

header {
  color: green;
}
footer {
  color: green;
}

<strong i="16">@media</strong> only screen (max-width: 500px) {
  header {
    color: red;
  }
  footer {
    color: red;
  }
}
feature request medium priority up-for-grabs

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

์ง„์ˆ ์„ ์žฌ๊ตฌ์„ฑํ•จ์œผ๋กœ์จ ์˜๋ฏธ๋ฅผ ์ž ์žฌ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜๋ฏธ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ ์ค‘๋ณต ํƒœ๊ทธ๋ฅผ ์ถ•์†Œํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

body {
    background: white;
}

body {
    padding: 0;
    margin: 0;
}

๋‹ค์Œ์œผ๋กœ ์ถ•์†Œ๋ฉ๋‹ˆ๋‹ค.

body {
    background: white;
    padding: 0;
    margin: 0;
}

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋Š” ์ผ๋ฐ˜ ์š”์†Œ ์„ ํƒ๊ธฐ ์œ„์—์„œ ์ œ์–ด ๊ณ„์ธต ์—ญํ• ์„ ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ตœ์ƒ์œ„ ์„ ํƒ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, ๊ทธ๊ฒƒ๋“ค์€ ํ•˜๋‚˜์˜ ์˜๋ฏธ๋งŒ์„ ๊ฐ€์ง€๋ฉฐ ํŒŒ์ผ ๋‚ด์˜ ๋‚˜๋จธ์ง€ CSS์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋ฒ„๋ธ”๋ง๋œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์˜ ์ˆœ์„œ๋ฅผ ์ด๋ฏธ ์œ ์ง€ํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ณ  ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ๋งŽ์€ ์ค‘๋ณต ์„ ํƒ๊ธฐ๋ฅผ ์ƒ์„ฑํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚  ๋•Œ ๋ฒ„ํผ๋ง๋˜๊ณ  ๋‹จ์ผ ์ฟผ๋ฆฌ์— ๊ธฐ๋ก๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ๊น”๋”ํ•ด์ง€๊ณ  ๋” ์ž‘์€ CSS ์ถœ๋ ฅ์ด ์ƒ์„ฑ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๋‚ด ์„ ํƒ๊ธฐ ๋ณต์žก์„ฑ์— ๋Œ€ํ•œ ๊ทœ์น™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ• 
์ฟผ๋ฆฌ๊ฐ€ ๋ณต์žก์„ฑ์„ ๋†’์ด๊ณ  ๋ชจ๋“  ์ˆœ์„œ๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๊นŒ? ์•„๋ฌด๋ฐ๋‚˜ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ˆ
๋ช…์„ธ์„œ?

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋ฏธ๋””์–ด ์„ ํƒ๊ธฐ๋Š” ์ผ๋ฐ˜ ์Šคํƒ€์ผ ๊ทœ์น™์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์ฟผ๋ฆฌ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋˜๋Š” IF ๋ฌธ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ˆ๋น„๊ฐ€ ํŠน์ • ํ”ฝ์…€ ์ˆ˜๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ฟผ๋ฆฌ ๋‚ด์˜ ๊ทœ์น™์ด ์„ค์ •๋˜๊ณ  ๊ธฐ์กด ๊ทœ์น™์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹จ์ผ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ์•ˆ์— ๋ชจ๋“  ์Šคํƒ€์ผ์ด ํฌํ•จ๋œ ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๊ฐ€ ๋™์ผํ•œ ํ•œ.

๋‹ค์Œ์€ Mozilla์˜ ์ผ๋ถ€ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

https://developer.mozilla.org/en-US/docs/CSS/Media_queries

๋‚ด ๋ง์€ ์ด ์˜ˆ์—์„œ ์ž…๋‹ˆ๋‹ค. div๊ฐ€ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. ์ฆ‰, ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ(๋‘˜ ๋‹ค ํ™”๋ฉด์— ๋Œ€ํ•ด)๋ฅผ ์žฌ์ •๋ ฌํ•˜๋ฉด CSS์˜ ์˜๋ฏธ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

<strong i="6">@media</strong> screen {
    div {
        background-color: green;
    }
}

div {
     background-color: red;
}

<strong i="7">@media</strong> screen {
    div.pink {
        background-color: pink;
    }
}

๊ทœ์น™ ์ง‘ํ•ฉ์ด ์„œ๋กœ ์ง์ ‘์ ์œผ๋กœ ์ด์–ด์ง€๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฒฐํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@Soviut์˜ ์›๋ž˜ ์˜ˆ์ œ์—๋Š” ์—†๋Š” ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ IMO์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋ฒ„๋ธ”๋ง๋œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฒ„๋ธ”๋ง๋œ ์ฟผ๋ฆฌ๋Š” ์•ฝ๊ฐ„์˜ ๊ตฌ๋ฌธ ์„คํƒ•์ด๋ผ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ์„ ํƒ๊ธฐ ๋‚ด๋ถ€์— ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ„๋ธ”๋ง ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๋ฒ„๋ธ”๋ง ์ฟผ๋ฆฌ๋ฅผ ๋„์ฐฉํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„๋ธ”๋ง๋œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๊ฐ€ ์„œ๋กœ ์˜†์— ๋‘ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ์ ์€ ์–‘์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ช…๋ฐฑํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๊ณ  ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์‹ค์ œ ์˜ˆ๋ฅผ ์ œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ๋“ค์„ ๋œ ๋ถ„๋ฆฌ๋˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด?

๋ ˆํ‹ฐ๋‚˜ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ณต์žกํ•œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๋ฏน์Šค์ธ ์•ˆ์— ๋ž˜ํ•‘ํ•˜๊ณ  ์Šคํ”„๋ผ์ดํŠธ ๋ฏน์Šค์ธ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์—ฌ๊ธฐ์ €๊ธฐ์— ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค... ์ถœ๋ ฅ CSS๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€๋งŒ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ ์Šคํ”„๋ผ์ดํŠธ ๋ฏน์Šค์ธ์ž…๋‹ˆ๋‹ค.

.sprite(<strong i="7">@spritePath</strong>, <strong i="8">@hdpiPath</strong>, <strong i="9">@x</strong>, <strong i="10">@y</strong>, <strong i="11">@size</strong>: auto) {
    background-image: url(@spritePath);  
    background-repeat: no-repeat;
    background-position: -1 * <strong i="12">@x</strong> -1 * @y; // Negativize the value
    .background-size(@size);
    <strong i="13">@media</strong> <strong i="14">@mediaRetina</strong> {
        background-image: url(@hdpiPath);
    }
}

@mediaRetina ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<strong i="19">@mediaRetina</strong>: ~"only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 4/3), only screen and (min-device-pixel-ratio: 1.3), only screen and (min-resolution: 124dpi), only screen and (min-resolution: 1.3dppx)";

๊ทธ๋Ÿฐ ๋‹ค์Œ ์•„๋ž˜์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ ์Šคํ”„๋ผ์ดํŠธ ์š”์†Œ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋ฏน์Šค์ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

#sprite
{
    .header-logo()
    {
        .sprite(<strong i="23">@globalSpritePath</strong>, <strong i="24">@global2XSpritePath</strong>, 22px, 0, 384px 288px);
        width: 94px;
        height: 59px;
    }
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค๋ฅธ LESS ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

h1 {
    width: 94px;
    height: 59px;

    a {
        #sprite > .header-logo();
    }

}

์ด ๊ฒฝ์šฐ ์ƒ์„ฑ๋œ CSS๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

h1 a {
  background-image: url("/images/sprite-global.png");
  background-repeat: no-repeat;
  background-position: -22px 0;
  -webkit-background-size: 384px 288px;
  -moz-background-size: 384px 288px;
  -o-background-size: 384px 288px;
  background-size: 384px 288px;
  width: 94px;
  height: 59px;
}
<strong i="31">@media</strong> only screen and (-webkit-min-device-pixel-ratio: 1.3), 
       only screen and (min--moz-device-pixel-ratio: 1.3), 
       only screen and (-o-min-device-pixel-ratio: 4/3), 
       only screen and (min-device-pixel-ratio: 1.3), 
       only screen and (min-resolution: 124dpi), 
       only screen and (min-resolution: 1.3dppx) {
  h1 a {
    background-image: url("/images/[email protected]");
  }
}

์ด์ œ ์ด ๊ฒฝ์šฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต๋œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๊ทธ๋ฃนํ™” ์—†์ด ์ด ์ถ”๊ฐ€ ๋ฌด๊ฒŒ๋ฅผ ์™„ํ™”ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๋ง๋ง‰ ์Šคํƒ€์ผ์„ ์ „์šฉ LESS ํŒŒ์ผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ์ž‘์€ ์‚ฌ์ดํŠธ์—์„œ๋Š” ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํฐ ์‚ฌ์ดํŠธ์—์„œ๋Š” ๋น„ํ˜„์‹ค์ ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ์šฐ๋ฆฌ์™€ ๊ฐ™์ด ๋งŽ์€ ๋ชจ๋“ˆ์ด ์žˆ๋Š” ํฐ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ๋ถ„๋ฆฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

์Šคํƒ€์ผ์„ ์žฌ์ •์˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์Šจ ๋ง์ธ์ง€ ์•Œ์ง€๋งŒ ๋””์ž์ด๋„ˆ๊ฐ€ ์›ํ•˜๋Š” ๊ณ„๋‹จ์‹ ๋ฐฐ์—ด์„ ์ž ์žฌ์ ์œผ๋กœ ๋ง์น˜์ง€ ์•Š๊ณ  ์ด ์ •ํ™•ํ•œ ๊ธฐ๋Šฅ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ "์„น์…˜"(์ž๋ฆฌ ํ‘œ์‹œ์ž)์„ ์ •์˜ํ•œ ๋‹ค์Œ ์ž‘์„ฑ๋˜๋Š” ์ˆœ์„œ์— ๊ด€๊ณ„์—†์ด ๊ทธ ์•ˆ์— ๋ฐฐ์น˜ํ•  ์Šคํƒ€์ผ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "์Šคํฌ๋ฆฝํŠธ" ๋˜๋Š” "ํ—ค๋“œ" ์„น์…˜์ด ์žˆ๊ณ  ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํŽ˜์ด์ง€์— ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„ ์ธก ํ…œํ”Œ๋ฆฟ์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ LESS ํŒŒ์ผ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

<strong i="39">@media</strong> { // retina query
    @renderSection("retina")
}

// in another file
h1 {
    <strong i="40">@section</strong> retina {
        // retina styles
    }
}

@section ๋Š” ์ปดํŒŒ์ผ ์‹œ ํ˜„์žฌ ์„ ํƒ๊ธฐ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด ์Šคํ”„๋ผ์ดํŠธ ๋ฏน์Šค์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

.sprite(<strong i="46">@spritePath</strong>, <strong i="47">@hdpiPath</strong>, <strong i="48">@x</strong>, <strong i="49">@y</strong>, <strong i="50">@size</strong>: auto) {
    background-image: url(@spritePath);  
    background-repeat: no-repeat;
    background-position: -1 * <strong i="51">@x</strong> -1 * @y; // Negativize the value
    .background-size(@size);
    <strong i="52">@section</strong> retina {
        background-image: url(@hdpiPath);
    }
}

์ด ๊ตฌ๋ฌธ(๋˜๋Š” ๊ตฌํ˜„)์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ €๋Š” ASP.NET Razor ๊ตฌ๋ฌธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ต์ˆ™ํ•˜๊ณ  ๊ตฌ๋ฌธ์„ ์ข‹์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ ์ข‹์€ ์˜ˆ .. ๊ทธ๋ฆฌ๊ณ  ์ข‹์€ ์‚ฌ์šฉ ์‚ฌ๋ก€ .. ๋‹น์‹ ์€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

@media-section

(๋˜๋Š” ๋ฏธ๋””์–ด ๊ทธ๋ฃน) ๊ทธ๋Ÿฌ๋ฉด ๋ฏธ๋””์–ด๋ฅผ ํ•จ๊ป˜ ๊ทธ๋ฃนํ™”ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค(์„ ํƒ์ ์œผ๋กœ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์— ๋ณ‘ํ•ฉํ•˜์—ฌ ์›ํ•˜๋Š” ์œ„์น˜๋กœ ๊ทœ์น™์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ). ๋ฌด์Šจ ๋ง์ด์•ผ?

์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€๋„ ์•Š์Œ).

@media-group์˜ ๊ฒฝ์šฐ +1

+1 @๋ฏธ๋””์–ด ๊ทธ๋ฃน

๋‹ค๋ฅธ ์˜ต์…˜์€ true/false๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ „์—ญ ์˜ต์…˜์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ , ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์ข‹์€ ์ƒ๊ฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ ํƒ์  ๊ทธ๋ฃนํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‚ฌ๋žŒ๋“ค์€ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ธ€๋กœ๋ฒŒ ์˜ต์…˜์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์ ์ธ ๊ทธ๋ฃนํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ๋‚˜์ค‘์— ์ƒˆ ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€๋กœ๋ฒŒ ๊ทธ๋ฃนํ™” ์˜ต์…˜์˜ ๊ฒฝ์šฐ +1์ž…๋‹ˆ๋‹ค.

์˜ˆ.. @import ์—์„œ ์—ฌ๋Ÿฌ ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ฉฐ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ๋œํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฆ‰์‹œ ์œ ์šฉํ•˜๊ณ  ์„ ํƒ์ ์ธ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ ์žฌ์ •์˜๋กœ ๊ณต์กดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฐฉ๊ธˆ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋ฃนํ™”ํ•ด์•ผ ํ•  ๋•Œ ๋งŒ๋“  ์ž‘์€ ์•ฑ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์™„์„ฑ๋œ ์•ฑ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์˜ ๋„๊ตฌ์— ๋Œ€ํ•œ ์—ฐ๊ตฌ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๊ทธ ์•„์ด๋””์–ด๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ €๋Š” ๊ทธ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (๋ฒ„๊ทธ ๋ฐ ๊ธฐํƒ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ) ํ•˜์ง€๋งŒ ํŠธ์œ„ํ„ฐ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์ด ํฌํ•จ๋œ ๋งˆ์ง€๋ง‰ ํ”„๋กœ์ ํŠธ๋กœ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (๊ทœ์น™ ์ˆœ์„œ์— ๋ฌธ์ œ ์—†์Œ) ์•Œ๋ ค์ฃผ์„ธ์š” ;)

http://mqhelper.nokturnalapp.com

์—ฌ๋ณด์„ธ์š”!

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ• ๋‹น๋˜์—ˆ์Šต๋‹ˆ๊นŒ? less๋กœ ์ƒ์„ฑํ•  ๋•Œ CSS ํŒŒ์ผ์„ ์ค„์ด๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋ชจ๋“  @mq๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@AoDev mqhelper๋Š” ํ™•์‹คํžˆ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” CSS ๋ฆฐํŒ… ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ ์œ ์šฉํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ๋ชจ์˜ ํ”„๋ก ํŠธ ์—”๋“œ ํ•ญ๋ชฉ์—์„œ ์ถ”์ถœํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ํ•˜์ง€๋งŒ ๋‚ด ์•ฑ์˜ ๋ชฉํ‘œ๋Š” "์‹ค์ œ ๋„๊ตฌ"์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ดํ•˜๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ๋ณด์•˜๊ณ  ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ๊ณ  ๊ทธ ์ผ๋ถ€๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ "์‹ค์ œ" ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์ด๋ฏธ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊น”๋”ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@Soviut @lukeapage ์„ ํƒ์  ๊ทธ๋ฃนํ™”๊ฐ€ ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์บ์Šค์ผ€์ด๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ์™„์ „ํžˆ ๋˜๋Š” ์ „ํ˜€ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๊ทธ๋ฃน ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<strong i="8">@tablet</strong>: (max-width: 979px);

.a {
  color: yellow;
  <strong i="9">@media</strong> <strong i="10">@tablet</strong> group {
    color: red;
  }
}
.b {
  background: black;
  <strong i="11">@media</strong> <strong i="12">@tablet</strong> group {
    background: white;
  }
}

//output
.a { color: yellow; }
.b { background: black; }
<strong i="13">@media</strong> (max-width: 979px) {
  .a { color: red; }
  .b { background: white; }
}

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๊ทธ๋ฃนํ™”๋Š” ์ •๋ง ์ข‹์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ๋‚˜๋Š” ์ด ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐํ•ด ๋ƒˆ๊ณ , ์ค‘๋ณต๋œ ์†์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ณง ์ถœ์‹œ๋  :extend ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

// Define the media queries
<strong i="7">@step1</strong>: ~"only screen and (max-width: 960px)";
<strong i="8">@step2</strong>: ~"only screen and (min-width: 961px)";

// Default empty mixins
.step1() {}
.step2() {}

// Custom styles
.test { color: blue; }

// Change the style in the media queries
.step1() {
  .test { color: red; }
}

.step2() {
  .test { color: green; }
}

// Finally render the media queries
<strong i="9">@media</strong> <strong i="10">@step1</strong> { .step1(); }
<strong i="11">@media</strong> <strong i="12">@step2</strong> { .step2(); }

@AoDev ๊ฐ€ ๋งŒ๋“  ๋„๊ตฌ๋Š” "์ „๋ถ€ ์•„๋‹ˆ๋ฉด ์ „๋ฌด" ์ ‘๊ทผ ๋ฐฉ์‹์ด ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•จ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๊ทธ๋ฃนํ™”๋Š” ์Šคํƒ€์ผ ๊ทธ๋ฃนํ™”/์žฌ์ •๋ ฌ๊ณผ ๊ฐ™์€ ๋ถ€์ž‘์šฉ์„ ๊ฒช์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋˜๋Š” ์ „ํ˜€ ๋ฐฉ๋ฒ•์— ๊ฒฐํ•จ์ด ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์‹ค์ œ ์˜ˆ์ œ( @AoDev ์—์„œ ๋งŒ๋“  ๋„๊ตฌ ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ)๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@kamranayub ์€ ๋‚ด๊ฐ€ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ์ •ํ™•ํ•œ ์ƒํ™ฉ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ์ด ๊ตฌํ˜„์˜ ์–ด๋–ค ํ˜•ํƒœ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. @DesignByOnyx , ์•„๋ž˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” @AoDev ์˜ ๋„๊ตฌ๋กœ ์ œ๋Œ€๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ธ๊ธ‰ํ•œ kamranayub์ฒ˜๋Ÿผ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์Šคํƒ€์ผ๋ง์„ ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋” ํฐ ์‚ฌ์ดํŠธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ ์€ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ›จ์”ฌ ๋” ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค.

.footer ul {

  margin: 10px;

  <strong i="9">@media</strong> @layout-tablet, @layout-full {
    font-size: 13px;
    font-weight: bold;
  }
  <strong i="10">@media</strong> @layout-mobile {
    font-size: 10px;
    padding-left: 10px;
  }

  li {

    background: black;
    color: white;
    padding: 10px;

    <strong i="11">@media</strong> @layout-tablet, @layout-full { .border-radius(@radius) }
    <strong i="12">@media</strong> @layout-mobile { .border-radius(@radius-mobile) }   
  }

}

๋” ์ ์€ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค
CSS๋กœ.
2013๋…„ 7์›” 2์ผ ์˜คํ›„ 9์‹œ 19๋ถ„์— "P Macom" [email protected]์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@kamranayub https://github.com/kamranayub ๋Š” ์ •ํ™•ํ•œ ์„ค๋ช…์„ ์™„๋ฒฝํ•˜๊ฒŒ
๋‚ด๊ฐ€ ์ฒ˜ํ•œ ์ƒํ™ฉ. ๊ฐœ์ธ์ ์œผ๋กœ ํ˜•ํƒœ๊ฐ€ ์ข€ ๋‚˜์™”์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žจ์ž…๋‹ˆ๋‹ค
์ด ๊ตฌํ˜„์˜. @DesignByOnyx https://github.com/DesignByOnyx ,
์•„๋ž˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” @A oDevhttps://github.com/AoDev ๋กœ ์ œ๋Œ€๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
๋„๊ตฌ. ๋‚˜๋Š” ์–ธ๊ธ‰ํ•œ kamranayub์ฒ˜๋Ÿผ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์Šคํƒ€์ผ๋ง์„ ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
๋” ํฐ ์‚ฌ์ดํŠธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ ์€ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ›จ์”ฌ ๋” ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค.

.๋ฐ”๋‹ฅ๊ธ€ ul {

์—ฌ๋ฐฑ: 10px;

@media @layout-tablet, @layout-full {
๊ธ€๊ผด ํฌ๊ธฐ: 13px;
๊ธ€๊ผด ๋‘๊ป˜: ๊ตต๊ฒŒ;
}
@media @layout-mobile {
๊ธ€๊ผด ํฌ๊ธฐ: 10px;
ํŒจ๋”ฉ ์™ผ์ชฝ: 10px;
}

๋ฆฌ {

background: black;
color: white;
padding: 10px;

<strong i="34">@media</strong> @layout-tablet, @layout-full { .border-radius(@radius) }
<strong i="35">@media</strong> @layout-mobile { .border-radius(@radius-mobile) }

}
}

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ Gi tHubhttps://github.com/less/less.js/issues/950#issuecomment -20369038์—์„œ ํ™•์ธํ•˜์„ธ์š”.
.

LESS๊ฐ€ ์ฒ˜๋ฆฌ๋œ ํ›„ @AoDev ์˜ ๋„๊ตฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ง์„ ์‹คํ–‰ํ•˜์ž๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‚ด ๋จธ๋ฆฌ ๊ผญ๋Œ€๊ธฐ์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

LESS๊ฐ€ ์ฒ˜๋ฆฌ๋œ ํ›„ @AoDev ์˜ ๋„๊ตฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ง์„ ์‹คํ–‰ํ•˜์ž๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‚ด ๋จธ๋ฆฌ ๊ผญ๋Œ€๊ธฐ์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ž„์‹œ ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @AoDev ์˜ ์†”๋ฃจ์…˜์„ grunt.js ๋ชจ๋“ˆ์— ๋ž˜ํ•‘ํ•˜์—ฌ LESS๊ฐ€ ์ฒ˜๋ฆฌ๋œ ํ›„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด๋Š” ์‚ฌ์ „ ์ฒ˜๋ฆฌ๊ฐ€ ์ฆ‰์„์—์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐฐํฌ ์ „์— ์ˆ˜ํ–‰๋จ)

๊ทธ๋ŸฐํŠธ ์ž‘์—…์€ ์ค‘๊ฐ„์— ํ™•์‹คํžˆ ์ข‹๊ณ  ์›์‹œ CSS์— ๋ณดํŽธ์ ์œผ๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ @media magic LESS๊ฐ€ ์ด๋ฏธ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•˜๋ฉด ๊ทธ๋ฃนํ™” ์˜ต์…˜์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ Grunt ํƒœ์Šคํฌ๋Š” ๋ชจ๋ฐ”์ผ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ฆ‰์„์—์„œ ๋กœ๋“œํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์ž์ฒด ํŒŒ์ผ๋กœ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์œ ์šฉํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๋ฅผ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์†Œ์Šค ํŒŒ์ผ์„ ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ์„ ํƒ์ ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ณ„๋„์˜ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ์ตœ์ ํ™” ๋„๊ตฌ์— ๋Œ€ํ•œ ๋ฒ”์œ„๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๊นŒ?

์ „์ ์œผ๋กœ. CSSO๊ฐ€ ์ด๋ฏธ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ์œ ์ผํ•œ CSS ์žฌ์ž‘์„ฑ์ž์ด๊ธฐ๋„ ํ•˜๋ฏ€๋กœ ์ด์™€ ๊ด€๋ จ๋œ Grunt ์ž‘์—…๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์žฌ์ž‘์„ฑ์€ DOM ๊ตฌ์กฐ์™€ ๋‹ฌ๋ฆฌ ๋™์ผํ•œ ์„ ํƒ์ž์™€ ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ ์ž…๋‹ˆ๋‹ค.

Mqhelper๋Š” ์ด๋ฏธ ๊ฐœ๋ณ„ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. github ํ™•์ธ
์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ฑฐ๊ธฐ์—์„œ ๋ถ„๋ฆฌ๋œ css ํŒŒ์ผ์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2013๋…„ 7์›” 5์ผ ์˜ค์ „ 10์‹œ 8๋ถ„์— "Soviut" [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ „์ ์œผ๋กœ. CSS๊ฐ€ ์ด๋ฏธ ์œ ์ผํ•œ CSS์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์•„๋Š” rewriter์—๋„ ์ด์™€ ๊ด€๋ จ๋œ Grunt ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ฌ์ง€์–ด
๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ,
๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•œ ์„ ํƒ์ž์™€ ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ ์ž…๋‹ˆ๋‹ค.
DOM ๊ตฌ์กฐ์™€ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ Gi tHubhttps://github.com/less/less.js/issues/950#issuecomment -20505834์—์„œ ํ™•์ธํ•˜์„ธ์š”.
.

๊ทธ๋‹ค์ง€ ์–ด๋ ต์ง€ ์•Š๊ณ  ๋œ ์žฅ๊ธฐ๊ฐ„์— ์œ ์šฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
(๊ทธ๋ฃนํ™” ์˜ต์…˜๊ณผ ๋ณ„๋„์˜ ํŒŒ์ผ ์˜ต์…˜ ๋ชจ๋‘)
๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์œ ํ˜•์˜ "์„น์…˜" ๋˜๋Š” "๊ทธ๋ฃน" ์•„์ด๋””์–ด๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ผ๋ฐ˜ CSS์— ๋Œ€ํ•ด ์ •์˜๋œ ์ฝ”๋“œ์—์„œ @media ์†์„ฑ ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์›ํ•˜์ง€๋งŒ ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋‹จ์ผ @media ์ฟผ๋ฆฌ๋กœ ๊ทธ๋ฃนํ™”๋˜๋„๋ก ํ•˜๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ LESS ๊ธฐ๋Šฅ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐฐ์น˜๋ฅผ ์ž˜ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์— ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ์ถ”๊ฐ€ ์ฝ”๋”ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ๊ณ„์† ์ž‘์—…ํ•˜์‹ญ์‹œ์˜ค). ๊ณ ๋ คํ•˜๋‹ค:

<strong i="8">@media</strong> screen {
  .my-class > .mediaScreen();
  #screenSpace1(screen);
  #screenSpace2(screen);
}

//technique #1 only works for a top level class or id that can act as a namespace
//and would not handle a deep nesting very well
.my-class {
  regular-property: value;

  .mediaScreen(<strong i="9">@selectorString</strong>: ~'.my-class') { //full path needs repeat here if deeply nested
    @{selectorString} {
      media-screen-property: value;
    }
  }
}

//technique #2 allows for tag selectors and easier deeper nesting 
#screenSpace1(<strong i="10">@place</strong>: noMedia) {
  div > ul {
    .setProps() when (<strong i="11">@place</strong> = noMedia) {
       regular-property: value;
    }
    .setProps() when (<strong i="12">@place</strong> = screen) {
       screen-property: value;
    }
    .setProps();

    li {
       .setProps() when (<strong i="13">@place</strong> = noMedia) {
          regular-property: value;
          &:hover { regular-property: value; }
       }
       .setProps() when (<strong i="14">@place</strong> = screen) {
          screen-property: value;
          &:hover { screen-property: value; }
        }
       .setProps();
    }
  }
}
#screenSpace1();

.more-classes-not-needing-media {property: value;}

#screenSpace2(<strong i="15">@place</strong>: noMedia) {
  .someClass {
    .setProps() when (<strong i="16">@place</strong> = noMedia) {
       regular-property: value;
    }
    .setProps() when (<strong i="17">@place</strong> = screen) {
       screen-property: value;
    }
    .setProps();

    > a {
       .setProps() when (<strong i="18">@place</strong> = noMedia) {
          regular-property: value;
          &:hover { regular-property: value; }
       }
       .setProps() when (<strong i="19">@place</strong> = screen) {
          screen-property: value;
          &:hover { screen-property: value; }
        }
       .setProps();
    }
  }
}
#screenSpace2();

์ด CSS๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

<strong i="23">@media</strong> screen {
  .my-class {
    media-screen-property: value;
  }
  div > ul {
    screen-property: value;
  }
  div > ul li {
    screen-property: value;
  }
  div > ul li:hover {
    screen-property: value;
  }
  .someClass {
    screen-property: value;
  }
  .someClass > a {
    screen-property: value;
  }
  .someClass > a:hover {
    screen-property: value;
  }
}
.my-class {
  regular-property: value;
}
div > ul {
  regular-property: value;
}
div > ul li {
  regular-property: value;
}
div > ul li:hover {
  regular-property: value;
}
.more-classes-not-needing-media {
  property: value;
}
.someClass {
  regular-property: value;
}
.someClass > a {
  regular-property: value;
}
.someClass > a:hover {
  regular-property: value;
}

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.

/*
 * Span mixins
 * adapted from Gridpak Beta LESS
 * http://gridpak.com/
 * Created by <strong i="6">@erskinedesign</strong>
 */

.mixin-span(<strong i="7">@num</strong>, <strong i="8">@gutter_pc</strong>, <strong i="9">@padding</strong>, @max_columns) when (<strong i="10">@num</strong> > @max_columns) {
    .mixin-span(<strong i="11">@max_columns</strong>, <strong i="12">@gutter_pc</strong>, <strong i="13">@padding</strong>, @max_columns);
}
.mixin-span(<strong i="14">@num</strong>, <strong i="15">@gutter_pc</strong>, <strong i="16">@padding</strong>, @max_columns) when (<strong i="17">@num</strong> =< @max_columns) {
    <strong i="18">@one_col</strong>: (100% - (<strong i="19">@gutter_pc</strong> * (<strong i="20">@max_columns</strong> - 1))) / @max_columns;
    width:(<strong i="21">@one_col</strong> * @num) + (<strong i="22">@gutter_pc</strong> * (<strong i="23">@num</strong> - 1));
    padding:@padding;
    margin-left:@gutter_pc;
}
.mixin-span_first() {
    margin-left:0;
}

// end of adapted Gridpak LESS

// Namespaced mixin sets

#mob{
    <strong i="24">@max_columns</strong>: 1;
    <strong i="25">@padding</strong>: 0 1.5%;
    <strong i="26">@gutter_pc</strong>: 5%;

    .span(@col){
        <strong i="27">@media</strong> screen and (max-width:300px){
            .mixin-span(<strong i="28">@col</strong>, <strong i="29">@gutter_pc</strong>, <strong i="30">@padding</strong>, @max_columns);
            .mixin-span_first;
        }
    }
}

#desk{
    <strong i="31">@max_columns</strong>: 10;
    <strong i="32">@padding</strong>: 0 3%;
    <strong i="33">@gutter_pc</strong>: 5%;

    .span(@col){
        <strong i="34">@media</strong> screen and (min-width:301px){
            .mixin-span(<strong i="35">@col</strong>, <strong i="36">@gutter_pc</strong>, <strong i="37">@padding</strong>, @max_columns);
        }
    }
}

//assign different layouts per namespaced breakpoint
/* ----- Header ----- */
#header{
    #mob > .span(2);
    #desk > .span(4);
    .mixin-span_first;
    background-color:#888;
    color:#fff;
}

/* ----- Main ----- */
#main{
    #mob > .span(1);
    #desk > .span(6);
    background-color:#eee;
    color:#111;
}

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ฃนํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ๋œ CSS๊ฐ€ ์•ฝ๊ฐ„ ๋ถ€ํ”ผ๊ฐ€ ์ปค์ง‘๋‹ˆ๋‹ค.

/* ----- Header ----- */
#header {
  margin-left: 0;
  background-color: #888;
  color: #fff;
}
<strong i="41">@media</strong> screen and (max-width: 300px) {
  #header {
    width: 100%;
    padding: 0 1.5%;
    margin-left: 5%;
    margin-left: 0;
  }
}
<strong i="42">@media</strong> screen and (min-width: 301px) {
  #header {
    width: 37%;
    padding: 0 3%;
    margin-left: 5%;
  }
}
/* ----- Main ----- */
#main {
  background-color: #eee;
  color: #111;
}
<strong i="43">@media</strong> screen and (max-width: 300px) {
  #main {
    width: 100%;
    padding: 0 1.5%;
    margin-left: 5%;
    margin-left: 0;
  }
}
<strong i="44">@media</strong> screen and (min-width: 301px) {
  #main {
    width: 58%;
    padding: 0 3%;
    margin-left: 5%;
  }
}

์ด https://github.com/buildingblocks/grunt-combine-media-queries์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ์ตœ์†Œ ๋„ˆ๋น„๋กœ๋งŒ ์ฃผ๋ฌธํ•˜๋ฏ€๋กœ ์ฃผ๋กœ ๋ชจ๋ฐ”์ผ ์šฐ์„  ์‚ฌ์ดํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

IMO ๋ฌธ์ œ #930์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•  ๋ฒ”์œ„ ๊ทธ๋ฃนํ™” ์ œ์–ด๋กœ ๋ฌธ์ œ๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

ํ›Œ๋ฅญํ•œ ๋„๊ตฌ @krava ! ๊ฐ์‚ฌ ํ•ด์š”

์ตœ๊ณ !!! IMO๋Š” LESS์—์„œ KRAVA์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

+1

ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ํž˜๋“ค์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋„ˆ๋ฌด ๋งŽ์ด!

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์‹œ์Šคํ…œ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ(options.json)์„ ์ž๋™ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ, ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ต์…˜์ด ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด์—์„œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ถœ๋ ฅ ๋‹จ๊ณ„์—์„œ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ถœ๋ ฅ๋œ CSS๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

http://helloanselm.com/2014/web-performance-one-or-thousand-media-queries/
์ด ๊ธฐ์‚ฌ์— ๋”ฐ๋ฅด๋ฉด ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ CSS ํŒŒ์ผ์˜ ํฌ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ˆ˜์‹ญ ๊ฐœ์˜ <strong i="5">@media</strong> screen and (max-width: 480px) ๋ฌธ์ž์—ด์ด CSS ํŒŒ์ผ ํฌ๊ธฐ ์ธก๋ฉด์—์„œ ์ถ”๊ฐ€๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” SO์—์„œ ์ด ์งˆ๋ฌธ์„ ํ–ˆ๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ถ€๋ถ„์ ์œผ๋กœ ๋Œ€๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.

@seven-phases-max๊ฐ€ ๋‹ต๋ณ€์„ ์ œ๊ณตํ–ˆ์œผ๋ฉฐ ๊ทธ์˜ ๋‹ต๋ณ€์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋ฉ”ํƒ€ ;)

๋‚˜๋Š” ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌํ›„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋Œ€์กฐ์ ์œผ๋กœ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์‹คํžˆ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ณ‘ํ•ฉ๋˜๋Š” ํ•ญ๋ชฉ๊ณผ ๋ฐฉ๋ฒ•์„ ๋” ์‰ฝ๊ฒŒ ์ž…๋ ฅํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์ฃผ์„์—์„œ ๋‚ด ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/less/less.js/issues/950#issuecomment -17723748

๋ฐฉ๊ธˆ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๊ทธ๋ฃนํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๊ทธ๋ŸฐํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

https://github.com/buildingblocks/grunt-combine-media-queries

https://github.com/Se7enSky/grunt-group-css-media-queries

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๊ฟ€๊บฝ .
http://github.com/konitter/gulp-combine-media-queries

v2๋ถ€ํ„ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ https://github.com/bassjobsen/less-plugin-group-css-media-queries (๋ฐ https://github.com/bassjobsen/less-plugin-pleeease)๋ฅผ ์ฐธ์กฐ

ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ง€์›ํ•˜๊ณ  ์ฝ”์–ด๋กœ ์ด๋™ํ•˜๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ซ๊ธฐ(AFAIK - @less/admin์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ์ˆ˜์ •).

@gyopiazza https://github.com/less/less.js/issues/950#issuecomment -17723748 ์œ„์˜ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค: ์™œ ๋ฏน์Šค์ธ์„ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๋‚˜์š”? ๋‚ด ๋ง์€, CSS๋Š” init ์—†์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฒ” ์‚ฌ๋ก€์™€ ์‚ฌ์šฉ๋ฒ•์„ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@nfq ์ด๊ฒƒ์€ ์ดˆ๊ธฐํ™”๊ฐ€ ์•„๋‹ˆ๋ผ "๊ธฐ๋ณธ" ๋นˆ ์ •์˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ .step*() ๋ฏน์Šค์ธ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: "default" .step*() ์ •์˜ ๋ฐ ํ•ด๋‹น ๋ Œ๋”๋ง์ด ์ผ๋ถ€ ์ผ๋ฐ˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ, ์‚ฌ์šฉ์ž ์ •์˜ .step*() ์ •์˜๋Š” ํ…Œ๋งˆ/ํ”„๋กœ์ ํŠธ ํŠน์ • ์ฝ”๋“œ์— ์žˆ์Œ).

@nfq ์‹ค์ œ๋กœ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
@seven-phases-max๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฏน์Šค์ธ์„ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์—์„œ ๋ฏน์Šค์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Btw, ์ด ๊ธฐ์ˆ ์˜ ์žฅ์ ์€ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„(์•ฝ๊ฐ„)์ด ๋Š๋ ค์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@gyopiazza ๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ ์Šคํƒ€์ผ์‹œํŠธ์˜ ๋งจ ์•„๋ž˜์— ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๊ฐ€์žฅ ์‰ฝ๊ณ  ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!!

@seven-phases-max ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋‹ต๋ณ€์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋œ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋งŒ, ํŠน์ • ์ผ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์•„์ง ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค!

clean-css๋„ v3๋ถ€ํ„ฐ @media ๋ณ‘ํ•ฉ์„ ์ง€์›ํ•˜๊ณ  less-plugin-clean-css๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

main.less ์‚ฌ์šฉ:

header {
    color: green;

    <strong i="9">@media</strong> only screen (max-width: 500px) { color: red; }
}

footer {
    color: green;

    <strong i="10">@media</strong> only screen (max-width: 500px) { color: red; }
}

lessc --clean-css="advanced" main.less ์ถœ๋ ฅ:
footer,header{color:green}<strong i="15">@media</strong> only screen (max-width:500px){footer,header{color:red}}

less-plugin-clean-css๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ --skip-advanced๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. @media ๋ณ‘ํ•ฉ์„ ์œ„ํ•ด advanced ์˜ต์…˜์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@nfq "mixin ๋ฐฉ์‹"์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ๋งจ ์•„๋ž˜(๋˜๋Š” ์„ ์–ธํ•œ ๋ชจ๋“  ์œ„์น˜)์—์„œ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

@gyopiazza ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค!!

@bassjobsen ๋” ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๊ฒƒ์„ ํ™•์‹คํžˆ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„์ง Less ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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