CSSの記述を高速化する、Emmet (Zen-Coding)

Emmetは、Zen-Codingの次期バージョンの名前です。
Zen-CodingはHTMLの記述方法が取り上げられることが多いですが、個人的には、CSSの入力補助こそ真価が発揮されると思っています。
私は、EmmetまたはZen-Codingがなければ、CSSのプロパティを打つのが苦痛なほどです。

Emmetから、さらに多くのプロパティに対応し、数値も含めて展開できるようになりました。CSSの記述がより使いやすくなったので、紹介します。

Zen-Codingから使える

CSSの展開は、ほとんどのZen-Codingから使えます。
Emmetではさらに使いやすくなりましたが、Emmetは現在開発中のため、不安定な部分があります。不安な方は、Zen-Codingをおすすめします。
プロパティに、ショートコードが用意されており、+でつないで展開(Expand Abbreviation)する形になります。

h1 {
  fl:l+d:i+c /* ひとつ、ひとつ展開 */
}
nav {
  cl:l+ov:h+bg+ /* ひとつ、ひとつ展開 */
}

展開後

h1 {
  float: left;
  display: inline;
  color: #000;
}
nav {
  clear: left;
  overflow: hidden;
  background: #fff url() 0 0 no-repeat;
}
d:i
display: inline;
ov:h
overflow: hidden;
bg+
background: #fff url() 0 0 no-repeat;

基本的なプロパティの入力は、長いものもありますが、1~3文字程度。
入力する量が圧倒的に減るので、ショートコードを覚えれば記述スピードが速くなります。

CSSのショートコード

Zen-Codingの次期バージョンEmmetで、使用できるCSSのショートコードは470以上用意されています。
これだけ多いと、丸暗記は難しいので、よく使いそうなものをピックアップします。

Emmetで、使用できるCSSのショートコードは500以上用意されています。
これだけ多いと丸暗記は難しいです。

基本

d
display: ;
w
width: ;
h
height: ;
m
margin: ;
p
padding: ;
ta
text-align: ;
fl
float: ;
cl
clear: ;
bg
background: ;
bd
border: ;
f
font: ;
fw
font-weight: ;
fz
font-size: ;
c
color: ;
pos
position: ;
t
top: ;
r
right: ;
b
bottom: ;
l
left: ;

margin-topや、border-colorなどを使いたい場合は、以下のようになります。

mt
margin-top: ;
mb
margin-bottom: ;
pl
padding-left: ;
bdl
border-left: ;
bdb
border-bottom: ;
bdc
border-color: ;
bgi
background-image: url();

また、数値以外の値を入れるプロパティは、:(コロン)で区切る方法や、 +(プラス)を使用する方法もあります。

:(コロン)で区切って、決められた文字を入力すると、autoやinline-blockなどの値も簡単に出せます。
また+(プラス)はプロパティごとをつなげる意味もありますが、backgroundやborderで使用すると、省略形で値を出すことができます。

:(コロン)

m:a
margin: auto;
d:i
display: inline;
d:b
display: block;
d:ib
display: inline-block;
fl:l
float: left;
fl:r
float: right;
cl:l
clear: left;
cl:r
clear: right;
cl:b
clear: both;
ta:l
text-align: left;
ta:c
text-align: center;
fw:n
font-weight: normal;
fw:b
font-weight: bold;
pos:r
position: relative;
pos:a
position: absolute;

+(プラス)

bg+
background:#FFF url() 0 0 no-repeat;
bd+
border: 1px solid #000;
bdl+
border-left: 1px solid #000;
bdb+
border-bottom: 1px solid #000;
f+
font: 1em Arial,sans-serif;

以下は、Emmetから採用された記述方法です。

m10
margin: 10px;
m10-5-0
margin: 10px 5px 0;
m-10--5
margin: -10px -5px;
m10-auto
margin: 10px auto;
w100p
width: 100%;
h50e
height: 50em;
(bg+)+c
background: #FFF url() 0 0 no-repeat;
color: #000;

プロパティのショートコードの後ろに、数値を設定することで、その数値をpxの単位をつけて展開してくれます。
px以外の単位を付けたい場合は、10pや10eを指定することによって、それぞれ%、emの単位で展開されます。
なお、小数点で数値を設定した場合は、自動的にemに変換されます。

プロパティのショートコードやルールが複雑に見えますが、使ってみると単純です。
1サイトをEmmetかZen-Codingで制作してみると、覚えられると思います。

