とほほのLess入門
- Less とは
- Less を使用するには
- コメント
- インポート
- 変数
- 演算
- 関数
- ミックスイン
- ネストルール
- 親セレクタ
- ディレクティブのネスト
- スコープ
- 名前空間とアクセッサ
- エスケープ
- extend
- ループ
- 値のマージ
- リンク
Less とは
Less は、CSS をより使いやすく、よりメンテナンスしやすくするための CSS プリプロセッサです。
- Less は Leaner CSS の略です。lean は「無駄のない」、「効率的な」という意味を持ちます。
- 2009年に Alexis Sellier(@cloudhead)氏によって開発されました。
- 最初は Ruby で記述され、後に JavaScript に移植されました。
- 現在(2015年9月13日)時点の最新版は v2.5.1 です。
- 大半のブラウザは Less を直接解釈できないため、サーバサイドまたはクライアントサイドで CSS に変換する必要があります。
- 変数を使用できるので、色や幅などの値を一括で変更することができます。
- ミックスイン(クラス継承)を利用することにより、定義済みの CSS 定義を簡単に継承することができます。
- 関数を利用することにより、数学演算や色演算(もう少し明るくなど)を利用することができます。
Less を使用するには
クライアントサイド変換方式
ページを読み込む度にクライアントサイドで 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 に続く (...) の中にいくつかのオプションを指定することができます。オプションは下記などを指定します。
- reference - 呼び出し元から参照されたスタイルだけ展開し、未参照の定義を破棄します。
- inline - CSSファイルとして単純に読み込みします。CSS非互換ファイルを読み込む際に有効です。
- less - 拡張子に関わらず Less ファイルとして読み込みます。
- css - 拡張子に関わらず CSS ファイルとして読み込みます。
- once - 同名ファイルが指定された場合、一度だけ読み込みます(デフォルト)。
- multiple - 同名ファイルが指定された場合、重複して読み込みます。
- optional - ファイルが存在する時のみ、読み込みます。
@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)
@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...)
@rest... は、残りの引数を参照します。
.mybox(@width; @rest...) {
border: @width @rest;
}
h1 {
.mybox(1px, solid, #666666);
}
h1 {
border: 1px solid #666666;
}
条件(when)
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)
!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
&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;
}