Emmet — вёрстка со скоростью печати

Emmet — это плагин, который превращает короткие сокращения в полноценный HTML и CSS. Ты пишешь одну строку вроде ul>li*5>a.cls, нажимаешь Tab и получаешь список из пяти пунктов. Это стандарт быстрой вёрстки во всех популярных редакторах.

Уровень: начальный 16 разделов ⏱ 1–2 часа

1. Что такое Emmet и где он работает

Emmet — это движок сокращений, встроенный в VS Code, WebStorm, PyCharm и многие другие редакторы. В VS Code он уже установлен, ничего ставить не нужно. Работает он просто: вводишь аббревиатуру и нажимаешь Tab — вместо строки появляется развёрнутый код.

// пишем
div#main.container

// получаем после Tab
<div id="main" class="container"></div>
Скорость вёрстки Эмметом не идёт ни в какое сравнение с ручной печатью: одна короткая строка заменяет 10–30 строк разметки.

2. Базовые сокращения: теги, классы, id

Простое имя тега разворачивается в парный тег. Класс обозначается точкой, id — решёткой:

СокращениеРезультат
p<p></p>
div.box<div class="box"></div>
section#about<section id="about"></section>
h1.title.big<h1 class="title big"></h1>

Если имя тега не указано, но есть класс, Emmet подставит div: .card → <div class="card"></div>.

3. Вложенность: >, +, ^

Три оператора структуры:

// nav > ul > li
nav>ul>li
<nav><ul><li></li></ul></nav>

// header + main + footer
header+main+footer
<header></header><main></main><footer></footer>

// div > p ^ span (span уже вне div)
div>p^span
<div><p></p></div><span></span>
Каждый оператор ^ поднимает на один уровень. Для глубокой вложенности удобнее группировка в скобках — см. раздел 5.

4. Множители: * и $

Оператор * повторяет элемент нужное количество раз:

// li*3
li*3
<li></li><li></li><li></li>

// ul>li.item*4
ul>li.item*4
<ul>
  <li class="item"></li>
  <li class="item"></li>
  <li class="item"></li>
  <li class="item"></li>
</ul>

Символ $ вставляет номер повторения, а $@2 — стартует с 2, $@- — убывает:

// div.item$*3
<div class="item1"></div>
<div class="item2"></div>
<div class="item3"></div>

// li*4>a[href="#s$"] → ссылки #s1…#s4
<li><a href="#s1"></a></li>
<li><a href="#s2"></a></li>
<li><a href="#s3"></a></li>
<li><a href="#s4"></a></li>

5. Группировка в скобках

Круглые скобки собирают поддерево в один «блок», который затем повторяется или вкладывается:

// (header>h2+p)+footer
(header>h2+p)+footer
<header><h2></h2><p></p></header>
<footer></footer>

// ul>(li>a{Ссылка $})*3
<ul>
  <li><a>Ссылка 1</a></li>
  <li><a>Ссылка 2</a></li>
  <li><a>Ссылка 3</a></li>
</ul>

Скобки, умножение и нумерация вместе — это уже целые каркасы страниц одной строкой.

6. Текст {} и атрибуты []

Фигурные скобки вставляют текст внутрь тега, квадратные — атрибуты:

p{Привет мир}
<p>Привет мир</p>

a.btn[href="https://example.com" target="_blank"]{Кнопка}
<a href="https://example.com" target="_blank" class="btn">Кнопка</a>

img[src="img/a.png" alt="фото"]
<img src="img/a.png" alt="фото" />
Сниппет a:blank разворачивается в готовую ссылку с target="_blank" и rel="noopener noreferrer" — безопасное открытие в новой вкладке.

7. CSS-сокращения

Emmet работает и в CSS: пишешь мнемоническое имя свойства — получаешь полное правило:

СокращениеРезультат
d:fdisplay: flex;
jccjustify-content: center;
m10margin: 10px;
w100pwidth: 100%;
bd1-s-#000border: 1px solid #000;
@m@media screen { … }
// m10-20 → margin: 10px 20px;
m10-20
// p10-20-30-40 → padding: 10px 20px 30px 40px
p10-20-30-40
CSS-сокращения Emmet — приятный бонус, но помни синтаксис сам: сокращение d:g выдаст grid, а вот нужна ли сетка — решаешь ты.

8. Emmet в VS Code: настройка

В VS Code Emmet работает по умолчанию в файлах HTML, CSS и использует язык по расширению файла. Для JSX и Vue встречается контекст, где нужно указать языку:

{
  "emmet.includeLanguages": {
    "javascript": "javascriptreact",
    "vue-html": "html",
    "plaintext": "html"
  },
  "emmet.triggerExpansionOnTab": true
}
Чтобы увидеть, что скрывает сокращение, просто наведи курсор: VS Code покажет превью будущего кода.

9. Оборачивание выделенного: Wrap with Abbreviation

Частая задача — превратить готовый текст в структуру. Выдели строки и вызови Wrap with Abbreviation (в VS Code — Ctrl+Shift+P, затем «Emmet: Wrap», или сочетание Alt+Shift+W). Главный трюк — оператор * в конце сокращения: он помечает место вставки каждой выделенной строки.

// выделен текст из трёх строк
Красный
Зелёный
Синий

// сокращение ul>li* и Tab
<ul>
  <li>Красный</li>
  <li>Зелёный</li>
  <li>Синий</li>
</ul>

Нумерация $ тоже работает при оборачивании: section.s$>h2{Блок $}+p* разметит блоки с атрибутами s1, s2, s3 и заголовками внутри.