よく使いそうな一覧

全てではありませんが、先ほど紹介したものも含めて、よく使いそうなショートコードをピックアップしました。
Emmetのショートコードなので、Zen-Codingでは一部使用できないものもあります。

@ Rules

@i
@import url();
@m
@media print {
}
@f
@font-face {
font-family:;
src:url();
}

Box

d
display: ;
d:n
display:none;
d:b
display:block;
d:i
display:inline;
d:ib
display:inline-block;
d:li
display:list-item;
d:tb
display:table;
d:tbclg
display:table-column-group;
d:tbhg
display:table-header-group;
d:tbfg
display:table-footer-group;
d:tbr
display:table-row;
d:tbrg
display:table-row-group;
d:tbc
display:table-cell;
w
width: ;
maw
max-width: ;
maw:n
max-width:none;
miw
min-width: ;
h
height: ;
mah
max-height: ;
mah:n
max-height:none;
mih
min-height: ;
bxz
box-sizing: ;
bxz:cb
box-sizing:content-box;
bxz:bb
box-sizing:border-box;
m
margin: ;
mt
margin-top: ;
mr
margin-right: ;
mb
margin-bottom: ;
ml
margin-left: ;
p
padding: ;
pt
padding-top: ;
pr
padding-right: ;
pb
padding-bottom: ;
pl
padding-left: ;
fl
float: ;
fl:n
float:none;
fl:l
float:left;
fl:r
float:right;
cl
clear: ;
cl:n
clear:none;
cl:l
clear:left;
cl:r
clear:right;
cl:b
clear:both;
pos
position: ;
pos:s
position:static;
pos:a
position:absolute;
pos:r
position:relative;
pos:f
position:fixed;
t
top: ;
r
right: ;
b
bottom: ;
l
left: ;
z
z-index: ;
v
visibility: ;
v:v
visibility:visible;
v:h
visibility:hidden;
ov
overflow: ;
ov:v
overflow:visible;
ov:h
overflow:hidden;
ov:s
overflow:scroll;
ov:a
overflow:auto;
ovx
overflow-x: ;
ovx:v
overflow-x:visible;
ovx:h
overflow-x:hidden;
ovx:s
overflow-x:scroll;
ovx:a
overflow-x:auto;
ovy
overflow-y: ;
ovy:v
overflow-y:visible;
ovy:h
overflow-y:hidden;
ovy:s
overflow-y:scroll;
ovy:a
overflow-y:auto;
zoo
zoom:1;

Border

bd
border: ;
bd+
border: 1px solid #000;
bd:n
border:none;
bdc
border-color: #000;
bds
border-style: ;
bds:n
border-style:none;
bds:dt
border-style:dotted;
bds:ds
border-style:dashed;
bds:s
border-style:solid;
bdw
border-width: ;
bdcl:c
border-collapse:collapse;
bdcl:s
border-collapse:separate;
bdrs
border-radius: ;
bdi
border-image:url( );

Background

bg
background: ;
bg+
background: #fff url() 0 0 no-repeat;
bg:n
background:none;
bg:ie
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=x.png',sizingMethod='crop');
bgc
background-color: #fff;
bgi
background-image:url( );
bgi:n
background-image:none;
bgr
background-repeat: ;
bgr:n
background-repeat:no-repeat;
bgr:x
background-repeat:repeat-x;
bgr:y
background-repeat:repeat-y;
bga
background-attachment: ;
bga:f
background-attachment:fixed;
bga:s
background-attachment:scroll;
bgp
background-position: 0 0;
bgz
background-size: ;
bgz:a
background-size:auto;
bgz:ct
background-size:contain;
bgz:cv
background-size:cover;

Content Type

ct
content: ;
ct:a
content:attr( );
ct:c
content:counter( );
ct:cs
content:counters( );
lis
list-style: ;
lis:n
list-style:none;
lisp
list-style-position: ;
lisp:i
list-style-position:inside;
lisp:o
list-style-position:outside;
list
list-style-type: ;
list:n
list-style-type:none;
list:d
list-style-type:disc;
list:c
list-style-type:circle;
list:s
list-style-type:square;
list:dc
list-style-type:decimal;
list:dclz
list-style-type:decimal-leading-zero;
list:lr
list-style-type:lower-roman;
list:ur
list-style-type:upper-roman;
lisi
list-style-image: ;
lisi:n
list-style-image:none;

