Emmet 语法速查表 - Emmet 常用缩写与代码展开大全

Emmet 的原理是把一条简写字符串解析成 DOM 树再展开成文本,因此它真正擅长的是结构化、可预测的重复标记:导航项、表格行、表单字段、类名与 id 的批量生成。只要目标结构本身有规律,一条 ul>li*6>a 就能省掉十几行手敲;而一旦需要不规则的交互逻辑,就应该收手去写标签,缩写只是加速手段不是替代方式。表里分四组:HTML 基础标签与属性、常用页面结构(头部导航、列表、表格、表单)、CSS 简写、以及嵌套与循环。写的时候注意两点:占位符 $ 会让光标停在待填位置,Tab 连按即可顺序跳到下一个;CSS 简写里用 - 分隔数值,m10-20 展开为 margin 的上下左右两值,比背 CSS 简写表更直接。

Web 服务·共 39 条命令·最后更新 2026-07-21

典型使用场景

面向还在手写标签层级的前端工程师,尤其是搭页面骨架、写重复结构、给 CSS 里塞重复属性时。Emmet 的价值在于把「描述意图」压缩成一段短缩写,编辑器在按下 Tab 时展开成完整代码。本表覆盖四类:HTML 基础(标签、ID、类、子级 >、兄弟 +、乘法 *n、$ 自增编号、属性 [])、常用结构(form:post、input:email、btn:submit、lorem 占位文本)、CSS 简写(w/h/m/p 尺寸与间距、颜色 bgc/c、字重 fz/fw、布局 d:f、flex 对齐 jc/ai、定位 pos 与 t0 r0 b0 l0、边框 bd1-s-#ccc、圆角 br8),以及嵌套与循环与文本占位。本表最该先掌握的是 > 与 + 的区别,以及 $ 与 {} 的作用位置。

HTML 基础 8

! 或 html:5
展开 HTML5 文档骨架
div#app
<div id="app"></div>
div.container
<div class="container"></div>
ul>li*3
ul 下生成 3 个 li
ul>li.item$*3
li 带递增 class:item1, item2, item3
p>span^div
span 在 p 内,div 与 p 同级(上溯)
a[href="#" title="link"]
带属性的 a 标签
img
<img src="" alt="">

HTML 常用结构 8

form:post
form 带 method="post"
input:text
<input type="text">
input:email
<input type="email">
btn:submit
<button type="submit"></button>
select>option*3
select 下 3 个 option
table>tr^tr>td*3
两行表格,第二行 3 列
lorem10
生成 10 个单词的占位文本
lorem-cn
生成中文占位文本(需插件)

CSS 简写 18

w100
width: 100px
w100p
width: 100%
h50
height: 50px
m10
margin: 10px
m10-20
margin: 10px 20px
p10-20-30
padding: 10px 20px 30px
bgc#333
background-color: #333
c#fff
color: #fff
fz16
font-size: 16px
fw700
font-weight: 700
d:f
display: flex
d:g
display: grid
jc:c
justify-content: center
ai:c
align-items: center
pos:a
position: absolute
t0 r0 b0 l0
top/right/bottom/left: 0
bd1-s-#ccc
border: 1px solid #ccc
br8
border-radius: 8px

嵌套与循环 5

div>ul>li*5>a{Item $}
嵌套 + 循环 + 文本插值
div+p+bq
兄弟节点(+)
{Hello}
文本节点
${Item}
带编号文本
(#header>ul>li*2>a)+footer>p
分组()组合多个结构

参数矩阵

参数作用示例
! / html:5展开为 HTML5 文档骨架,含 doctype、html/head/body! 或 html:5
div#app同时生成标签与 ID,这是最基础的组合div#app
div.container生成带一个 class 的元素;class 可写多个用点分隔div.container
ul>li*3> 是子级关系,直接嵌套在上一元素内ul>li*3
ul>li.item$*3*n 重复 n 次;$ 让类名随次数自增(item1/item2/item3)ul>li.item$*3
p>span^div^ 回到上一级父元素插入兄弟,是构造多分支结构的必备操作符p>span^div
a[href="#" title="link"]方括号写属性;双引号包裹含特殊字符的值更安全a[href="#" title="link"]
img缩写标签名 img 直接展开为 img 标签;部分标签有更短别名img
form:post冒号后是标签类型修饰,展开成带 method="post" 的 formform:post
input:text / input:email生成带 type 的 input;这是表单里最常用的一组input:email
btn:submit展开成 type="submit" 的 button,btn 是 button 的缩写btn:submit
select>option*3快速搭出下拉框骨架;带值的写法是 option$select>option*3
table>tr^tr>td*3用 ^ 换行构造表格:两个 tr 三个 td,注意按 Tab 展开时机table>tr^tr>td*3
lorem10插入 10 词英文占位文本,用于验证排版与溢出lorem10
lorem-cn插入中文占位文本,验证中文字体与换行更真实lorem-cn
w100 / h50width / height 的缩写,单位默认 pxw100
w100p加 p 后缀表示百分比,w100p 即 width: 100%w100p
m10 / m10-20margin 缩写;连字符分隔多值对应上下左右,m10-20 即纵向 10 横向 20m10-20
p10-20-30padding 三值写法对应上、左右、下p10-20-30
bgc#333 / c#fff背景色与文字色缩写;写 # 时可省略 #,部分配置里 c 有别的含义需确认bgc#333
fz16 / fw700font-size 与 font-weight 缩写;fw700 是常用字重写法fz16
d:f / d:gdisplay 缩写:flex 与 grid,是把布局切换成本降到最低的两条d:f
jc:c / ai:cjustify-content 与 align-items 的缩写,用于 flex 居中(配合 d:f)jc:c
pos:aposition 缩写,a 即 absolutepos:a
t0 r0 b0 l0top/right/bottom/left 简写,四条一起写是绝对定位铺满的惯用写法t0 r0 b0 l0
bd1-s-#cccborder 缩写:宽度-样式-颜色,展开为 border: 1px solid #cccbd1-s-#ccc
br8border-radius: 8px;写 br50% 得圆角胶囊,是标签的常见形态br8
div>ul>li*5>a{Item $}大括号内是文本占位,$ 自增:a 的内容依次是 Item 1 到 Item 5div>ul>li*5>a{Item $}
div+p+bq+ 是兄弟关系,三个元素同层平铺div+p+bq
{Hello}纯文本占位,展开后作为可编辑文本出现在标签内容里{Hello}
${Item}把 $ 放进文本里,实现「标签文本带序号」的展开结果${Item}
(#header>ul>li*2>a)+footer>p括号把一段结构分组,避免分组内所有标签与后续串成一条链(#header>ul>li*2>a)+footer>p

易错点与避坑指南

现象展开出来的结构与预期不同,多了一层或少了一层嵌套。

原因> 是子级、+ 是兄弟、^ 是回到父级;连写时三个符号混用极易读错。

处置把长缩写拆成两段展开确认;对复杂结构用括号显式分组。

现象编号没有自增,所有重复项类名或文本完全一样。

原因$ 必须放在类名、ID、属性值或文本里,纯标签名中的 $ 无效。

处置写成 li.item$*3 或 a{Item $},$ 放在需要变化的位置。

现象按 Tab 没反应,缩写原样留在文件里。

原因光标不在行尾、当前文件语言不是 HTML/CSS,或该编辑器未启用 Emmet。

处置确认文件类型与 Tab 键行为;有些编辑器需要用 Ctrl+E 这类显式展开快捷键。

现象CSS 里 c#fff 展开成了预期之外的属性。

原因不同编辑器/插件预设的 c 可能指 color,也可能指其它属性映射。

处置展开后看一眼实际结果;不确定时直接写全属性名。

现象写完 `!` 展开出的是 XHTML 或旧版 doctype。

原因不同插件对 `!` 的默认展开版本不一致,VS Code 系通常带 html:5。

处置显式写 html:5 而不是只写 `!`。

现象在 JS/TS 文件里写 HTML 缩写,展开成了 JSX 但结构不对。

原因同一份缩写在 HTML 与 JSX 上下文里的处理规则不同(自闭合标签、属性名大小写)。

处置在 JSX 里显式写 JSX 语法,尤其是自闭合标签与 className。

现象生成的表格只有一个 td 或 tr 结构错乱。

原因table 简写需要按 Tab 时机分两步展开,一步到位会把结构压平。

处置分两次触发展开:先展开 tr 层级,再展开 td 层级。

现象展开结果里 class 属性没写上,但缩写里明明写了点号。

原因缩写被当作文本(前置转义)导致解析中断,或所在位置在注释/字符串里。

处置把缩写移到标签内容的正常位置重新输入,避免插在字符串与注释中间。

排障路径

  1. 1确认编辑器是否启用了 Emmet 展开

    grep -rn "emmet" .vscode/settings.json

    未配置时展开键与语言绑定可能都不是预期值。

  2. 2在 CSS 里做一次最小验证

    grep -rn "d:f\|jc:c" src --include="*.vue"

    确认简写已按预期落成 display:flex 与 justify-content:center。

  3. 3排查模板里是否有大量手写重复结构

    grep -c "<div class=" pages/index.vue

    重复度高说明该处适合用组件或循环,而不是继续手写。

  4. 4确认项目中缩写生成的结构与既有风格一致

    grep -rn "lorem" src

    占位文本残留在提交里是很常见的事故。

  5. 5检查 JSX 上下文里的自闭合标签写法

    grep -rn "<img[^>]*/>" src

    非自闭合写法在 JSX 里会直接编译失败。

  6. 6确认编号类名没有与既有样式重复

    grep -rn "item1\|item2\|item3" src --include="*.css"

    缩写生成的类名若恰好撞上已有类名,样式会互相污染。

命令示例

CSS 缩写:双属性 + 单位 + 简写值

m10-20 p10-20-30 bd1-s-#ccc br8 d:f jc:c ai:c

连字符分隔的片段按上/右/下/左展开:两个值是上下+左右,三个值是上+左右+下,四个值才是四边。单位可以省略,默认 px;# 直接跟在属性片段后作为颜色值。这是写重复样式最快的方式,但生成的 CSS 往往需要再手工整理一遍。

输出

m10-20  → margin: 10px 20px;
p10-20-30 → padding: 10px 20px 30px;
bd1-s-#ccc → border: 1px solid #ccc;
br8 → border-radius: 8px;

HTML 结构:乘法、上溯、分组三件套

ul>li.item$*3 p>span^div table>tr^tr>td*3 (#header>ul>li*2>a)+footer>p

> 是子级、+ 是同级、^ 回到上一层,组合起来基本不用动鼠标。$ 在乘法里生成递增序号(item$*3 → item1/item2/item3),$ 单独使用则从 100 开始递增,这是唯一需要在按 Tab 前先敲号的语法——把它放在花括号里最保险:div>ul>li*5>a{Item $}。

输出

ul>li.item$*3  → <ul><li class="item1"></li>…</ul>
p>span^div      → <p><span></span></p><div></div>

属性与伪类片段:a[href] 与 input:text

a[href="#" title="link"] form:post input:email btn:submit img select>option*3

方括号里是键值对,冒号是元素变体:form:post 展开成带 method="post" 的 form,input:email 与 btn:submit 是内置片段,会连同必要的 type 一起补齐。片段名是内置词表,输入时编辑器会提示,记忆不下的直接看提示比背更快。

输出

a[href="#" title="link"] → <a href="#" title="link"></a>
input:email           → <input type="email">
btn:submit           → <button type="submit"></button>

占位文本 lorem 与文档骨架

lorem10 lorem-cn !

lorem10 在一个标签内敲出 10 个词,做布局占位比手写 lorem ipsum 更省事;lorem-cn 依赖中文插件,编辑器没装时不会展开,此时请改用手头真实文案,不要留占位文本上线。! 展开 HTML5 骨架,新页面开箱即用。

输出

lorem10 → Lorem ipsum dolor sit amet consectetur adipiscing elit…
!       → <!DOCTYPE html> + html/head/body 完整骨架

常见坑与注意事项

  • 结构简写生成的是「能用」的 HTML,不是「正确」的 HTML:ul>li*3 不带文本,div+p 会留下空 div 容器,btn:submit 在 form 外展开也毫无意义。展开后必须补内容和语义标签,否则屏幕阅读器会读到一片空元素。
  • li.item$*3 里的 $ 只在展开时替换成数字。想在正文里真的写出美元符号或 CSS 变量名时,编辑器会误判为编号标记而替换掉——CSS 里写 $primary 这类 SCSS 变量若在支持 Emmet 的区域输入,可能被提前展开。写 Sass 变量名时先在行内注释掉或换行断开缩写。
  • Emmet 会把缩写当成输入流的一部分连续解析:输入 class 名如 col-md-6 里的片段可能触发意外展开,粘贴他人代码时尤其容易发生。批量粘贴外部 CSS/HTML 前先确认 Emmet 处于禁用状态,粘贴后再统一展开需要的部分。
  • br8 和 .br 两个字符完全不同的目标:br 是 border-radius,而 br 开头的元素标签在 HTML 区域是 <br>。同一段文件里混排 HTML 与 CSS 缩写时,选区不同、结果不同,展开前务必确认当前光标所在区域。
  • lorem10、lorem-cn 生成的占位文本是排版占位,不是可交付内容。lorem-cn 还依赖第三方插件,未安装时可能保持原样不被替换。发布前全局搜索 lorem 与 item1、item2 这类 $ 生成的序号,确认没有漏进产物。
  • 缩写里的选择器是按文本匹配的,td*3 生成 3 个 td、div*3 生成 3 个 div,数字写错(td*30)就会静默展开 30 个元素,大表格里很难一眼看出。展开后用 git diff 复查行数是否与预期一致。

提示

  • VSCode 默认内置 Emmet,HTML/CSS/JSX/Pug 文件里直接 Tab 即可展开。
  • $ 是递增占位符,$$ 补零(01, 02),$@- 倒序。
  • CSS 简写用 - 连接多个值,如 m10-20 展开为 margin: 10px 20px。
  • 在 JSX/TSX 文件里展开前先在设置里确认 emmet.includeLanguages 已为对应语言启用,否则 Tab 无反应。
  • 加 ! 展开为自闭合且不含默认属性,如 img! 得到 <img src="" alt="">,比逐个删属性快。
  • 缩写后加 ^ 收尾可将光标直接落到该标签内容前,生成骨架后无需再移动光标手动定位。

常见问题

lorem10 和 lorem-cn 生成的占位文本有什么区别?

lorem10 生成 10 个单词的拉丁式占位文本,输出长度由后面的数字直接控制,适合撑起一段英文段落、需要精确控制占位长度的场景。lorem-cn 生成中文占位文本,词数与中文语义感更适合直接放进中文界面稿,但它依赖插件支持,不是所有编辑器默认都有。两者都只往标签内容里塞文本,用在 p、div、span 这类容器里最省事;如果结构还需要重复多次,就在外层加乘法,例如 lorem*3。

括号分组能解决什么问题,怎么用?

缩写一长就容易读错层级,括号用来显式划定范围,让每段内部独立解析。典型写法是 (#header>ul>li*2>a)+footer>p:括号里的 #header>ul>li*2>a 生成带 ID 的页头结构,括号外的 +footer>p 再把页脚接成它的兄弟节点。没有括号时你得靠记 # 到底作用到哪一段,收尾符号 ^ 也很容易数错层数。分组之后每段都能单独确认,复杂骨架的可控性明显更高。

一个标签要同时带 href 和 title,缩写该怎么连写?

用中括号把属性整体裹住,多个属性之间用空格分隔:a[href="#" title="link"] 展开后是带 href 与 title 的 a 标签。属性的值用双引号包起来最稳,尤其是值里本身带空格或特殊字符时;不带引号的写法在值含空格的情况下会解析错位。如果属性名还需要取值简写,可以和点号、井号混用,比如把 class 与 id 一起挂在标签上——但注意属性简写和文本插值里的花括号是两套机制,不要指望在一个方括号里写出 {} 表达式。

{Hello} 和 ${Item} 这两种写法会展开成什么?

{Hello} 是纯文本插值,把花括号里的内容原样放进标签的文本位置,不带任何编号逻辑。${Item} 则是在文本里加入自增编号,处在乘法或列表结构的第几个就显示成 Item 1、Item 2、Item 3——数字来自 $ 这个占位符,被包在文本插值里使用。同理还有 $@- 这种倒序形式,会生成倒着数的编号。所以要静态占位文字用 {},要一串带序号的条目才用 ${}。

form:post、input:email、btn:submit 这几个简写各自补全了什么?

它们是给常用标签预设了默认属性,写完整标签也可以,但要多敲一串。form:post 展开出带 method="post" 的 form,省掉最容易忘的那个属性;input:email 展开成 <input type="email">,input:text 同理给出 <input type="text">,浏览器据此决定是否做邮箱格式校验与移动端键盘类型;btn:submit 展开成 <button type="submit"></button>,按钮类型默认就是 submit,写出来主要是为了在 type="button" 的文件里避免误提交。表单里需要多种输入类型时,重复利用这套简写比手写完整标签快得多。

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。

由 巧匠 维护

公开更新于 2026年7月21日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们