简化您的工作流程:搜索 miniwebtool。
添加插件
相关工具
CSS美化工具CSS盒阴影生成器Googlebot抓取大小检测器HTML转Markdown转换器图片Base64转换器javascript压缩/美化工具🔍 抄袭检测器SQL格式化工具XML转JSON转换器YAML格式化/验证器
主页 > 文本工具 > 文本修改工具 > HTML美化器
 

HTML美化器

免费在线 HTML美化器和格式化工具。立即格式化压缩或混乱的 HTML,具有适当的缩进、标签对齐和属性整理。客户端处理 — 您的代码永远不会离开浏览器。

HTML美化器
🔒 100% 客户端处理 — 您的代码永远不会离开浏览器
快速示例
⚡ 压缩过的 HTML 🔀 混乱的缩进 📐 语义化布局 📝 表单元素
输入 HTML
输出
缩进:
⚠ 标签警告
    0
    总标签数
    0
    唯一元素
    0
    最大深度
    0
    属性数
    0
    输入 (字节)
    0
    输出 (字节)
    ⟨/⟩ 标签细分
    大小变化
    0%
    ', messy: '\n\n\n Blog Post\n \n\n \n
    \n
    \n

    Understanding Flexbox

    \n
    \n Jane Doe\n \n
    \n

    Flexbox is a powerful CSS layout module that makes it easy to design\n flexible responsive layout structures.

    \n

    Key Concepts

    \n
      \n
    • Flex Container
    • \n
    • Flex Items
    • \n
    • Main Axis vs Cross Axis
    • \n
    • Flex Wrap
    • \n
    \n
    \n

    Flexbox changed how we think about CSS layouts forever.

    \n
    \n

    Read more about CSS Grid for two-dimensional layouts.

    \n
    \n
    \n \n', semantic: '\n\n\n \n \n Semantic HTML5 Layout\n\n\n
    \n \n
    \n
    \n
    \n
    \n

    Article Title

    \n

    Published on

    \n
    \n
    \n

    Introduction

    \n

    This article demonstrates semantic HTML5 elements that improve accessibility and SEO.

    \n
    \n HTML5 semantic elements diagram\n
    Semantic elements provide meaning to the document structure.
    \n
    \n
    \n \n \n
    \n
    \n
    \n

    © 2026 My Site. Built with semantic HTML.

    \n
    \n\n', form: 'Registration Form
    Personal Information
    Preferences
    ' }; function hbLoadExample(key) { document.getElementById('htmlInput').value = HB_EXAMPLES[key]; document.getElementById('htmlOutput').value = ''; hbHideStats(); } /* ── Utility Functions ───────────────────── */ function hbClearInput() { document.getElementById('htmlInput').value = ''; document.getElementById('htmlOutput').value = ''; hbHideStats(); } function hbPasteFromClipboard() { navigator.clipboard.readText().then(function(text) { document.getElementById('htmlInput').value = text; }).catch(function() {}); } function hbCopyOutput() { var text = document.getElementById('htmlOutput').value; if (!text) return; var btn = document.getElementById('hbCopyBtn'); navigator.clipboard.writeText(text).then(function() { btn.classList.add('copied'); btn.textContent = '✓ 已复制'; setTimeout(function() { btn.classList.remove('copied'); btn.textContent = '\u29C9 复制'; }, 1500); }).catch(function() {}); } function hbDownloadOutput() { var code = document.getElementById('htmlOutput').value; if (!code) return; var blob = new Blob([code], { type: 'text/html' }); var a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'beautified.html'; a.click(); URL.revokeObjectURL(a.href); } function hbHideStats() { document.getElementById('hbStatsRibbon').classList.remove('visible'); document.getElementById('hbTagBreakdown').classList.remove('visible'); document.getElementById('hbDiffBar').classList.remove('visible'); document.getElementById('hbWarnings').classList.remove('visible'); } /* ── HTML Element Classifications ─────────── */ var VOID_ELEMENTS = ['area','base','br','col','embed','hr','img','input','link','meta','param','source','track','wbr']; var INLINE_ELEMENTS = ['a','abbr','acronym','b','bdo','big','br','button','cite','code','dfn','em','i','img','input','kbd','label','map','object','output','q','samp','select','small','span','strong','sub','sup','textarea','time','tt','u','var']; var RAW_TEXT_ELEMENTS = ['script','style']; var PRESERVE_ELEMENTS = ['pre','code','textarea','script','style']; /* ── HTML Beautifier Engine ──────────────── */ function hbTokenize(html) { var tokens = []; var i = 0; var len = html.length; while (i < len) { // Comment if (html.substr(i, 4) === '', i + 4); if (end === -1) end = len - 3; tokens.push({ type: 'comment', value: html.substring(i, end + 3) }); i = end + 3; } // DOCTYPE else if (html.substr(i, 9).toUpperCase() === '', i); if (end === -1) end = len - 1; tokens.push({ type: 'doctype', value: html.substring(i, end + 1) }); i = end + 1; } // CDATA else if (html.substr(i, 9) === '', i + 9); if (end === -1) end = len - 3; tokens.push({ type: 'cdata', value: html.substring(i, end + 3) }); i = end + 3; } // Closing tag else if (html.substr(i, 2) === '', i); if (end === -1) end = len - 1; var tag = html.substring(i + 2, end).trim().toLowerCase(); tokens.push({ type: 'close', tag: tag, value: html.substring(i, end + 1) }); i = end + 1; } // Opening tag else if (html[i] === '<' && i + 1 < len && /[a-zA-Z]/.test(html[i + 1])) { var end = i + 1; var inQuote = false; var quoteChar = ''; while (end < len) { var ch = html[end]; if (inQuote) { if (ch === quoteChar) inQuote = false; } else { if (ch === '"' || ch === "'") { inQuote = true; quoteChar = ch; } else if (ch === '>') break; } end++; } if (end >= len) end = len - 1; var tagContent = html.substring(i + 1, end); var selfClosing = tagContent.charAt(tagContent.length - 1) === '/'; if (selfClosing) tagContent = tagContent.substring(0, tagContent.length - 1); // Parse tag name and attributes var spaceIdx = tagContent.search(/[\s\/]/); var tagName, attrStr; if (spaceIdx === -1) { tagName = tagContent.trim(); attrStr = ''; } else { tagName = tagContent.substring(0, spaceIdx).trim(); attrStr = tagContent.substring(spaceIdx).trim(); } tagName = tagName.toLowerCase(); var isVoid = VOID_ELEMENTS.indexOf(tagName) !== -1; // Parse attributes var attrs = hbParseAttributes(attrStr); tokens.push({ type: 'open', tag: tagName, attrs: attrs, selfClosing: selfClosing || isVoid, isVoid: isVoid, raw: html.substring(i, end + 1) }); i = end + 1; // Handle raw text elements (script, style) if (RAW_TEXT_ELEMENTS.indexOf(tagName) !== -1 && !selfClosing && !isVoid) { var closeTag = ''); return parts.join(''); } function hbBeautifyCode(html, opts) { var indent = opts.indent || ' '; var sortAttrs = opts.sortAttrs || false; var removeComments = opts.removeComments || false; var preserveInline = opts.preserveInline !== false; var tokens = hbTokenize(html); var output = []; var level = 0; var preserveStack = 0; function addIndent(d) { var r = ''; for (var j = 0; j < d; j++) r += indent; return r; } function isInline(tagName) { return preserveInline && INLINE_ELEMENTS.indexOf(tagName) !== -1; } function isPreserve(tagName) { return PRESERVE_ELEMENTS.indexOf(tagName) !== -1; } for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; if (token.type === 'comment') { if (!removeComments) { if (preserveStack > 0) { output.push(token.value); } else { output.push(addIndent(level) + token.value); } } } else if (token.type === 'doctype') { output.push(token.value); } else if (token.type === 'cdata') { output.push(addIndent(level) + token.value); } else if (token.type === 'open') { var tag = hbBuildTag(token.tag, token.attrs, token.selfClosing, sortAttrs); if (preserveStack > 0) { output.push(tag); if (isPreserve(token.tag) && !token.selfClosing) preserveStack++; } else if (isInline(token.tag)) { // Check if previous output ends with text on the same line if (output.length > 0) { var last = output[output.length - 1]; // If last line has text content, append inline tag to same line var lastNewline = last.lastIndexOf('\n'); var lastLine = lastNewline === -1 ? last : last.substring(lastNewline + 1); if (lastLine.trim() && !lastLine.trim().match(/^<\/(div|section|article|main|header|footer|nav|aside|ul|ol|li|table|tr|td|th|thead|tbody|tfoot|form|fieldset|dl|dt|dd|details|summary|figure|figcaption|blockquote|p|h[1-6]|pre|hr)>/i)) { output[output.length - 1] = last + tag; } else { output.push(addIndent(level) + tag); } } else { output.push(addIndent(level) + tag); } if (!token.selfClosing) { // Don't increase indent for inline elements } } else { output.push(addIndent(level) + tag); if (!token.selfClosing) { if (isPreserve(token.tag)) preserveStack++; level++; } } } else if (token.type === 'close') { if (preserveStack > 0) { if (isPreserve(token.tag)) preserveStack--; output.push(''); } else if (isInline(token.tag)) { // Append closing inline tag to previous line if (output.length > 0) { output[output.length - 1] = output[output.length - 1] + ''; } else { output.push(''); } } else { level--; if (level < 0) level = 0; output.push(addIndent(level) + ''); } } else if (token.type === 'text') { if (preserveStack > 0 || token.preserve) { output.push(token.value); } else { var text = token.value; // Collapse whitespace for non-preserve context var trimmed = text.replace(/\s+/g, ' ').trim(); if (trimmed) { // Check if adjacent to inline elements var prevToken = i > 0 ? tokens[i - 1] : null; var nextToken = i < tokens.length - 1 ? tokens[i + 1] : null; var prevIsInline = prevToken && ((prevToken.type === 'open' && isInline(prevToken.tag)) || (prevToken.type === 'close' && isInline(prevToken.tag))); var nextIsInline = nextToken && ((nextToken.type === 'open' && isInline(nextToken.tag)) || (nextToken.type === 'close' && isInline(nextToken.tag))); if (prevIsInline || nextIsInline) { // Append to previous line for inline continuity if (output.length > 0) { output[output.length - 1] = output[output.length - 1] + trimmed; } else { output.push(trimmed); } } else { output.push(addIndent(level) + trimmed); } } } } } var result = output.join('\n'); // Clean up multiple blank lines result = result.replace(/\n{3,}/g, '\n\n'); return result.trim(); } function hbMinifyCode(html) { // Remove comments html = html.replace(//g, ''); // Collapse whitespace between tags html = html.replace(/>\s+<'); // Collapse internal whitespace html = html.replace(/\s+/g, ' '); // Trim return html.trim(); } /* ── Stats Calculation ───────────────────── */ function hbGetStats(html) { var stats = { totalTags: 0, uniqueTags: {}, maxDepth: 0, attrCount: 0, warnings: [], tagTypes: { block: {}, inline: {}, void_el: {}, semantic: {} } }; var SEMANTIC = ['article','aside','details','figcaption','figure','footer','header','main','mark','nav','section','summary','time']; var BLOCK = ['div','p','h1','h2','h3','h4','h5','h6','ul','ol','li','table','tr','td','th','thead','tbody','tfoot','form','fieldset','legend','blockquote','pre','dl','dt','dd','hr']; var tokens = hbTokenize(html); var stack = []; var depth = 0; for (var i = 0; i < tokens.length; i++) { var t = tokens[i]; if (t.type === 'open') { stats.totalTags++; stats.uniqueTags[t.tag] = (stats.uniqueTags[t.tag] || 0) + 1; if (t.attrs) stats.attrCount += t.attrs.length; // Classify tag if (SEMANTIC.indexOf(t.tag) !== -1) { stats.tagTypes.semantic[t.tag] = (stats.tagTypes.semantic[t.tag] || 0) + 1; } else if (VOID_ELEMENTS.indexOf(t.tag) !== -1) { stats.tagTypes.void_el[t.tag] = (stats.tagTypes.void_el[t.tag] || 0) + 1; } else if (INLINE_ELEMENTS.indexOf(t.tag) !== -1) { stats.tagTypes.inline[t.tag] = (stats.tagTypes.inline[t.tag] || 0) + 1; } else if (BLOCK.indexOf(t.tag) !== -1 || t.tag === 'html' || t.tag === 'head' || t.tag === 'body') { stats.tagTypes.block[t.tag] = (stats.tagTypes.block[t.tag] || 0) + 1; } else { stats.tagTypes.block[t.tag] = (stats.tagTypes.block[t.tag] || 0) + 1; } if (!t.selfClosing) { stack.push(t.tag); depth = stack.length; if (depth > stats.maxDepth) stats.maxDepth = depth; } } else if (t.type === 'close') { stats.totalTags++; // Find matching open tag var found = false; for (var j = stack.length - 1; j >= 0; j--) { if (stack[j] === t.tag) { // Warn about any unclosed tags above this for (var k = stack.length - 1; k > j; k--) { stats.warnings.push('未闭合的 <' + stack[k] + '> 标签'); } stack.splice(j); found = true; break; } } if (!found) { stats.warnings.push('意外的闭合 标签'); } } } // Any remaining tags on stack are unclosed for (var s = 0; s < stack.length; s++) { stats.warnings.push('未闭合的 <' + stack[s] + '> 标签'); } return stats; } /* ── Display Functions ───────────────────── */ function hbShowStats(inputHtml, outputHtml) { var stats = hbGetStats(inputHtml); var inputSize = new Blob([inputHtml]).size; var outputSize = new Blob([outputHtml]).size; document.getElementById('hbStatTags').textContent = stats.totalTags; document.getElementById('hbStatUnique').textContent = Object.keys(stats.uniqueTags).length; document.getElementById('hbStatDepth').textContent = stats.maxDepth; document.getElementById('hbStatAttrs').textContent = stats.attrCount; document.getElementById('hbStatInputSize').textContent = hbFormatSize(inputSize); document.getElementById('hbStatOutputSize').textContent = hbFormatSize(outputSize); document.getElementById('hbStatsRibbon').classList.add('visible'); // Tag breakdown var grid = document.getElementById('hbTagGrid'); grid.innerHTML = ''; var types = [ { obj: stats.tagTypes.semantic, cls: 'tag-pill-semantic', label: 'semantic' }, { obj: stats.tagTypes.block, cls: 'tag-pill-block', label: 'block' }, { obj: stats.tagTypes.inline, cls: 'tag-pill-inline', label: 'inline' }, { obj: stats.tagTypes.void_el, cls: 'tag-pill-void', label: 'void' } ]; var hasAny = false; for (var t = 0; t < types.length; t++) { var keys = Object.keys(types[t].obj).sort(); for (var k = 0; k < keys.length; k++) { hasAny = true; var pill = document.createElement('span'); pill.className = 'tag-pill ' + types[t].cls; pill.innerHTML = '<' + keys[k] + '> ' + types[t].obj[keys[k]] + ''; grid.appendChild(pill); } } if (hasAny) { document.getElementById('hbTagBreakdown').classList.add('visible'); } // Warnings if (stats.warnings.length > 0) { var list = document.getElementById('hbWarningsList'); list.innerHTML = ''; // Deduplicate var unique = []; var seen = {}; for (var w = 0; w < stats.warnings.length; w++) { if (!seen[stats.warnings[w]]) { seen[stats.warnings[w]] = true; unique.push(stats.warnings[w]); } } for (var u = 0; u < unique.length && u < 10; u++) { var li = document.createElement('li'); li.textContent = unique[u]; list.appendChild(li); } document.getElementById('hbWarnings').classList.add('visible'); } // Diff bar var pct, isShrink; if (inputSize === 0) { pct = 0; isShrink = true; } else { var change = ((outputSize - inputSize) / inputSize) * 100; isShrink = change < 0; pct = Math.abs(change); } var fill = document.getElementById('hbDiffFill'); var cappedPct = Math.min(pct, 100); fill.style.width = cappedPct + '%'; fill.className = 'diff-fill ' + (isShrink ? 'shrink' : 'grow'); document.getElementById('hbDiffValue').textContent = (isShrink ? '-' : '+') + pct.toFixed(1) + '%'; document.getElementById('hbDiffBar').classList.add('visible'); } function hbFormatSize(bytes) { if (bytes < 1024) return bytes + ''; return (bytes / 1024).toFixed(1) + 'K'; } /* ── Main Actions ────────────────────────── */ function hbBeautify() { var input = document.getElementById('htmlInput').value; if (!input.trim()) return; var indentSel = document.getElementById('hbIndentSize').value; var indent; if (indentSel === 'tab') indent = '\t'; else indent = new Array(parseInt(indentSel) + 1).join(' '); var opts = { indent: indent, sortAttrs: document.getElementById('hbOptSortAttrs').checked, removeComments: document.getElementById('hbOptRemoveComments').checked, preserveInline: document.getElementById('hbOptPreserveInline').checked }; var output = hbBeautifyCode(input, opts); document.getElementById('htmlOutput').value = output; hbShowStats(input, output); } function hbMinify() { var input = document.getElementById('htmlInput').value; if (!input.trim()) return; var output = hbMinifyCode(input); document.getElementById('htmlOutput').value = output; hbShowStats(input, output); }

    Embed HTML美化器 Widget

    HTML美化器

    引用此内容、页面或工具为:

    "HTML美化器" 于 https://MiniWebtool.com/zh-cn/html美化器/,来自 MiniWebtool,https://MiniWebtool.com/

    由 miniwebtool 团队开发。更新日期:2026-03-07

    文本修改工具:

    常用工具:

    随机信用卡生成器MAC地址查找彩票号码生成器凯利公式计算器网址提取器音频提取器英尺英寸转换为厘米太阳、月亮与上升星座计算器 🌞🌙✨相对标准偏差计算器SRT转为TXT工具🌡️ 体感温度计算器CAGR计算器删除换行符按字符数换行样本量计算器比例计算器随机扑克牌生成器MAC地址生成器职位查找器音频分割器百分比折扣计算器cpm计算器厘米到英尺和英寸转换器毛利率计算器VAT计算器百分比计算器考拉兹猜想计算器图片打码工具调整视频速度FPS 转换器HEX计算器太阳位置计算器对数计算器移除标点符号在线工具血糖转换器定期存款计算器kg到lbs转换器随机IMEI生成器斜边计算器📅 日期计算器随机字母生成器🎮 游戏灵敏度转换器密码强度测试器根式化简器磅转千克转换器为图片添加文字卡方检验计算器Log Base 10 计算器质数检查器One Rep Max (1RM) 计算器英寸到厘米转换器随机化数字随机字符串生成器农历转换器图片压缩器花样字体生成器SHA256 哈希生成器PSI 转 Bar 转换器十六进制到十进制转换器t检验计算器合并视频黄金时刻和蓝调时刻计算器泰勒级数计算器罗马数字转换器椭圆周长计算器视频转图片提取器年度天数计算器 - 今天是今年的第几天填字游戏制作器标准偏差计算器 - 高精度随机选择器随机装备生成器Facebook用户ID查询分数计算器度分秒到十进制转换器三角函数绘图器指数计算器-高精度百分比到ppm转换器积分计算器误差函数计算器位数计算器圆计算器高斯分布生成器srt时间偏移二项式系数计算器卧推计算器复合增长率计算器石头剪刀布生成器颜色代码转换器全格式⏱️ 倒计时器磅到克转换器MAC 地址分析工具利率计算器年龄计算器相关系数计算器MD5哈希生成器厘米到英寸转换器最简分数计算器🖱️ 点击计数器百分比增长率计算器死链检查器百分比变化计算器配色方案生成器隐形文本生成器变异系数计算器年金现值计算器连续数之和计算器迷宫生成器利润计算器发音音标转换器因子计算器循环播放视频新月和满月日历🔊 音调发生器🥧 饼图制作工具DOY日历📷 OCR / 图片文字识别十六进制转CMYK转换器圆形面积计算器数字提取器真心话大冒险生成器英尺到米转换器随机坐标生成器雷诺数计算器龙格-库塔RK4方法计算器atan2计算器伊斯兰历转换器体脂百分比计算器幻方生成器快速傅里叶变换FFT计算器📈 折线图制作工具月相计算器线性回归计算器图片分割器⏱️ 小时计算器平方根计算器总和计算器按位计算器沸点计算器视频压缩器Instagram用户ID查询分数简化多项式展开计算器螺栓扭矩计算器SRT合并工具中位数计算器十进制到十六进制转换器弧长计算器数织生成器-picross每个月的天数燃气与电力成本对比删除线文字生成器半衰期计算器圆柱体体积计算器 高精度斜率截距式计算器翻转视频Voronoi 图生成器两点间距离计算器商和余数计算器斐波纳契数列表闰年清单阶乘计算器随机虚假地址生成器颜料调色计算器WHOIS查询YouTube频道统计图片Base64转换器圆锥展开图模板生成器日复利计算器盎司到克转换器箱线图生成器随机和弦生成器随机数学题生成器anova计算器Webhook测试器周数计算器图片添加线条时间持续计算器楼梯计算器水星逆行日历科学记数法计算器💧 露点计算器预期寿命计算器黄金比例计算器AI标点符号添加器反余弦 (Arccos) 计算器方差计算器 高精度旋转视频条形码生成器椭圆面积计算器纪念日计算器组合计算器质数列表随机PIN生成器随机端口号生成器鞋码转换器3D曲面绘图器AI Token 计数器kpa到psi转换器Mann-Whitney U 检验计算器不可见字符移除器租赁买断计算器辛烷值混合计算器二冲程机油混合计算器发动机排量计算器沙发过门计算器木柴考得计算器空气净化器CADR计算器除湿机尺寸计算器吊扇尺寸计算器窗帘尺寸计算器地毯尺寸计算器挂画高度计算器电视安装高度计算器电视尺寸计算器池塘容积和衬垫计算器泳池盐量计算器泳池容积计算器热水器尺寸计算器环氧树脂计算器栏杆立柱间距计算器踢脚线和装饰线条计算器壁板计算器露台木器染色剂计算器草籽计算器草皮计算器沥青计算器立方码计算器天线长度计算器电线管填充率计算器串联并联电容计算器感抗计算器房间照明计算器勒克斯转流明计算器流明转瓦特转换器发电机功率计算器mah到wh转换器三相功率计算器kVA计算器安培转瓦特计算器瓦特转安培计算器串联电阻计算器摩擦力计算器斜面计算器机械效益计算器声速计算器波速计算器浮力计算器终端速度计算器德布罗意波长计算器光子能量计算器emc2计算器时间膨胀计算器开普勒第三定律计算器逃逸速度计算器万有引力计算器比尔-朗伯定律计算器能斯特方程计算器渗透压计算器沸点升高计算器凝固点降低计算器百分比组成计算器当量浓度计算器质量摩尔浓度计算器pKa到Ka转换器亨德森-哈塞尔巴尔赫计算器理论产量计算器限制反应物计算器电子排布计算器交互式元素周期表AI教案生成器AI测验生成器引用生成器 (APA/MLA/Chicago)出勤率计算器AP分数计算器ACT分数计算器SAT分数计算器百分比转CGPA转换器CGPA转百分比转换器简易评分器 EZ Grader养育孩子成本计算器宝宝奶量计算器尿布尺寸计算器婴儿名字生成器宝宝眼睛颜色预测器儿童BMI百分位计算器儿童身高预测器hcg翻倍时间计算器试管婴儿预产期计算器着床计算器中国生男生女预测器ISO 8601 日期格式化工具儒略日转换器小睡计算器日出日落计算器世界时钟日期罗马数字转换器退休倒计时戒瘾天数计算器半岁生日计算器小费分配计算器电子邮件营销ROI计算器每条线索成本计算器营运资本计算器youtube收益估算器随机RPG角色生成器