または
<style type="text/css">@import url(pcss.php?css=file.css);</style>
これは最も簡単な導入方法ですが、PCSSを利用した他の方法もあります。
次に説明するのは複数のCSSファイル(実際にはPCSSファイル)を1つのCSSファイルに出力するのに向いている方法です。
<?php
include "pcss.php";
print new PCSS("file1.pcss");
print new PCSS("file2.pcss");
print new PCSS("file3.pcss");
?>
Apache のmod_rewrite
が有効な環境で.htaccessに下記を記述することにより、よりフレンドリーなURLにすることができます。
RewriteEngine on
RewriteRule ^([a-zA-Z0-9_-]+).p.css$ pcss.php?css=$1
この場合、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」を参照してください。変数
&[variable_name] = [value];
&
をつけることで変数として指定できます。
値は=
(等号)で代入します。
末尾の;
(セミコロン)は任意です。&mycolour = #fff;
&floatedbox = display:block; float:left;
デフォルト値の定義
BGIMG
PCSS関数で使用されます。
以下のように指定します。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
関数も同じように働きます。
PCSSのサイトで使われているPCSSのコードはhttp://pcss.wiq.com.br/pcss.pcssで見ることができます。
出力されるのは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
+ – / * ()
です。
数値以外の文字は無視されます。percent
round
math
の結果を四捨五入します。floor
math
の結果を切り捨てします。ceil
math
の結果を切り上げします。()
のように関数名を省略して書いた場合は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
また、比較記事もあります。