Text

ta
text-align: ;
ta:l
text-align:left;
ta:c
text-align:center;
ta:r
text-align:right;
va
vertical-align: ;
va:t
vertical-align:top;
va:m
vertical-align:middle;
va:bl
vertical-align:baseline;
va:b
vertical-align:bottom;
td
text-decoration: ;
td:n
text-decoration:none;
td:u
text-decoration:underline;
td:o
text-decoration:overline;
td:l
text-decoration:line-through;
ti
text-indent: ;
ti:-
text-indent:-9999px;
lh
line-height: ;
lts
letter-spacing: ;
f
font: ;
f+
font: 1em Arial,sans-serif;
fw
font-weight: ;
fw:n
font-weight:normal;
fw:b
font-weight:bold;
fw:br
font-weight:bolder;
fs
font-style: ;
fs:n
font-style:normal;
fs:i
font-style:italic;
fz
font-size: ;
ff
font-family: ;
ff:s
font-family:serif;
ff:ss
font-family:sans-serif;
ff:m
font-family:monospace;
c
color: #000;

Visual

op
opacity: ;
op:ie
filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
op:ms
-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)';
cur
cursor: ;
cur:a
cursor:auto;
cur:d
cursor:default;
cur:c
cursor:crosshair;
cur:ha
cursor:hand;
cur:he
cursor:help;
cur:m
cursor:move;
cur:p
cursor:pointer;

追記: Fuzzy search

Emmetから、Fuzzy searchという機能が加わりました。
この機能はCSSを「短縮形っぽく」書いて展開すると、その形式に似たプロパティ、または値が展開されます。

.foo {
  fl
  fll
  flol
  flr
}

/* 展開 */
.foo {
  float: left;
  float: left;
  float: left;
  float: right;
}

ノリでかけば、それっぽく展開してくれるので、CSSをEmmetで使用する敷居が低くなりました。
「Dreamweaverの補完機能と何が違うの?」と思われる方も少なくないでしょう。
慣れもある程度必要ですが、実際にやってみるとDwの補完機能よりもスピーディーにCSSを入力できるようになります。

接頭辞について

Emmetから、接頭辞(ベンダープレフィックス)を容易に付けれるようになりました。
-(マイナス)を使用することで、一気に接頭辞を付けることができます。

bdrs8

/* -(マイナス)を付けたもの */
-bdrs8

/* 展開後 */
border-radius: 8px;

/* -(マイナス)を付けたもの */
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;

展開した接頭辞付きの値を変えたい場合は、一箇所を変更します。

-webkit-border-radius: 4px 24px; /* 一箇所変更 */
-moz-border-radius: 8px;
border-radius: 8px;

Zen-Coding ver0.7からある、Reflect Valueを実行すれば、プロパティの値を同じにできます。

-webkit-border-radius: 4px 24px;
-moz-border-radius: 4px 24px;
border-radius: 4px 24px;

接頭辞を簡単に付けれるのは魅力的ですが、値を変えるたびにReflect Valueを実行するのは面倒です。
SassやLess, Stylusなどのメタ言語の方が使い勝手が良いかもしれません。

SCSS

@mixin bdrs($bdrsValue: 8px){
  -webkit-border-radius: $bdrsValue;
  // -moz-border-radius: $bdrsValue;  これもいらないし。
  border-radius: $bdrsValue;
} 

div { @include bdrs; span { @include bdrs(4px 24px); } }

/* コンパイル後のCSS */ div { -webkit-border-radius: 8px; border-radius: 8px; } div span { -webkit-border-radius: 4px 24px; border-radius: 4px 24px; }

Sass, Less(メタ言語) と Emmet(Zen-Coding) のどちらを使えばいいのか?

Sassなどのメタ言語とEmmetは、役割が違います。
制作環境によって選択できない場合もあると思いますが、自由に制作できるのであれば、両方使ってみるといいかもしれません。

オススメは、Emmetのsnippets.jsonに、@includeなどをショートコードとして記述しておくことです。(下記例での、| [Vertical bar]は、展開後のカーソル位置)

@if
@if {\n\t|\n}
@e
@else {\n\t|\n}
@in
@include |
@ex
@extend |
@mx
@mixin {\n\t|\n}
@fn
@function {\n\t|\n}
@r
@return |

分かりやすい形でショートコードを追加しておいて、Sassなどを使うと快適になります。