HTML を書くとき、開始タグと終了タグを対にして打ち、同じ形のリストを何行も書き写すのは手間がかかります。Zen Coding は、CSS のセレクターに似た短い省略記法を書いて展開すると、HTML がまとめて出来上がる、というエディター向けの仕組みでした。のちに Emmet という名前に変わり、今では VS Code をはじめ多くのエディターに標準で組み込まれているか、拡張機能で使えるようになっています。
使い方 (VS Code の場合)
VS Code では、HTML や CSS のファイルで省略記法を書くと、入力候補に Emmet の展開結果が表示されます。Tab キーか Enter キーで候補を選ぶと展開されます。コマンドパレットから「Emmet: Expand Abbreviation」を実行して展開することもできます。
試しに、HTML のファイルで ! と書いて展開すると、ページのひな形が出来上がります。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
lang の値は、設定 (settings.json) の emmet.variables で変えられます。
{
"emmet.variables": {
"lang": "ja"
}
}
1 行目の DOCTYPE の役割は、DOCTYPE とレンダリングモード で説明しています。
基本の記号
>: 子要素にする+: 兄弟要素として隣に並べる^: 1 つ上の階層に戻る*: 繰り返す$: 繰り返しの番号に置き換わる。$$と重ねると 01、02 のように桁をそろえる.と#: class と id。タグ名を省くとdivになる[ ]: 属性を付ける{ }: 要素の中に文字を入れる( ): まとまりにする
例と展開結果
子要素と兄弟要素、中の文字を組み合わせた例です。
header>h1{サイト名}+nav
<header>
<h1>サイト名</h1>
<nav></nav>
</header>
class と id は、CSS のセレクターと同じように続けて書けます。
#main.container.wide
<div id="main" class="container wide"></div>
繰り返しと番号、属性を組み合わせると、リンクの一覧が 1 行で書けます。$ は { } の中でも番号になります。
ul.menu>li.menu-item*3>a[href="#"]{項目$}
<ul class="menu">
<li class="menu-item"><a href="#">項目1</a></li>
<li class="menu-item"><a href="#">項目2</a></li>
<li class="menu-item"><a href="#">項目3</a></li>
</ul>
ul>.item*3 のように、ul の中でタグ名を省くと、div ではなく li になります。番号を 3 から始めたいときは li.item$@3*3 のように @ で始まりの数を指定します。
^ を使うと、子要素を書いたあとで 1 つ上の階層に戻れます。
section>h2{見出し}+p{本文}^footer
<section>
<h2>見出し</h2>
<p>本文</p>
</section>
<footer></footer>
階層が深くなるときは、( ) でまとまりにすると、見通しよく書けます。
(header>h1)+(main>article*2>h2+p)+footer
<header>
<h1></h1>
</header>
<main>
<article>
<h2></h2>
<p></p>
</article>
<article>
<h2></h2>
<p></p>
</article>
</main>
<footer></footer>
注意したいのは、省略記法の途中に空白を入れないことです。空白があると、そこで省略記法が区切られ、意図したとおりに展開されません。空白は { } の中と、属性の値の中にだけ書きます。
CSS でも使える
CSS のファイルでも、プロパティ名と値を短く書いて展開できます。
m10 → margin: 10px;
p10-20 → padding: 10px 20px;
w100p → width: 100%;
df → display: flex;
書いた文字をあとから囲む
すでにある文字を、あとから HTML で囲むこともできます。VS Code では、囲みたい行を選んでコマンドパレットから「Emmet: Wrap with Abbreviation」を実行し、ul>li* と入力すると、選んだ各行が li で囲まれ、全体が ul に入ります。
りんご
みかん
ぶどう
<ul>
<li>りんご</li>
<li>みかん</li>
<li>ぶどう</li>
</ul>
テンプレートの言語など、標準では Emmet が効かない種類のファイルでも、設定の emmet.includeLanguages で HTML として扱うように指定すると使えるようになります。
まとめ
- Zen Coding は、今は Emmet という名前で、VS Code などのエディターで使える
>子、+兄弟、^上の階層、*繰り返し、$番号、.・#class と id、[ ]属性、{ }文字、( )まとまり- 省略記法の途中には空白を入れない
- CSS の省略記法や、選んだ文字をあとから囲む機能もある