乘法操作符的作用对象是其紧邻的右侧元素,括号()用于明确分组和作用域;正确顺序为先分组再乘法,$仅绑定最近的且不穿透括号。

乘法操作符 * 的实际效果取决于位置
写 ul>li*3 会生成一个 <ul>,里面含 3 个 <li>;但写成 ul*3>li 就会生成 3 个独立的 <ul>,每个里面各 1 个 <li>。关键不是“有没有 *”,而是它紧贴在哪个元素后面。
常见错误现象:div.item*3>p 本意是想建 3 个带 class 的 div,结果却生成了 1 个 <div class="item">,里面嵌套了 3 个 <p>——因为 * 作用在 div.item 上才对,必须写成 div.item*3>p(注意中间无空格)。
-
ul>li*5→ 正确:1 个 ul,5 个 li -
ul*5>li→ 5 个 ul,每个含 1 个 li -
div>(p*2)+span→ 先分组再乘:1 个 div,内含 2 个 p 和 1 个 span
分组 () 是解决层级混乱的刚需工具
不加括号时,header+main+footer 是平级;但一旦要让它们共同成为某个容器的子元素,比如 div>header+main+footer,Emmet 默认只把 header 当作 div 的子元素,main 和 footer 会变成同级兄弟——这不是你想要的。
这时候必须用 () 显式声明作用域:div>(header>h1)+(main>p)+(footer>ul>li*3),这样三者才真正成为 div 的直接子节点。
立即学习“前端免费学习笔记(深入)”;
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 括号不能嵌套过深,VS Code 对嵌套超过 3 层的分组解析可能不稳定
-
div>(header+main)+footer和div>(header+main+footer)效果一致,但后者更易读 - 括号内不允许空格,
div> (header)会失败,必须写成div>(header)
* 和 () 组合使用时序很重要
顺序错一点,结构就全偏。例如想生成「2 组 header + main」,有人写 (header+main)*2,这是对的;但若写成 header+main*2,结果是 1 个 header + 2 个 main,且三者平级。
另一个典型场景:列表项带编号的卡片组。section>(article>h3+p)*3 能一次性产出 3 张结构一致的卡片;如果漏掉括号写成 section>article>h3+p*3,那就变成 1 张卡片里有 3 段 <p>,完全偏离目标。
- 先分组、再乘法,是安全路径;反过来几乎总是错的
- VS Code 中按 Tab 展开时,如果结构没出来,优先检查括号是否闭合、
*是否挂载在目标元素末尾 - 复杂缩写建议拆成两步验证:先写
(header+main)看是否正确嵌套,再补*2
自动编号 $ 和乘法连用容易忽略细节
li.item$*5 生成 item1 到 item5,看着没问题。但如果你写 div>(p.item$)+span*3,会发现只有第一个 <p> 有编号,span 完全没编号——因为 $ 只对它紧邻的乘法生效,不会跨分组传播。
更隐蔽的问题:ul>li.item$@3*2 本意是从 3 开始编号、生成 2 项,结果却是 item3 和 item4;而 ul>li.item$@-*2 才能倒序生成 item2、item1。这些修饰符必须紧跟 $,且不能和 * 中间插空格。
-
$只绑定最近的*,不穿透() -
@后面不能跟字母,只能是数字或-,否则整个缩写失效 - 调试时可临时删掉
$和@,先确保结构正确,再加编号逻辑


















