๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋ฒ๋ธ๋ง์ ํ๋ฅญํ์ง๋ง:
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;
}
}
์ง์ ์ ์ฌ๊ตฌ์ฑํจ์ผ๋ก์จ ์๋ฏธ๋ฅผ ์ ์ฌ์ ์ผ๋ก ๋ณ๊ฒฝํ์ง ์๊ณ ์ด๋ป๊ฒ ํ ์ ์์ต๋๊น?
์๋ฏธ๊ฐ ๋ฐ๋ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ด๋ ์ผ๋ฐ ์ค๋ณต ํ๊ทธ๋ฅผ ์ถ์ํ๋ ๊ฒ๊ณผ ์ ํํ ๋์ผํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
body {
background: white;
}
body {
padding: 0;
margin: 0;
}
๋ค์์ผ๋ก ์ถ์๋ฉ๋๋ค.
body {
background: white;
padding: 0;
margin: 0;
}
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ ์ผ๋ฐ ์์ ์ ํ๊ธฐ ์์์ ์ ์ด ๊ณ์ธต ์ญํ ์ ํ๋ ํน๋ณํ ์ต์์ ์ ํ๊ธฐ์ด๊ธฐ ๋๋ฌธ์ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ๊ทธ๊ฒ๋ค์ ํ๋์ ์๋ฏธ๋ง์ ๊ฐ์ง๋ฉฐ ํ์ผ ๋ด์ ๋๋จธ์ง CSS์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
๋ํ, ๋ฒ๋ธ๋ง๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ์์๋ฅผ ์ด๋ฏธ ์ ์งํ๊ณ ์์ง ์๊ณ ์ ํํ ๋์ผํ ์ฟผ๋ฆฌ์ ๋ํด ๋ง์ ์ค๋ณต ์ ํ๊ธฐ๋ฅผ ์์ฑํ ๋ฟ์ ๋๋ค. ์ฒ๋ฆฌ๊ฐ ๋๋ ๋ ๋ฒํผ๋ง๋๊ณ ๋จ์ผ ์ฟผ๋ฆฌ์ ๊ธฐ๋ก๋ ์ ์๋ค๋ฉด ํจ์ฌ ๋ ๊น๋ํด์ง๊ณ ๋ ์์ CSS ์ถ๋ ฅ์ด ์์ฑ๋ ๊ฒ์ ๋๋ค.
๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋ด ์ ํ๊ธฐ ๋ณต์ก์ฑ์ ๋ํ ๊ท์น์ ๋ฌด์์
๋๊น? ํ
์ฟผ๋ฆฌ๊ฐ ๋ณต์ก์ฑ์ ๋์ด๊ณ ๋ชจ๋ ์์๋ฅผ ๋ฌด์ํฉ๋๊น? ์๋ฌด๋ฐ๋ ๊ฐ๋ฆฌํฌ ์ ์๋
๋ช
์ธ์?
๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ ์ต๋๋ค. ๋ฏธ๋์ด ์ ํ๊ธฐ๋ ์ผ๋ฐ ์คํ์ผ ๊ท์น์ ๋๋ฌ์ธ๊ณ ์ฟผ๋ฆฌ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉ๋๋ IF ๋ฌธ๊ณผ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ธ๋ผ์ฐ์ ์ ๋๋น๊ฐ ํน์ ํฝ์ ์๋ณด๋ค ์์ผ๋ฉด ์ฟผ๋ฆฌ ๋ด์ ๊ท์น์ด ์ค์ ๋๊ณ ๊ธฐ์กด ๊ท์น์ ๋ฌด์ํฉ๋๋ค.
๋ฐ๋ผ์ ๋จ์ผ ์คํ์ผ์ ์ฌ์ฉํ๋ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ ๊ทธ ์์ ๋ชจ๋ ์คํ์ผ์ด ํฌํจ๋ ํ๋์ ์ฟผ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ผ๋ก ๋์ผํฉ๋๋ค. ์ฟผ๋ฆฌ๊ฐ ๋์ผํ ํ.
๋ค์์ Mozilla์ ์ผ๋ถ ๋ฌธ์์ ๋๋ค.
๋ด ๋ง์ ์ด ์์์ ์ ๋๋ค. 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
์์ ์ฌ๋ฌ ํค์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ์๋๋ฉฐ ์ต์
์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋
ผ์์ ์ฌ์ง๊ฐ ๋ํ๋ค๋ ๊ฒ์ ๋ณด์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฆ์ ์ ์ฉํ๊ณ ์ ํ์ ์ธ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์์ฑ๋ ๊ฒฝ์ฐ ์ฌ์ ์๋ก ๊ณต์กดํ ์ ์๊ธฐ ๋๋ฌธ์ ์ต์ ์ ์ถ๊ฐํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
์๋ ํ์ธ์, ๋ฐฉ๊ธ ์ด ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋ฃนํํด์ผ ํ ๋ ๋ง๋ ์์ ์ฑ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค. ์ด๊ฒ์ ์์ฑ๋ ์ฑ์ด ์๋๋๋ค. ๋ฏธ๋์ ๋๊ตฌ์ ๋ํ ์ฐ๊ตฌ์ ๋น์ทํฉ๋๋ค. ๊ทธ๋์ ์ ๋ ์ฌ๋ฌ๋ถ์๊ฒ ๊ทธ ์์ด๋์ด๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ต๋๋ค. ์๋ํ๋ฉด ์ ๋ ๊ทธ๊ฒ์ด ๋ฐ๋์ ๊ตฌํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. (๋ฒ๊ทธ ๋ฐ ๊ธฐํ ๋ฌธ์ ๊ฐ ์์ ์ ์์) ํ์ง๋ง ํธ์ํฐ ๋ถํธ์คํธ๋ฉ์ด ํฌํจ๋ ๋ง์ง๋ง ํ๋ก์ ํธ๋ก ํ ์คํธํ์ผ๋ฉฐ ์ ๋๋ก ์๋ํฉ๋๋ค. (๊ท์น ์์์ ๋ฌธ์ ์์) ์๋ ค์ฃผ์ธ์ ;)
์ฌ๋ณด์ธ์!
๋๊ตฐ๊ฐ๊ฐ ํ ๋น๋์์ต๋๊น? 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
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ๊ฒฐํฉ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค ๊ฟ๊บฝ .
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 ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ธฐ ์์ํ์ง ์์์ต๋๋ค. ํ ๊ฐ์ฌํฉ๋๋ค!