Less は、CSS をより使いやすく、よりメンテナンスしやすくするための CSS プリプロセッサです。
ページを読み込む度にクライアントサイドで Less から CSS に変換するので速度の面では不利ですが、サーバサイド変換方式よりも手軽に Less を試すことができます。Less のファイルを読み込んだ後、less.js (less.min.js) を読み込むことで、Less構文を CSS に変換します。
<link rel="stylesheet/less" type="text/css" href="style.less"> <script src="http://cdnjs.cloudflare.com/ajax/libs/less.js/2.5.1/less.min.js"></script>
less.js は下記からもダウンロードすることができます。
通常の Chrome ではセキュリティ設定により、less.js をローカルで動かすことができませんが、Chrome の起動オプションに下記を追加することで、実行可能になります。
"C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files
URL の最後に #!watch を追加すると、less ファイルの更新を監視し、リアルタイムに変更を反映させることができます。
http://~/~/test.html#!watch
Lessコンパイラは、Node.js のパッケージマネージャ npm を用いて下記の様にインストールすることができます。
$ npm install -g less
Less コンパイラ(lessc)を用いて、Less ファイルをコンパイルします。下記の例では、style.less ファイルを style.css ファイルにコンパイル(変換)しています。
$ lessc style.less style.css
--clean-css オプションをつけると、minified された CSS ファイルを作成することができます。プラグインがインストールされていない場合は、npm で less-plugin-clean-css プラグインをインストールしてください。
$ lessc --clean-css styles.less styles.min.css
通常の CSS のコメント /* ... */ に加え、// から行末までもコメントとみなされます。コンパイルすると // コメントは削除されます。
/* ここはコメント */ /* * ここもコメント */ // ここもコメント h1 { color: red; }
/* ここはコメント */ /* * ここもコメント */ h1 { color: red; }
@import を用いて他の Less ファイルをインポートすることができます。拡張子を省略すると ファイル名.less が読み込まれます。
@import "mystyle"; // "mystyle.less" * { color: @mycolor; }
* { color: #469; }
@import に続く (...) の中にいくつかのオプションを指定することができます。オプションは下記などを指定します。
@import (optional, reference) "style.less";
下記の様に、変数(@変数名) を定義・使用することができます。"..." や '...' の中で参照する際は、@{変数名} と記述します。
@mycolor: #369; @imgdir: "../image"; h1 { color: @mycolor; borde: 2px solid @mycolor; background: url("@{imgdir}/sample.png"); }
h1 { color: #369; border: 2px solid #369; background: url("../image/sample.png"); }
セレクタやプロパティ名を変数定義することもできます。この場合も @{変数名} で参照します。
@headers: h1, h2, h3, h4, h5, h6; @property: color; @{headers} { @{property}: black; }
h1, h2, h3, h4, h5, h6 { color: black; }
変数名を変数定義することもできます。
@name: "mycolor"; @mycolor: red; h1 { color: @@name; }
h1 { color: red; }
変数を定義する場所は、参照する場所より前でも後ろでも構いません。
h1 { color: @mycolor; } @mycolor: red;
h1 { color: red; }
加減乗除などの演算を行うことができます。
.mybox { width: 200px * 2; color: #888888 / 2; }
.mybox { width: 400px; color: #444444; }
小数をパーセントに変換する percentage(), 彩度を高める saturate(), 色を明るくする lighten() など、数多くの関数を使用することができます。
@mycolor: #f00; .mybox1 { background-color: lighten(@mycolor, 10%); } .mybox2 { background-color: lighten(@mycolor, 20%); } .mybox3 { background-color: lighten(@mycolor, 30%); }
.mybox1 { background-color: #ff3333; } .mybox2 { background-color: #ff6666; } .mybox3 { background-color: #ff9999; }
ミックスイン(mixin) は、継承用に利用されるクラス定義です。下記の例では、.mybox というミックスインを定義し、これを h4 の CSS 定義で利用(継承)しています。
.mybox { border: 1px solid #999; } h4 { color: #336; .mybox; }
.mybox { border: 1px solid #999; } h4 { color: #336; border: 1px solid #999; }
下記の様に、引数を受け取るミックスインを定義することができます。
.mybox(@width; @color) { border: @width solid @color; } h1 { .mybox(1px; #666); }
h1 { border: 1px solid #666666; }
引数のセパレータにはセミコロン(;) またはカンマ(,)を使用できますが、カンマは他のセパレータとしても使用されることがあるため、引数セパレータにはセミコロンを用いることが推奨されています。
.myfont(@size; @family) { font-size: @size; font-family: @family; } h1 { .myfont(9pt; Arial, Courier); }
h1 { font-size: 9pt; font-family: Arial, Courier; }
下記の様に、引数にデフォルト値を指定し、名前付き引数を指定することができます。
.mybox(@width: 1px; @color: black) { border: @width solid @color; } h1 { .mybox(@color: #666); }
h1 { border: 1px solid #666666; }
@arguments は、すべての引数を参照します。
.mybox(@x:0; @y:0; @blur:1px; @color:#000) { box-shadow: @arguments; -moz-box-shadow: @arguments; -webkit-box-shadow: @arguments; } h1 { .mybox(@blur:3px); }
h1 { box-shadow: 0 0 3px #000000; -moz-box-shadow: 0 0 3px #000000; -webkit-box-shadow: 0 0 3px #000000; }
@rest... は、残りの引数を参照します。
.mybox(@width; @rest...) { border: @width @rest; } h1 { .mybox(1px, solid, #666666); }
h1 { border: 1px solid #666666; }
when (...) により、ミックスインを定義する条件を指定することができます。
@mode: large; .mybox when (@mode = large) { width: 1200px; } .mybox when (@mode = small) { width: 768px; }
.mybox { width: 1200px; }
下記の様に、引数にマッチする条件によって適用するミックスインを変更することができます。
.mybox(thin, @color) { border: 1px solid @color; } .mybox(thick, @color) { border: 4px solid @color; } h1 { .mybox(thin, red); }
h1 { border: 1px solid red; }
!important を指定すると、CSS 定義に !important が指定されます。
.mybox(@color) { color: @color; } h1 { .mybox(red) !important; }
h1 { color: red !important; }
下記の様に、親子の階層をネストして記述することができます。CSS にくらべ、より構造的にスタイルを定義することができます。
#page { @mycolor: #469; #header { color: @mycolor; } #body { color: @mycolor; } #footer { color: @mycolor; } }
#page #header { color: #446699; } #page #body { color: #446699; } #page #footer { color: #446699; }
& は、親セレクタを示します。
a { &:link { color: #369; } &:visited { color: #369; } }
a:link { color: #369; } a:visited { color: #369; }
下記の様にして、if 文のような記述をすることができます。
@mode: large; body { & when (@mode = large) { padding: 0 20px 0 20px; } }
body { padding: 0 20px 0 20px; }
下記の様に、クラスの中に @media 等のディレクティブを記述することもできます。
.mycolor { @media screen { color: #f00; @media (min-width: 768px) { color: #0f0; } } @media tv { color: #00f; } }
@media screen { .mycolor { color: #f00; } } @media screen and (min-width: 768px) { .mycolor { color: #0f0; } } @media tv { .mycolor { color: #00f; } }
変数のスコープは、通常のプログラミング言語と同様、もっとも内側の { ... } 内で定義されたものが有効になります。
@color: red; .scopeA { @color: green; .scopeB { color: @color; } }
.scopeA .scopeB { color: green; }
下記の様にして、いくつかの Mixin を #my_mixins という名前でグルーピングすることができます。グループ中の Mixin を使用するには > を用いますが、> は省略することも可能です。
#my_mixins { .color(@color) { color: @color; } .border(@color) { border: 1px solid @color; } } .mybox { #my_mixins > .border(#999); }
.mybox { border: 1px solid #999; }
CSS3 の新しい機能や、ブラウザ依存の機能など、Less コンパイラが解釈できず、文法エラーとなってしまう場合、~"..." または ~'...' で Less のコンパイルをエスケープすることができます。
.mybox { width: calc(~"100% - 200px"); }
.mybox { width: calc(100% - 200px); }
&extend(...) を用いることで、単純なクラス名ではないセレクタ (.mytable td など)を継承することができます。
.mytable td { color: red; } .mytable2 td { &:extend(.mytable td); border: 1px solid gray; }
.mytable td, .mytable2 td { color: red; } .mytable2 td { border: 1px solid gray; }
when と再起呼び出しを用いることでループを実現することができます。
.myloop(@n) when (@n > 0) { .col@{n} { width: 100px * @n; } .myloop(@n - 1); } .myloop(3);
.col3 { width: 300px; } .col2 { width: 200px; } .col1 { width: 100px; }
プロパティ名の後ろに + をつけると、プロパティ名が重複する場合、値がカンマ(,)で連結されます。
.courier() { font-family+: Courier; } .helvetica() { font-family+: Helvetica; } h1 { font-family+: Arial; .courier(); .helvetica(); }
h1 { font-family: Arial, Courier, Helvetica; }
プロパティ名の後ろに +_ をつけると、プロパティ名が重複する場合、値がスペースで連結されます。
.border-width(@width) { border+_: @width; } .border-color(@color) { border+_: @color; } .border-style(@style) { border+_: @style; } h1 { .border-width(1px); .border-style(sorid); .border-color(gray); }
h1 { border: 1px sorid gray; }