标签云必须用包裹,每个标签为子元素,内含带data-weight属性的或,url需encodeuricomponent编码。

标签云必须用 <ul></ul> 包裹,不是 <div> 或一堆独立 <code>@#@#@#@#@#@#@#@#@#@0。这样 JS 可读取做归一化,CSS 可用属性选择器动态控制字号(如 a[data-weight="4"] { font-size: 1.6em; }),且不污染语义或样式逻辑。
为什么不能用 class:
-
class="tag-large"是表现层描述,无法表达“这个词出现频次高”的业务含义 - 归一化时需重映射(比如把 0–100 的原始频次缩放到 1–4),class 名无法动态生成
- 后续想加权重排序、过滤或导出数据时,
data-属性天然支持 JS 获取,class 需正则解析
每个标签必须是 <li> 子元素,且内部只能是 <a></a> 或 <span></span>
<ul></ul> 的直接子元素只能是 <li>,这是 HTML5 规范强制要求。每个 <li> 内推荐只放一个 <a></a>(带跳转)或 <span></span>(仅展示,如已选中的筛选项)。
典型结构示例:
注意点:
- 不要在
<li>里套<div> 或嵌套其他块级元素 <li>禁用 <code>float布局——用display: inline-flex或inline-block+vertical-align控制对齐 - 响应式字号优先用
clamp(0.8rem, 4vw, 1.6rem)或em,避免写死px
URL 参数必须 encodeURIComponent() 编码,否则空格和中文会出错
如果标签文字含空格、中文或特殊符号(如 C++),直接拼进 URL 会导致路由失败或 400 错误。必须用 JavaScript 对 href 值做编码:
const tag = "C++";
const encoded = encodeURIComponent(tag); // → "C%2B%2B"
const link = `/tag/${encoded}`;
服务端接收时也要对应解码(如 Node.js 用 decodeURIComponent())。漏掉这步,用户点击“人工智能”标签可能跳转成 /tag/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD 后被后端拒收,或前端路由匹配失败。
容易被忽略的地方:开发时用英文测试一切正常,上线后中文标签全 404——问题往往就卡在这行编码没做。