Оборачивание актуально при вёрстке из готового текста: списки, пункты меню, карточки товаров — всё собирается за одно сокращение.
Если выделение слишком длинное, результат может не влезть в приемлемую длину сокращения. Разбей задачу на несколько оборачиваний.

10. Пользовательские сниппеты

Стандартных сокращений хватает, но команда часто пишет одинаковые блоки: шапку страницы, карточку товара, модалку. Такие блоки оформляют как собственные сниппеты Emmet — в VS Code через файл фрагментов (Файл → Настройки → Пользовательские фрагменты → snippets.html.json).

{
  "card": {
    "prefix": "card",
    "body": [
      "<article class=\"card\">",
      "  <figure><img src=\"$1\" alt=\"$2\"></figure>",
      "  <h3>$3</h3>",
      "  <p>$4</p>",
      "  <a class=\"btn\" href=\"$5\">Подробнее</a>",
      "</article>"
    ]
  }
}

Переменные $1, $2 — позиции перехода по Tab после разворачивания. Сниппет появится в автодополнении и сработает по Tab.

Сниппеты удобно хранить в командном репозитории: один раз настроил — вся команда верстает одинаковыми блоками.
Сниппет не обязан быть HTML-фрагментом: это может быть целый шаблон письма или повторяющийся кусок документации.

11. Lorem ipsum и генерация текста

Дизайн-макеты и вёрстка требуют нейтральный текст-заполнитель. Emmet генерирует Lorem ipsum одной командой:

// lorem — 30 слов по умолчанию
lorem

// lorem5 — ровно 5 слов, lorem10 — 10 слов
lorem5
lorem10

// 3 абзаца по 7 слов внутри div
div>p*3>lorem7
// результат
<p>Lorem ipsum dolor sit amet.</p>
<p>Consectetur adipiscing elit sed do.</p>
<p>Eiusmod tempor incididunt ut labore.</p>

Латинский вариант используют чаще: он визуально плотнее и не отвлекает при проверке типографики. Русский Lorem активируется настройкой локали в редакторе.

Скорость проверки макета растёт, когда абзацев много: section>h2+p*2+lorem*2 даёт готовый блок контента.
Закончив разметку, замени тестовый текст на реальный. Иначе клиенты будут спотыкаться о Lorem ipsum.

12. Типовые ошибки и советы

Большинство ошибок Emmet — это особенности синтаксиса, которые легко упустить:

// удобная отладка вложенности
ul>li*3>a{Пункт $}
Если сокращение не раскрывается, проверь раскладку и кавычки: Emmet стартует по Tab. Конфликт с другими расширениями решается настройкой emmet.triggerExpansionOnTab.
Учи аббревиатуры блоками: сначала вложенность >, потом множители *, затем атрибуты и текст. Каждый блок — готовый кирпич для сборки страницы.

13. Emmet в других редакторах

Emmet — не привилегия VS Code. Движок встроен в WebStorm и PyCharm, устанавливается пакетом в Sublime Text (Emmet через Package Control), работает в Vim через плагин emmet-vim и в онлайн-песочницах вроде демо на emmet.io. Сокращения портируемы: одна и та же строка даёт одинаковый результат в любом инструменте — навык окупается всюду.

Онлайн-превью удобно, чтобы показать коллеге готовый результат без настройки окружения: достаточно передать сокращение — разметка будет идентична.

14. Каркас страницы одной строкой

Чаще всего Emmet применяют не для мелких фрагментов, а для каркаса документа. Сокращение html:5 разворачивает полный скелет HTML5: doctype, head с кодировкой и viewport, body.

СокращениеРезультат
html:5полный doctype + head + body
meta:utf<meta charset="UTF-8">
link:cssподключение таблицы стилей
script:srcподключение внешнего скрипта
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

По той же схеме собираются меню, сетки и таблицы: menu>li*5>a или table>thead+tbody>tr*3>td*4. Готовый каркас наполняется реальным контентом, и отпадает рутинное копирование прошлых проектов.

Заведи стартовый блок: header+main+footer — и начинай вёрстку с него, а не с пустого файла.

15. Формы и инпуты

Формы — зона, где Emmet экономит больше всего времени. Базовые сокращения инпутов дают готовые теги с нужным типом:

СокращениеРезультат
input:text<input type="text" name="" id="">
input:emailполе с типом email
input:chkчекбокс
input:radioрадиокнопка
sel<select name="" id=""></select>

Комбинация с вложенностью собирает форму целиком: form>label+input:email+but:s даст подпись, поле и кнопку отправки. Каркас атрибутов уже готов, останется дописать name. Такой подход ускоряет не только вёрстку, но и сборку прототипов для обратной связи.

После генерации формы обязательно пропиши label и атрибуты name — без них форма не отправит данные и не пройдёт проверку доступности.

16. Спецсимволы и автоматизация процесса

Длинный текст и спецсимволы — частая боль. Внутри {} символ $ распознаётся как нумерация: при множителе *3 сокращение p{Оплата $ руб.} даст «Оплата 1 руб.», «Оплата 2 руб.». Вывести литеральные «доллары» напрямую не получится, а квадратные скобки [] зарезервированы под атрибуты. Практичное правило: автоматизируй каркас, а специфичную длинную строку дописывай после разворачивания.

Чек-лист «опрятного Emmet»: один блок на строку, скобки для повторяющихся групп, готовые сниппеты для командных блоков, тексты — после генерации.

Что дальше

Теперь создай реальную страницу: каркас header+main+footer, меню через ul>li>a, карточки через div.card$*6. Основы разметки — в курсе HTML, стилизация — CSS, а продвинутые стили — Sass.

← Вернуться к курсам