Emmet实用教程:用缩写快速生成HTML与CSS代码,提升前端开发效率

发布时间:2026/10/20 14:59:40
Emmet实用教程:用缩写快速生成HTML与CSS代码,提升前端开发效率 如果你写过几周HTML和CSS就一定体会过那种“明明只是堆标签却堆到手酸”的感觉。一个稍微像样的页面少说几十个嵌套的div每个都要手写闭合标签CSS里一条margin: 0 auto;能打十几次改一下结构层次还得小心翼翼数括号。Emmet就是为这个场景而生的工具它把一段像CSS选择器一样的简短缩写比如div.boxh1p直接展开成完整的HTML结构也能把m0-auto变成margin: 0 auto;让整个HTML和CSS书写速度上一个台阶。这篇文章我打算把我自己使用Emmet多年积累的经验完整写出来不光是语法罗列还包括实际写页面时怎么用它搭结构、怎么写CSS、怎么配置编辑器、以及我踩过的那些坑。无论你是刚入门的前端新手还是写了很多年页面的老手只要还在手敲标签这都值得花十分钟看完。1. Emmet到底是干什么的它省掉的不只是敲键盘的时间Emmet的前身是Zen Coding后来发展成独立工具现在几乎所有主流编辑器都已经内置或高度集成。它的核心思路特别朴素把高频出现的完整代码片段压缩成极短的缩写再在编辑器里展开成真实代码。你记住的不是一个完整标签而是一套“生成规则”。用的时候你只需要在编辑器里输入类似ul#navli*5a这样的字符串按下Tab键就能得到完整的嵌套列表结构。这套操作目前已经成为很多前端开发者的默认工作流但我发现依然有大量同学只是听说过名字或者只会在编辑器里点几个现成的快捷键从来没有系统理解过它的设计逻辑。1.1 一个老问题重复劳动正在拖慢你的节奏先说痛点。写HTML最浪费时间的地方不在于你是否清楚结构而在于结构本身是重复的。导航菜单、商品列表、卡片组件、表单字段组这些结构来回组合本质就是标签套标签。手写时你要保证每个标签都有正确的闭合层级还不能乱。CSS那边也一样。一个属性要写全名比如border-radius: 4px;每个字母都得打出来一行还没多大信息量。缩写工具能把这些纯体力劳动压缩掉让你把注意力放在更有价值的事情上比如类名该怎么规划、层级是否合理、响应式方案怎么组织。还有一个隐藏问题是人手打代码会累。长时间保持同一姿势敲键盘每减少一千次按键手腕和肩膀的压力就少一分。这不是玄学是实实在在的日常体验。1.2 学一笔小语法换来长期收益很多人觉得学一个新工具有学习成本能记住吗其实Emmet的语法跟CSS选择器几乎一脉相承。会写ul li的人理解ulli几乎没有难度会写.cls的人输入.box就能生成div classbox/div。整套核心概念认真学一遍也就是二十分钟的事。收益却很直接。以前写一个完整的导航栏结构至少要打七八行标签现在输入一行缩写一次展开。以前写padding: 10px 20px;要按十几次键现在输入p10-20再按Tab完成。长期累积下来写同样一个页面总按键量能省下一半以上。更重要的是减少了因为手滑漏掉闭合标签而反复调试的时间。这笔投资几乎是前端效率工具里性价比最高的。2. HTML缩写语法从“短的会说话”开始想用好Emmet最重要的是理解它是怎么把一串字符翻译成结构的。它本质上有一套自己的“语法”这套语法和CSS选择器很像但增加了几个表达嵌套关系的符号。2.1 几个连接符、、^、*和()这些符号是Emmet的核心各自代表不同的层次关系。第一个是表示子元素。divulli的意思是div里面套一个ulul里面再套一个li。展开之后是div ul li/li /ul /div第二个是表示兄弟元素。headermainfooter就是三个平级标签依次排列展开后互不嵌套。第三个是^表示向上提一层。divpspan^h2中span本来在p里面^让它跳出p跟p变成平级整体还是在div里面。所以展开结果是div pspan/span/p h2/h2 /div第四个是*表示重复。li*3就是生成三个li。重复出来的每个元素结构完全一样但如果你配合$序号后面会细说就能做出有编号的列表。第五个是()表示分组。它解决的是一对多时的优先级问题。div(headernav)mainfooter能把header和nav这个子结构包在一起跟main、footer作为兄弟关系展开。提示^只能往上提一层如果有更复杂的嵌套层级我建议用括号分组而不是连续按^否则很容易把自己绕晕。2.2 类名、ID、属性与文本Emmet里给元素加类名和ID的写法跟CSS选择器一模一样。div.box生成div classbox/divdiv#main生成div idmain/div两者也可以叠加div#main.box.layout生成带一个ID和两个类名的div。属性用方括号表达。a[href#]展开为a href#/ainput[typetext placeholder请输入]展开为带两个属性的输入框。多个属性写在一起中间用空格或直接连写都会生效。这里有一个注意点属性值里的双引号不要省略否则展开出来的结构可能不是你想要的效果。文本内容用花括号表达。button{点击我}展开为button点击我/button。这个能力经常被忽略其实它是快速搭原型的关键因为很多结构都要带一些临时文案不用它的话你还要重新切到标签内输入。2.3 隐式标签为什么不用写标签名也能生成Emmet有一个很实用的设计叫隐式标签。在特定父级下如果你不写子标签名它会自动补齐。比如ul.item你只写了类名但Emmet知道ul下面的默认子元素是li所以展开结果是ul li classitem/li /ul类似的规则还有selectoption、tabletrtd、tbody等。这个规则让你可以少打很多标签名尤其在做列表页时特别省事。不过它也有个小坑如果你不是这些固定语义的父级比如div.box它只能猜成divdiv classbox/div/div这种情况下就没法省略标签名。3. 实操示例一条命令搭起完整页面区块语法讲再多不如直接看能跑通的例子。下面我用三个高频页面区块演示一条缩写从输入到展开的完整过程。这些结构我在实际写页面时几乎天天用。3.1 导航栏一条命令生成全套菜单最常见的是导航栏。以前要写nav ul lia href首页/a/li lia href关于/a/li lia href服务/a/li lia href案例/a/li lia href联系/a/li /ul /nav现在只需要输入navulli*5a[href#]{菜单$}li*5重复五个列表项$会自动替换成序号所以五个链接文字依次变成“菜单1”到“菜单5”。如果你想让文案变成真实名字可以把{菜单$}改成{首页}之类的静态文本或者展开后再统一改。3.2 卡片组件嵌套结构一步到位做页面展示时卡片组件出现频率极高。一个典型的卡片结构是图片、标题、描述和按钮嵌套在同一个容器里。可以用这样一条命令div.cardimg.cover[srcimg.jpg]div.contenth3.titlep.descbutton.btn展开后就是div classcard img srcimg.jpg alt classcover div classcontent h3 classtitle/h3 p classdesc/p button classbtn/button /div /div这个例子里有两个地方值得注意。一是img标签是自闭合元素Emmet会自动处理成/结尾。二是div.content这个层级用来建立子级而img.cover和div.content之间用连接所以它们在同一层不会被错误嵌套。3.3 一页完整骨架多分支结构用括号管理当页面结构不只是单条链而是有并排的大区块时括号就好用了。比如一个最简单的后台页面布局headernavmain.sidebarmain.contentfooter这种写法直接完成了header内部有nav但main.sidebar和main.content跟header平级的结构。如果你想让侧边栏和主内容嵌套在某个div.wrapper里面就加一组括号headernav(div.wrappermain.sidebarmain.content)footer括号的作用是让div.wrapper成为一个整体然后跟header、footer保持兄弟关系。这样复杂结构也能一次成型。4. CSS缩写实战让样式表也跑起来很多人以为Emmet只对HTML有效实际上它在CSS里的提速效果同样明显。CSS缩写的逻辑跟HTML不太一样不是靠嵌套符号而是靠属性和值的关键词缩写。4.1 常用属性与值缩写在CSS文件里输入m0-auto按Tab展开会得到margin: 0 auto;它把m识别为margin0-auto拆成上下和左右两个值中间的连字符自动变成空格。类似的还有p10→padding: 10px;w100p→width: 100%;h50vh→height: 50vh;bd1→border: 1px solid #000;fz16→font-size: 16px;df→display: flex;aic→align-items: center;jcsb→justify-content: space-between;这套缩写不是死记硬背它遵循一个规律属性名取关键字母组合单位可以省略或用缩写字符表示。常用的单位里p代表%px不用写rem直接写remem直接写em。我一般记几个最常用的用到再查一下用几次就顺手了。4.2 多值、单位与属性值联想CSS属性经常要写多个值。Emmet支持用连字符拆开。m10px-20px展开为margin: 10px 20px;p10px-20px对应padding: 10px 20px;。想写三值或四值也直接按顺序写用-分隔比如m10px-20px-30px展开为margin: 10px 20px 30px;。还有一个小技巧是颜色缩写。c#fff会展开为color: #fff;bg#f00展开为background-color: #f00;。这些在调样式的时候非常好用不用停下来切输入法或者补全括号。4.3 渐变、背景等复杂值怎么快速写复杂样式也不一定非要手写全部。比如输入bg-linearEmmet可能补出一段渐变模板你只要改成实际的起点和色值即可。还有ff代表font-familyff-sans代表一个sans-serif字体栈ff-mono代表等宽字体栈。这些模板本身是可配置的如果你不满意默认内容可以通过自定义snippets覆盖。实际开发里我会用CSS缩写来写那些高频、简单的属性背景渐变这类偏向设计细节的仍然会自己调整参数。但即便只是高频属性的缩写已经能省掉大量重复输入很多时候我从写HTML到CSS草稿全程都是Tab解决问题的。5. 进阶功能包裹、批量生成与测试文本基础语法掌握之后再往深处走一层你会碰到几个特别顺手的高级能力。它们不是刚需但只要用过一次就回不去手打时代了。5.1 用包裹缩写给已有代码加壳包裹是Emmet里我最爱的功能之一。它的场景是你有一大段内容比如三个段落想统一包进一个div或ulli里。如果手动改你得在开头加标签、结尾加闭合标签挪来挪去很容易出错。用Emmet的Wrap with Abbreviation功能先选中要包裹的内容再输入想要的包裹结构就能批量生成。比如选中三行文字输入ulli*每行文字会各自被li包住外面再套一个ul。这个功能在不同的编辑器中快捷键不一样VS Code里默认是CtrlShiftP之后搜索命令或者直接使用右键菜单Sublime Text里我记得默认是CtrlShift6之类的组合键具体看当前编辑器快捷键设置。5.2 数字序列自动递增$与前面已经见过$的用法它在重复元素中会按顺序替换成数字。div.item$*5生成五个classitem1到item5的div。如果你想倒序就用$-。例如div.item$-*3生成item3、item2、item1。如果想从某个数字开始比如从3开始写$3。这个功能在做表格行、步骤条、时间线这类需要编号的结构时特别高效。5.3 lorem与测试文本做原型时最讨厌的是找测试文本。Emmet直接支持lorem快速填充。输入lorem按Tab生成一段完整的拉丁文占位段落输入lorem5生成5个单词输入lorem*3生成3个段落。我用它来搭草稿页时几乎必开。等结构确定后再替换成真实文案。需要注意提交代码前一定要全局搜索lorem否则线上可能会出现占位文本这种失误虽然不影响功能但显得很不专业。6. 编辑器集成与个人配置把Emmet调成趁手的工具Emmet本身是编辑器无关的但不同编辑器的集成程度和触发快捷键有差异。了解这些差异能避免很多“为什么我按了没反应”的困惑。6.1 各编辑器默认支持情况大部分现代编辑器已经内置Emmet。VS Code默认开启在HTML、CSS等文件里输入缩写后按Tab即可展开。Sublime Text传统上需要手动安装Emmet插件安装后同样按Tab。WebStorm这类自带丰富代码补全的IDE基本也内置了类似能力只是触发键可能不同有的用Tab有的用回车。我建议第一次使用前先确认当前编辑器的官方文档。不要迷信网上别人的快捷键截图因为版本更新和插件冲突都可能改变默认行为。6.2 自定义snippets把自己常用的骨架写进去Emmet允许你配置自定义snippets也就是给某段长结构起个短名字。比如我在做的项目里经常需要生成一套固定的后台页面外壳。我可以在配置里加一个page缩写指向headernavmain.containerfooter之后输入page按Tab就能一次性生成整个骨架。自定义snippets的位置因编辑器而异VS Code是在用户设置里找Emmet: Extensions Path相关的配置然后在指定文件中写JSON。写法大概是{ html: { snippets: { page: headernavmain.containerfooter, tbl: tabletheadtrth*3tbodytr*3td*3 } } }命名要谨慎。尽量用不会被误输入为真实标签的短词比如mycard、page避免用div、a这种本来就存在的名称否则你自己都不知道触发的是哪一套。6.3 触发方式与常见冲突最常遇到的问题就是Tab冲突。有些编辑器的Tab键默认用来做代码补全确认比如你输入di代码补全弹出一个待选列表你再按Tab会触发补全而不是Emmet展开。解决方法是在需要Emmet展开的场景先输入完整的缩写比如div.item再按Tab或者给Emmet设置单独的快捷键。另一个常见的冲突场景是在非HTML或CSS文件中比如在JavaScript的模板字符串里写HTML片段某些编辑器默认不会启用Emmet。如果确实想在里面快速生成HTML需要按编辑器设置打开“在JS中启用Emmet”之类的选项。7. 常见问题与避坑清单最后这部分我把自己用Emmet这几年真正遇到过的、或身边同事踩过的坑整理成排查和经验清单能帮你少走很多弯路。7.1 缩写不展开时按这个顺序排查按下Tab没有反应别急着怀疑工具坏了按顺序检查这几个点。先看当前文件类型。Emmet通常只在HTML、XML、CSS等文件中默认生效在纯JS文件里一般需要额外配置。再查看输入光标位置不要在字符串中间或注释里测试。然后检查缩写的语法有没有明显错误比如标签名打错、缺少闭合的中括号。最后检查按键绑定看看当前编辑器里Tab是不是被其他命令占用了。我用过最快的一个排查技巧在编辑器命令面板里搜索“Emmet: Expand Abbreviation”并执行如果能正常展开说明缩写没问题纯粹是快捷键绑定冲突。7.2 展开结果跟想象不一样展开出来跟你预期不同大多是层级符号写错了。常见问题是和混用。divpspan里面p和span是div的子级且互为兄弟而divpspan是完全嵌套差别非常大。还有一种情况是*的作用范围。divulli*3span里*3只作用在li上span不会重复。如果你想同时重复子级和兄弟要么加括号要么拆成两条缩写。我在刚开始使用时经常被这个绕晕后来习惯了一个原则缩写越长越复杂就越要拆成多步不要追求一行到底。7.3 几条提高体验的经验第一对于复杂页面我建议先搭骨架再填细节。用Emmet一次生成完整页面有时可行但结构一旦超过两三个层级出错时排查成本反而更高。先写主干确认没问题再在具体区块里用缩写去补。第二别滥用lorem。原型阶段用它非常高效但务必在交付前清理干净。我见过有人把lorem文本带到线上页面好几个月都没发现看起来很尴尬。第三把常用结构沉淀成自定义snippets。如果你发现同一个页面片段一周内写了三次以上说明它值得固化。第一次花几分钟配置之后每次都能省大几十秒日积月累相当可观。最后再分享一个我个人的操作习惯我会把Emmet的展开键单独设置为CtrlE而不是跟Tab混用。这么做虽然少了一点“随手Tab”的直觉但能完全避开代码补全和Tab的冲突。刚开始用了大概半天就适应了之后再也没有发生过按Tab没反应的困惑。如果你频繁遇到缩写不生效我很建议试试这个方案稳定感比那一点点按键仪式感重要得多。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询