导出按钮应使用预设CSS类名(如export-btn--pdf)映射Unicode图标,避免JS动态插入或硬编码HTML;统一用flex布局对齐图标与文字,支持SVG symbol集中管理,格式标识须与MIME类型严格一致。
导出按钮旁加格式图标,用 CSS 类名直接映射文件类型
图标不是靠 js 动态插入,而是靠预设的 class 名自动匹配——比如 export-btn--pdf 对应 pdf 图标,export-btn--xlsx 对应 excel 图标。这样既避免 dom 操作开销,也方便维护。
常见错误是把图标当图片硬塞进 HTML,结果导出格式一变就要改 HTML,还容易漏掉新格式支持。
- 所有导出按钮统一用
export-btn基础类,再叠加格式后缀,如export-btn export-btn--csv - CSS 中用属性选择器或类名组合控制图标:例如
.export-btn--pdf::before { content: "?"; } - 优先用 Unicode 符号(如
?、?、?)而非图片,减少请求、适配暗色模式、缩放不失真 - 如果必须用 SVG,用 inline
<svg></svg>或 CSSbackground-image,别用<img src="...">—— 后者无法通过 class 批量控制,且加载失败时留白难处理
Vue/React 里动态渲染图标,别在模板里拼接字符串
在组件中根据 format 字段决定图标时,不要写成 <span>{{ format === 'pdf' ? '?' : format === 'xlsx' ? '?' : '?' }}</span> 这种长三元嵌套——可读性差,新增格式就得改逻辑。
更稳妥的做法是建一个映射表,让格式字符串直连图标符号或组件。
- Vue 示例:
const iconMap = { pdf: '?', xlsx: '?', csv: '?', docx: '?' };,模板中用{{ iconMap[format] || '?' }} - React 同理,定义
iconMap对象,避免在 JSX 里写条件判断链 - 如果项目已用图标库(如 Heroicons),就映射到组件名,比如
pdf: <documenttexticon></documenttexticon>,但注意确保所有格式键都覆盖,否则undefined渲染会报错 - 务必校验
format值是否在映射表中,未命中时给默认图标,而不是留空或报错
图标对齐和尺寸不一致?统一用 flex + line-height 控制
导出按钮文字和图标高度不齐、间距忽大忽小,根本原因常是用了不同字体或未重置垂直对齐方式。Unicode 图标本质是文字,得按文本流处理。
别给图标单独设 margin-top 或 vertical-align: middle 硬调——不同字体下 middle 含义不同,移动端尤其容易偏移。
- 按钮容器用
display: flex; align-items: center;,图标和文字自然居中 - 图标本身设
font-size: inherit;和line-height: 1;,让它跟随按钮字号缩放 - 避免给图标设固定
width/height,Unicode 符号宽高比不固定,强行拉伸会变形 - 如需微调间距,在图标前后加
margin-inline-start或margin-inline-end(兼容性够用),别用margin-left
导出格式多、图标需求复杂?用 SVG symbol 集中管理
当需要支持十几种格式(如 jsonld、ttl、shp),Unicode 不够用,又不想每个页面都引入一堆 SVG 标签,就得用 <svg><symbol></symbol></svg> 方案。
关键不是“怎么画图标”,而是“怎么按需取用不冗余”。很多人把 symbol 写在每个组件里,结果打包体积暴涨。
- 所有格式图标统一收口到一个
icons.svg文件,每个图标用<symbol id="icon-pdf"></symbol>定义 - 在 HTML
底部一次性<svg><use href="/icons.svg#icon-pdf"></use></svg>,之后全站可用<use href="#icon-pdf"></use> - Vue/React 中封装
FormatIcon组件,接收formatprop,内部转成 symbol ID(如icon-${format}),再生成<use></use> - 注意:Webpack/Vite 默认不处理 SVG 中的
<symbol></symbol>,需配置svg-sprite-loader或用插件提取 symbol
最易被忽略的是图标语义一致性——比如 .export-btn--xlsx 和 .export-btn--xls 被当成两种格式,实际用户根本分不清。格式标识必须和后端返回的 MIME type 或文件扩展名严格对齐,否则映射表再漂亮也白搭。










