CSSを拡張して記述できるPHPベースのプリプロセッサPCSSとCSS Crush
公開:
更新:
CSSを拡張して記述できるものと言えば、SassとLESSが有名ですね。
これらはHTML/CSSフレームワークなどでも使われていたり、日本語での解説も多くあります。
ですが、今回はそのどちらでもない、PHPベースのプリプロセッサである「PCSS」と「CSS Crush」の簡単な説明をしてみたいと思います。
誤解のないように言っておきますが、これは「Rubyとか入れなくてもいいしこっち使おうぜ」という内容の記事ではありません。
こういうものもある、という程度に見ておくといいかもしれません。
また、この記事内の解説は公式ドキュメントを簡単にまとめたものです。 PCSS – CSS Server-side Preprocessor 「ショートカット志向サーバーサイドCSS3プリプロセッサ」とタイトルに書かれています。 PCSSが動作するにはPHP5が必要となります。 簡単な導入方法は、pcss.php をウェブサイトのディレクトリに置いて、普通のCSSファイルと同じように または これは最も簡単な導入方法ですが、PCSSを利用した他の方法もあります。 Apache の この場合、file.p.cssでpcss.php?css=file.pcssと同様のファイルを呼び出すことができます。また、これはカスタマイズ可能です。 文字列の先頭に 以下はその例です。 デフォルトの単位と画像ディレクトリを定義します。デフォルト画像ディレクトリは 指定例は次の通りです。 これらの指定が見つからない場合、 以下はその例です。 これは次のように出力されます(フォーマットはされません)。 classは入れ子で指定することができます。 これは次のように出力されます。 多くのclassを入れ子にすればするほどCSSは大きくなるので気をつけてください。 PCSSの中では、スラッシュを2回続けて書くことでPHPのようにコメントを書くことができます。 このコメントはCSSに出力されません。 事前定義された定数により、一部のセレクタや指定を短く書くことができます。 これは以下のように出力されます。 セレクタの定数は次のようなものです。 これは以下のように出力されます。 他にも様々な定数があります。詳しくは「Constants reference」を参照してください。 関数はCSSのように記述でき、CSSより短く、ブラウザごとに最適化されたCSSを書き出すことができます。 これは以下のように出力されます。 次の例を見てましょう。 これは以下のようになります(デフォルト単位が 次は背景画像です。 結果は次の通り。 では最後の例です。 これはFirefoxでページを見た場合、次のように出力されます。 Ineternet Explorer 9以下で見た場合は次のようになります。 他の関数については「Functions reference」を参照してください。 PCSSのサイトで使われているPCSSのコードはhttp://pcss.wiq.com.br/pcss.pcssで見ることができます。
詳しく見たい方は公式サイトをご覧ください。PCSS

PCSSではどんなことができるのか。その特徴を見てみます。@font-faceのコードをスリム化して出力するショートカットがあります。導入
<link>や@importで読み込むことです。<link rel="stylesheet" type="text/css" href="pcss.php?css=file.css" /><style type="text/css">@import url(pcss.php?css=file.css);</style>
次に説明するのは複数のCSSファイル(実際にはPCSSファイル)を1つのCSSファイルに出力するのに向いている方法です。<?php
include "pcss.php";
print new PCSS("file1.pcss");
print new PCSS("file2.pcss");
print new PCSS("file3.pcss");
?>mod_rewriteが有効な環境で.htaccessに下記を記述することにより、よりフレンドリーなURLにすることができます。RewriteEngine on
RewriteRule ^([a-zA-Z0-9_-]+).p.css$ pcss.php?css=$1変数
&[variable_name] = [value];&をつけることで変数として指定できます。
値は=(等号)で代入します。
末尾の;(セミコロン)は任意です。&mycolour = #fff;
&floatedbox = display:block; float:left;デフォルト値の定義
BGIMGPCSS関数で使用されます。
以下のように指定します。unit [unit]
imgdir [dirname]/* example 1 */
unit em
imgdir images
/* example 2 */
unit %
imgdir ../imgdirは空、unitにはpxが指定されます。ディレクトリ名の最後にスラッシュは必要ありません。@font-faceショートカット@font-faceを簡単に指定することができます。fontface [fontname] [fontfiles]fontface MyFont dir/myfont-file@font-face {
font-family: 'MyFont';
src : url('dir/myfont-file.eot') format('eot'),
url('dir/myfont-file.woff') format('woff'),
url('dir/myfont-file.ttf') format('truetype');
}classの入れ子
.class{ BLOCK;
.subclass{ HIDE; }
}.class {
display: block;
}
.class .subclass {
display: none;
}サーバーサイドコメント
// ここはコメントです定数
.class{
HIDE;
}.class{
display: none;
}.class FILE{
HIDE;
}.class input[type=file]{
display: none;
}
また、これらの定数は自分で作ることもできます。関数
.class{
FSIZE:14;
}.class{
font-size: 14px;
}FSIZEはfont-sizeの短縮形で、デフォルトの単位がpx(または指定されていない)だとこうなります。.class{
BOUNDS:5 10,0 0 10;
}pxの場合)。.class{
padding: 5px 10px; margin: 0 0 10px;
}BOUNDS関数はmarginとpaddingを一度に指定できます。.class{
BGIMG:someimage.png;
}.class{
background-image: url(images/someimage.png);
}BGIMGはbackground-imageの短縮形です。imgdirを定義してあれば、このように更に短く書くことができます。.class{
GRADIENT:#fff #000;
}.class{
background-image: -moz-linear-gradient(top, #fff, #000);
background-image: linear-gradient(top, #fff, #000);
}.class{
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#fff', EndColorStr='#000');
}GRADIENTはbackground-image: linear-gradiennt()の短縮形です。
また、この指定はサーバーサイドでブラウザを判別し、ブラウザごとに最適化されたコードを出力します。ROTATE関数も同じように働きます。
出力されるのはhttp://pcss.wiq.com.br/pcss.p.cssです。
ここまで PCSSの簡単な解説をしてきました。 CSS Crush ― An extensible PHP based CSS preprocessor 「拡張性のあるPHPベースのCSSプリプロセッサ」とのことです。 スクリプトをページに組み込み、 また、カスタムオプションを配列として渡すことができます。 ボイラープレートは、生成されるファイルの先頭にある次のような文です。 この内容はCssCrush.boilerplateというファイルに書かれています。 エイリアスにより、プロパティのベンダープレフィックスを自動でつけることができます。エイリアスはメインのスクリプトと同じディレクトリのファイルに格納されています。CssCrush.aliasesというファイルですね。 エイリアスは編集可能です。たとえば、 CSS Crushがファイルをコンパイルするときにエイリアスはロードされ、一致する全ての指定に適用されます。 エイリアスはプロパティ以外に、関数にも使えます。 @ルールにも可能です。 エイリアスが十分でない場合、PHPで書かれたマクロを定義することができます。 ファイルの中を見てみたところ、2011年9月2日のバージョンには上記の IE 7以下の IE6の IE7以下の 要らないものはコメントアウトしたりして使うように、だそうです。 CSS Crushにはシンプルな数学関数があります。 また、 変数は、@ルールの文法と同じように指定します。また、CSSの指定内では デフォルトではCSS Crushが出力するCSSはミニファイ(圧縮)されています。これはオプションでデバッグモードにすることで無効にできます。 ミニファイ時には以下のような変更が行われます。 CSS Crushのサイトで使われているCSS Crushファイルはhttp://the-echoplex.net/csscrush/css/global.cssで見ることができます。
次はCSS Crushをやっていきます。
感想などは最後に。CSS Crush

それでは機能などを見ていきたいと思います。導入
CssCrush::fileメソッドに処理したいCSSファイルへのパスを指定します。<?php
require_once 'CssCrush.php';
// この場合、生成または更新されるファイルパスは /css/screen.crush.css となります
$compiled_file = CssCrush::file( '/css/screen.css' );
?>
<link rel="stylesheet" type="text/css" href="<?php echo $compiled_file; ?>" /><?php
require_once 'CssCrush.php';
$compiled_file = CssCrush::file( '/css/screen.css', array(
'debug' => true, // ミニファイするかどうか(デフォルトはfalse)
'boilerplate' => false, // ボイラープレートを出力するかどうか(デフォルトはtrue)
'versioning' => false, // 出力されるファイル名にタイムスタンプのクエリ文字列をつけるかどうか(デフォルトはtrue)
));
?>/*
* CSS Crush(ed) on (時刻)
* http://github.com/peteboere/css-crush
*/ダイレクト
@import@importで呼び出されるファイルは、出力されるファイルに直接書き込まれます。これによりHTTPリクエストを減らすことができます。
また、@importにメディアの指定がある場合は、@mediaブロックで囲んで出力されます。/* コンパイル前 */
@import "print.css" print;
@import url( "small-screen.css" ) screen and ( max-width: 500px );
/* コンパイル後 */
@media print {
/* print.cssの中身がここに書き込まれます */
}
@media screen and (max-width: 500px) {
/* 小さいスクリーン向けのCSSファイルの中身 */
}
エイリアス
border-radiusのエイリアスは次のようになっています。border-radius[] = -webkit-border-radius
border-radius[] = -moz-border-radius/* コンパイル前 */
p { border-radius: 10px; }
/* コンパイル後 */
p {
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
}/* コンパイル前 */
div { background: #fff linear-gradient( left, red, white ) no-repeat; }
/* コンパイル後 */
div {
background: #fff -webkit-linear-gradient( left, red, white ) no-repeat;
background: #fff -moz-linear-gradient( left, red, white ) no-repeat;
background: #fff -ms-linear-gradient( left, red, white ) no-repeat;
background: #fff -o-linear-gradient( left, red, white ) no-repeat;
background: #fff linear-gradient( left, red, white ) no-repeat;
}/* コンパイル前 */
@keyframes myanim {
0% { left: 0; }
100% { left: 100px; }
}
/* コンパイル後 */
@-moz-keyframes myanim {
0% { left: 0; }
100% { left: 100px; }
}
@-webkit-keyframes myanim {
0% { left: 0; }
100% { left: 100px; }
}
@keyframes myanim {
0% { left: 0; }
100% { left: 100px; }
}マクロ
マクロの指定はCssCrush.macros.phpの中にあります。/* コンパイル前 */
p {
filter: blur( pixelradius=2 ),
dropshadow( color=#000, offY=1px, offX=2px );
}
/* コンパイル後 */
p {
filter: progid:DXImageTransform.Microsoft.Blur(
pixelradius=2 ),
progid:DXImageTransform.Microsoft.DropShadow(
color=#000, offY=1px, offX=2px );
-ms-filter: "progid:DXImageTransform.Microsoft.Blur(
pixelradius=2 ),
progid:DXImageTransform.Microsoft.DropShadow(
color=#000, offY=1px, offX=2px )";
zoom: 1;
}filter以外にも以下のようなマクロが指定されていました。display:inline-block対策/* コンパイル前 */
display: inline-block;
/* コンパイル後 */
display: inline-block;
*display: inline;
*zoom: 1;min-height/* コンパイル前 */
min-height: 100px;
/* コンパイル後 */
min-height: 100px;
_height: 100px;clip()対策/* コンパイル前 */
clip: rect(1px,1px,1px,1px);
/* コンパイル後 */
clip: rect(1px,1px,1px,1px);
*clip: rect(1px 1px 1px 1px);rgba()のフォールバック/* コンパイル前 */
background: rgba(0,0,0,.5);
/* コンパイル後 */
background: rgb(0,0,0);
background: rgba(0,0,0,.5);関数
math+ – / * ()です。
数値以外の文字は無視されます。percentroundmathの結果を四捨五入します。floormathの結果を切り捨てします。ceilmathの結果を切り上げします。()のように関数名を省略して書いた場合はmathとして扱われます。/* コンパイル前 */
.column-1 {
width: percent( 200, 960 );
font-size: ( 12 / 16 )em;
}
/* コンパイル後 */
.column-1 {
width: 0.208333333%;
font-size: 0.75em;
}data-uri関数を使うことで、相対パスで指定された画像やウェブフォントを自動的にData URIに変換することができます。/* コンパイル前 */
ul li {
background-image: data-uri(../my-bg.png);
}
/* コンパイル後 */
ul li {
background-image: url(data:image/png;base64,R0lGODlhAQABAIA...);
}変数
var関数で変数を使います。/* 変数の指定 */
@variables {
helvetica: "Helvetica Neue", Helvetica, Arial, sans-serif;
brand-blue: #C1D9F5;
}
/* 変数を使う */
ul, p {
font-family: var( helvetica );
background: var( brand-blue ) url( tile.png ) repeat-x;
}セレクタのグルーピング
:any擬似クラスをサポートしています。これはベンダープレフィックス付きではありますが、最新のMozillaとWebKitではサポートされています。
ちなみに、Selectors Level 4の中には:matchesがあります。/* コンパイル前 */
:any( .sidebar, .block ) a:any( :hover, :focus ) {
color: red;
}
/* コンパイル後 */
.block a:hover,
.block a:focus,
.sidebar a:hover,
.sidebar a:focus {
color: red;
}ミニファイとキャッシュ
/* コンパイル前 */
body {
padding: 0 0 0 0;
margin: 20px auto 0px;
background-color: #ffffff;
}
/* コンパイル後 */
body{padding:0;margin:20px auto 0;background-color:#fff}margin: 0px;のような指定をmargin:0;にpadding: 0 0 0 0;のような指定をpadding:0;に@importされるファイルも含め、全てのファイルは変更された日時のタイムスタンプが保存され、チェックされます。いずれかのファイルに変更があった場合は、新たにコンパイルされます。何も変更がなかった場合は、キャッシュされたファイルが返されます。
出力されるのはhttp://the-echoplex.net/csscrush/css/global.crush.cssです。
CSS Crushの紹介は以上です。 この2つのうちどちらを使いたいか、という質問があったらCSS Crushと答えると思います。 PCSSは書く量はかなり減ると思うんですが、それをやろうとすると大文字で書かないといけないのが多かったり、新しく覚えるものが多いのが大変そうです。 仮にどちらかを使うとしても、ローカルで使って実際のサイトにはコンパイルされたファイルを使うことになると思います。 せっかくなのでメジャーどころの2つがどういうものなのか分かる記事へのリンクをまとめておきます。基本的に日本語で読める記事です。 他にも検索すればいっぱい出てきますので、色々見てみるといいと思います。 どちらもとても分かりやすい比較なので興味のある方は目を通しておくといいかもしれません。個人的な感想
理由は簡単で、あまりトリッキーなことをしていないので、新しく覚えることが少ないからです。
セレクタのネストもあったら嬉しかったんですが……。
あと、ユーザーエージェントからブラウザを判別して出力するコードを変更するというのがちょっと……。おまけ:SassとLESSのリンク集
Sass
LESS
また、比較記事もあります。