CSSフレームワークだってやればできる子
はてなブックマーク - CSSフレームワーク『BlueTrip』が想像以上にすごい - present
盛り上がってますね。
私のようなCSSの文法はわかるけど効率よくCSS書くにはどうしたらいいの?とか、ぶっちゃけ細かいところめんどくさくて span-24 とか、そりゃやりたくなるよ、という人が多い一方で、「おいおい、そんなことしたら font-size="10.5pt" とHTMLに書いているのとかわらんだろうがー」とご立腹な人もいるわけです。
span-24 とかやるのは「デザインとHTMLを分離する目的で使うのではなくて、単にspan-24って書いて別ファイルにした方が効率的に配信できるじゃん」と割り切ってスルーする、というのもあるんですが、ちょっとカウンタークレームをがんばってみました。
less ですよ、less
要するに、span-24をHTMLファイルに書くんじゃなくて、CSSに書けばいいでしょ、ってことで。がんばります。
まずHTML。
<link rel="stylesheet" href="/stylesheets/sunrise.css" type="text/css" /> ... <h1 class="logo"> <a href="/">Sunrise</a> <span class="subTitle">Application container framework powered by node.js</span> </h1>
これならHTMLとして文句ないでしょう。
次デザイン。BlueTrip じゃなくてすいません。Blueprint のほうが慣れてしまっているので、その screen.css ファイルを /stylesheets/screen.less というファイルに保存して、次に、 /stylesheets/sunrise.less というファイルを作ります。
@import 'screen'; h1.logo { .span-24; }
これで http://xxxx:yyyy/stylesheets/sunrise.css にアクセスすると...
/* ----------------------------------------------------------------------- Blueprint CSS Framework 1.0 http://blueprintcss.org * Copyright (c) 2007-Present. See LICENSE for more info. * See README for instructions on how to use Blueprint. * For credits and origins, see AUTHORS. * This is a compressed file. See the sources in the 'src' directory. ----------------------------------------------------------------------- */ /* reset.css */ ... h1.logo { float: left; margin-right: 10px; width: 950px; }
こうなるんですよ。
どうやった?
これを使うと、CSSを拡張してプログラムっぽく書くことができます。なので、BluePrint の span-24 をマクロ展開するようなクラス定義を作ることができます。これでHTMLに出さずにBluePrint/CSSフレームワークを使うことができる!!
less ってどうやって使うの?
javascript なので、less.js をブラウザに読み込ませて、、、いやいや、そこは node.js で。
node.js上のWebフレームワークである express フレームワークでは標準でlessに対応しています。staticファイルとして .less のファイルを置けば勝手にコンパイルしてCSSの形ではいてくれます。
が、ちょっと問題があって コンパイル時の @import のサーチパスがうまく設定されていない。なので @import 'screen'; と普通にやってしまうとコンパイルエラーになります。
うーんと悩んででた解決策。
var compilers = require('connect/middleware/compiler').compilers; compilers.less.compile = function(str, fn){ var less = require('less'); try { var parser = new less.Parser({paths: ['path/to/root/of/your/stylesheet/']}); parser.parse(str, function(err, root){ fn(err, root.toCSS()); }); } catch (err) { fn(err); } }
コンパイラの設定を外側から書き換えてみました。これを起動時に呼び出すようにしておけば、screen.css に書かれた命令をマクロとして自分のCSSで使えますよ。