是,右下角语言模式必须为HTML,否则VSCode不启用HTML语言服务,导致标签补全、自动闭合、Emmet展开等功能全部失效;需点击状态栏手动切换为HTML,或通过快捷键Change Language Mode设置。

右下角语言模式是不是HTML?
这是90%失效问题的根源。VSCode只在语言模式为html时启用原生HTML语言服务,其他模式(如Plain Text、JavaScript、PHP)下,<di>敲出来只会触发模糊的全局符号建议,而不是<code><div>标签列表。
<p>检查方式:看窗口右下角状态栏显示的文字。如果不是<code>HTML,点击它,选择Change Language Mode → HTML;或按Ctrl+Shift+P(Windows/Linux)/Cmd+Shift+P(macOS),输入Change Language Mode回车后选HTML。
- 文件后缀不是
.html或.htm,大概率不会自动识别为HTML模式 - 临时文件(未保存、无后缀)默认是
Plain Text,必须手动切换 - 在
.vue或.jsx里写HTML,需靠插件(如Volar)或files.associations显式映射
emmet.triggerExpansionOnTab关没关?
Emmet缩写(如div.container按Tab展开)依赖这个开关。它常被工作区settings.json覆盖,尤其团队项目中可能被CI脚本或prettier配置误设为false。
验证方法:新建一个test.html,输入! + Tab,能生成完整HTML5模板就说明Emmet本身正常;如果不行,优先查这个设置。
立即学习“前端免费学习笔记(深入)”;
- 打开设置搜
emmet trigger,确认Emmet: Trigger Expansion On Tab已勾选 - 直接编辑
settings.json,确保有"emmet.triggerExpansionOnTab": true - 若在
.md或.py注释里写HTML,还需配"emmet.includeLanguages": {"markdown": "html"} -
Tab被Vim等插件劫持时,可临时用Ctrl+Enter触发Emmet展开
html.suggest.html5开了没?
这个开关控制语义化标签是否出现在补全列表里。<header></header>、<main></main>、<article></article>这些HTML5新增标签,只有html.suggest.html5为true才提示;关掉后仍能补全<div>、<code><p></p>等基础标签,但会漏掉所有新元素。
它不控制属性值补全(比如type="|"里的枚举),也不影响class=""里CSS类名提示——那是另一套机制。
- 在设置中搜
html.suggest.html5,确保开启 - 对应
settings.json项:"html.suggest.html5": true - 该设置对
.vue文件无效,除非Volar已启用且配置了volar.autoInsertEmmetSupport - 禁用后,补全列表变短、语义缺失,但语法高亮和闭合逻辑不受影响
引号里输type="t为什么不提示text?
这不是VSCode原生HTML语言服务的功能。它把type="text"当作纯字符串处理,不解析W3C规范中的合法取值范围。所以<input type="|">光标在引号内时,不会弹出<code>text/email/date等选项——这不是Bug,是设计取舍。
要实现这类语义补全,得靠额外插件(如A11y Linter支持aria-hidden="|"提示true/false)或语言服务器接管(如Volar对Vue中type的增强)。原生HTML服务只做基础语法层补全。
- 原生支持的属性枚举极少,目前仅
class、id、部分ARIA属性(需html.suggest.html5开启) -
autocomplete、inputmode、formmethod等专用属性值,VSCode默认不感知 - 想补全CSS类名?必须装
IntelliSense for CSS class names in HTML或Tailwind CSS IntelliSense - 别指望
editor.quickSuggestions开关能打开这个能力——它管的是“要不要弹框”,不是“框里有什么”
emmet.includeLanguages可能被忽略,而volar.autoImportCompletion又接管了补全入口。此时单改某一项设置,效果会被另一层覆盖。动手前,先确认当前文件右下角的语言ID是什么,再决定该调哪一层配置。



















