タグ: LESS

  • LessでBEMってみたらかなりさくさくコーディングできた!という話

    BEMを使ったCSSのクラス設計(MindBEMding)ですが、これをSassでやろうとすると、結構泣けてきます。

    たとえばこんな感じになるんでしょうかね。

    $block: ".block";
    #{$block} {
    	display: block;
    }
    #{$block}__element {	
    	border: 1px solid #CCC;
    }
    
    #{$block}__element_modifier {
    	border-color: #FFF;
    }
    
    

    また、Sass 3.3以降だと、

    .block {
    	display: block;
    	@at-root {
    		#{&}__element {
    			border: 1px solid #CCC;
    			@at-root {
    				#{&}--modifier {
    					border-color: #FFF;
    				}
    			}
    		}
    	}
    	
    	//もしくはこんな感じ
    	@at-root {
    		#{&}__element {
    			border: 1px solid #CCC;
    		}
    
    		#{&}__element--modifier {
    			border-color: #FFF;
    		}
    	}
    }

    こんな感じで、BEMれるようです。
    参考: BEMという命名規則とSass 3.3の新しい記法 – アインシュタインの電話番号

    ただ、@at-rootなどを乱発したり、いちいちshiftをおしながら#{&}って入力していくのは、ちょっと大変すぎるなと個人的には感じます。というかめんどくさい。せっかくネストして楽にかけるはずのCSSが、より大変になっている気がしてしまいまして。

    LESSでやってみる

    Lessだと、こんな感じに書けて、

    .block {
    	display: block;
    	&__element {
    		border: 1px solid #CCC;
    		&--modifier {
    			border-color: #FFF;
    		}
    	}
    }
    

    このソースを、lessをcssに変換(less2css) | Magonote-toolsにコピペするなり、普通にlessで走らせるなりすると、

    .block {
      display: block;
    }
    .block__element {
      border: 1px solid #CCC;
    }
    .block__element--modifier {
      border-color: #FFF;
    }
     

    こうなります。こんな感じでLessはネストしつつ、しっかりBEMなCSSが出力されます。非常に直感的です!

    留意点

    SassとLessの大きな違いとなっていたextendがLess1.4から実装されましたが、&を含むセレクタのextendはできないようです。また、実際に出力されるセレクタを指定してもextendはできないようです。

    なので、.block__element–modifierに.block__elementのスタイルを継承するようなことはできず、html側で両方のclassを指定する必要があります。

    BEMという命名規則とSass 3.3の新しい記法 – アインシュタインの電話番号でも言及されていた、HTMLが冗長になってしまうと言う問題に対処することは難しいです。

    まとめ

    Windowsでも導入が簡単・JavaScriptとの相性が良いなどのSassには無いメリットもあるし、Compassでよく使うMixin等の移植もそこまで難しくないです。CssSpriteもCompass以外のツールで対応できますしね。

    Sassに比べるとCompassのようなフレームワークが無かったり、extendもSassのほうが若干協力だとかで
    なかなかLessを使おうという場面は少ないとは思いますが、それでもBEMとの相性がよいというのはなかなか見逃せない部分じゃないかなと思います。

    LessのextendもSassには無い書き方があったりしておもしろいですし、用途によって使い分けるとなかなか楽しいんじゃないですかね。

  • LESSでCSSを書いてみた

    CSSのメンテナンス性の悪さは広く知られて居るとは思いますが、その解決策として、SASSとかSCSSなどがあります。今回はその仲間のLESSの導入記録です。

    公式サイト:LESS « The Dynamic Stylesheet language

    LESSというのは、CSSのメタ言語で、コレをコンパイルすると、CSSが出力されます。
    LESSを使うとこんなことが出来ます。

    LESSを使うと出来ること

    • ルールのネスト
    • 変数
    • Mixin
    • 四則演算などちょっとした関数

    また、普通のCSSの記法も使えますので、リセット用のCSS等そのままコピペも可能です。

    ルールのネスト(階層化)

    CSSのルールをネスト出来ます。いちいちセレクタをコピペしなくていいし、コードの視認性や、構造が非常にわかりやすくなります。親のセレクタを再利用するには、”&”を用います。

    less
    [css]
    #header {
    h1 {
    font-size: 26px;
    font-weight: bold;
    }
    p { font-size: 12px;
    a { text-decoration: none;
    &:hover { border-width: 1px }
    }
    }
    }
    [/css]

    css
    [css]
    #header h1 {
    font-size: 26px;
    font-weight: bold;
    }
    #header p {
    font-size: 12px;
    }
    #header p a {
    text-decoration: none;
    }
    #header p a:hover {
    border-width: 1px;
    }

    [/css]

    変数

    css内で変数が使えます。色などの一括管理などにはかなり便利です。

    less
    [css]
    @color: #4D926F;

    #header {
    color: @color;
    }
    h2 {
    color: @color;
    }
    [/css]

    css
    [css]
    #header {
    color: #4D926F;
    }
    h2 {
    color: #4D926F;
    }
    [/css]

    Mixin

    Mixinっていうと難しく聞こえますが、他のプロパティ内で、読み込んで使えるプロパティのまとまりを作る事ができるということです。

    [css]
    .hoge(){
    color: #FFF;
    background-color: #000;
    }
    [/css]
    でMixin用のプロパティを作成できます。このプロパティ自体はCSSに出力されません。また変数なども入れることも出来ます。

    less
    [css]
    .rounded-corners (@radius: 5px) {
    border-radius: @radius;
    -webkit-border-radius: @radius;
    -moz-border-radius: @radius;
    }

    #header {
    .rounded-corners;
    }
    #footer {
    .rounded-corners(10px);
    }
    [/css]

    css
    [css]
    #header {
    border-radius: 5px;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    }
    #footer {
    border-radius: 10px;
    -webkit-border-radius: 10px;
    -moz-border-radius: 10px;
    }
    [/css]

    clearfixとかをMixinすると便利だったりします。

    ちょっとした計算など

    四則演算や、色を10%明るくするだとか、地味に便利な関数が用意されています。

    less
    [css]
    @the-border: 1px;
    @base-color: #111;
    @red: #842210;

    #header {
    color: @base-color * 3;
    border-left: @the-border;
    border-right: @the-border * 2;
    }
    #footer {
    color: @base-color + #003300;
    border-color: desaturate(@red, 10%);
    }
    [/css]

    css
    [css]
    #header {
    color: #333;
    border-left: 1px;
    border-right: 2px;
    }
    #footer {
    color: #114411;
    border-color: #7d2717;
    }
    [/css]

    他のLESSファイルのインポート

    [css]
    @import "reset.less";
    @import "reset";
    [/css]
    とすることで、reset.lessが展開されます。lessファイルの場合、拡張子を省いても大丈夫です。

    結構ざっくりとした説明ですので、詳細は:lesscss.orgの方を参照して下さい。英語ですがコードを眺めていればだいたいつかめると思います。

    導入について

    公式サイトでは、less.jsで、ブラウザでコンパイルをさせています。
    [html]
    <link rel="stylesheet/less" type="text/css" href="styles.less">
    <script src="less.js" type="text/javascript"></script>
    [/html]
    こんな感じです。ソースのhead内にcssを展開します。
    簡単にできますが、かなりブラウザに負荷がかかるので、おススメできません。制作中等限定で使用したほうが良いかと思います。

    なので、Macの場合、公式アプリのless.appを活用しましょう。コレは、登録されたlessファイルが更新されたときに自動的にcssファイルを作成してくれるソフトです。特定のディレクトリ内lessファイルを検索もしてくれるので、開発用のディレクトリを指定しておくとかなり簡単です。自分の場合はコレをログイン時に起動するようにしています。

    windowsの場合はmach3さんがlessniumというアプリケーションを作成していますので、それが便利だと思います。>>TitaniumデスクトップでLESS.jsのフロントエンドをこさえてみた
    なお、Lessniumには、Titaniumが必須です。

    また、Node.jsなどでも動作しますので、そちらは公式サイトを参照して下さい。

    LESSを使うと、CSSの管理等が、非常に楽になりますし、効率良くCSSを書いていく事ができます。SASSとかSCSSとか多機能なものもありますが、LESSは学習コストが低いのとコンパイルの手間が少ないので、試してみてはどうでしょうか。

    LESS « The Dynamic Stylesheet language