
简介这份资源是面向UI设计师、前端开发者与产品原型制作者的Sketch格式全球国旗图标素材库内含260多个国家和地区的国旗图形可解决国际化项目中快速调用统一风格国旗图标的需求适用于移动应用、网站界面、教育软件、地理信息系统及国际会议宣传物料等场景。压缩包为zip格式整体约89.05MB以Sketch矢量源文件为主并附带Read Me.html使用说明其中circle、pin、hexagon、square、rectangle等子文件对应地图标记、按钮、布局元素等不同展示形态方便按场景直接取用。目前已有1842人学习下载说明该素材在设计与开发群体中具备一定认可度。借助矢量可编辑特性使用者能自由调整尺寸、颜色并与其他Sketch文件集成在保证视觉一致性的同时显著减少逐个绘制国旗的重复劳动提升国际化设计项目的产出效率。1. 260多个国旗图标集从 Sketch 素材包到多端交付的完整链路手上接到一个国际化产品改版需求设计稿里要铺满各国国旗运营还要按地区灵活替换。第一反应是去搜「国旗图标 png」结果要么尺寸参差、要么授权不明、要么缺小语种国家。后来拿到一份 260 多个世界各国国旗图标集_sketch素材下载.zip才算把这件事按工程化方式跑通。这个素材包本质是一套矢量国旗源文件核心价值不在「图多」而在于它能被 Sketch 直接打开、按图层管理、批量导出成任意尺寸和格式。它适合三类人做海外业务 UI 的设计师、需要把国旗接进前端组件的工程师、以及要给数据大屏配国家标识的开发者。下面我把从打开素材包到落地到代码里的整条链路拆开讲包括参数怎么设、坑在哪。2. 拆开 Sketch 国旗素材包图层结构与命名规范决定了后续效率拿到压缩包先别急着双击打开解压后看一眼目录结构这一步能省掉后面大量返工。常见做法是包里会有一个 .sketch 主文件加若干导出好的位图但真正有价值的是那个矢量源文件。理解它的图层组织方式才能决定你是直接导出用还是拆成组件接进设计系统。2.1 国旗图标的三种常见图层组织方式第一种是「一国旗一画板」260 多个画板平铺在画布上命名通常是国家英文名或 ISO 代码。这种结构适合批量导出因为 Sketch 的导出功能可以按画板批量走。第二种是「一国旗一 Symbol」把每面国旗做成 Symbol好处是改一处全局同步适合接进组件库。第三种是「分组图层」所有国旗塞在一个画板里用 Group 区分这种最坑导出时容易连背景一起带出去。判断方式很简单打开左侧图层列表看顶层是画板还是分组。如果是画板直接进导出流程如果是 Symbol先想清楚你的设计系统要不要复用它如果是分组建议先手动拆成画板虽然费点时间但后面批量导出会顺很多。2.2 命名规范与 ISO 代码对齐国旗素材最容易翻车的地方是命名。有的包用China有的用CN有的用china-flag。如果你要接进前端命名必须和 ISO 3166-1 alpha-2 代码对齐也就是两位大写字母。我一般会先做一次重命名把画板名统一成CN、US、JP这种格式。在 Sketch 里批量重命名可以用插件也可以手动改。手动改的话选中画板后在右侧检查器的 Name 字段改。改完的好处是导出时文件名直接就是CN.png、US.svg前端拿到就能用不用再写一层映射表。这一步花二十分钟后面省两小时。2.3 矢量 vs 位图什么时候该用哪种素材包里如果同时有矢量和位图选哪个取决于你的使用场景。矢量Sketch 原生形状适合需要缩放的场景比如响应式布局里国旗要从 16px 变到 64px。位图适合固定尺寸、对渲染性能敏感的场景比如长列表里几百个国旗同时出现。我的习惯是UI 里用 SVG 导出数据大屏或需要极致性能的列表用 PNG 的 2x 和 3x。Sketch 导出时选 SVG 要注意勾选「Outline」还是「Preserve」前者把文字转曲后者保留可编辑性。国旗一般没有文字选哪个都行但如果有国徽细节建议 Preserve 后再手动检查。3. 从 Sketch 批量导出国旗格式、尺寸与命名的一次性配置素材包能不能高效用起来八成取决于导出这一步配得对不对。Sketch 的导出功能看着简单但批量处理 260 多个画板时参数设错一个后面就得全部重来。这一章把导出配置、脚本辅助和常见格式选择讲透。3.1 Sketch 内置导出Make Exportable 的正确用法选中一个画板右侧检查器底部有「Make Exportable」区域。点加号添加导出规格可以设尺寸1x、2x、3x 或自定义宽高和格式PNG、JPG、SVG、PDF、EPS。批量导出的关键是先选中所有画板再统一设导出规格Sketch 会按每个画板分别导出。具体步骤在画布上框选所有国旗画板右侧检查器会显示「多个画板选中」状态此时设一个导出规格比如 PNG 2x然后点右下角「Export Selected」。弹窗里选一个空文件夹Sketch 会按画板名生成文件。这里有个细节如果画板名有斜杠或特殊字符导出文件名会出问题所以前面重命名那步很重要。3.2 用 sketchtool 命令行批量导出Sketch 自带一个命令行工具sketchtool适合需要反复导出或接进 CI 的场景。macOS 上装了 Sketch 后在终端里能直接调用。下面这条命令把指定画板导出成 SVG# 导出 .sketch 文件里所有画板为 SVG输出到 ./flags 目录 sketchtool export artboards \ --output./flags \ --formatssvg \ --items* \ ./flags-source.sketch逻辑说明export artboards指定导出对象是画板--output是输出目录必须提前建好--formatssvg指定格式可以换成png并配合--scales2导出二倍图--items*表示全部画板也可以写具体画板名只导几个。参数上--scales只对位图格式生效SVG 不需要。如果导出报错说找不到文件检查路径是不是相对路径sketchtool对相对路径的处理有时不直观建议用绝对路径。3.3 导出格式选择SVG、PNG、PDF 的取舍格式适用场景优点注意点SVGWeb UI、响应式布局无损缩放、体积小复杂路径在旧浏览器可能渲染异常PNG移动端、数据大屏兼容性好、渲染快需要多倍图体积大PDF打印、设计交付矢量、跨平台Web 端不直接用我一般给前端交付 SVG给移动端交付 PNG 的 2x 和 3x给打印物料交付 PDF。如果素材包里的国旗是位图转的矢量导出 SVG 后要检查路径节点数节点太多会导致文件臃肿这时候用 Sketch 的「Layer Path Simplify」简化一下。3.4 导出后的文件校验导出完别直接扔给前端先做一次校验。检查三件事文件数量对不对260 多个不能少、文件名是不是 ISO 代码、SVG 能不能正常打开。可以用一段简单的 shell 脚本数文件并列出异常命名# 统计导出目录下的文件数并列出不符合两位大写字母命名的文件 ls ./flags | wc -l ls ./flags | grep -vE ^[A-Z]{2}\.(svg|png)$逻辑说明第一行数总数第二行用正则筛出不符合「两位大写字母加扩展名」的文件。如果有输出说明命名有问题回去改画板名重新导出。这一步能拦住大部分低级错误。4. 把国旗接进前端从静态资源到组件化的落地方式导出只是中间产物真正要用起来还得接进代码。这一章讲三种落地方式纯静态资源、CSS Sprite、以及组件化封装。选哪种取决于你的项目规模和更新频率。4.1 静态资源直接引用最简单的方式是把导出的 SVG 放进public/flags/目录用的时候拼路径// 根据国家代码获取国旗图片路径 function getFlagUrl(countryCode) { // countryCode 必须是两位大写字母如 CN、US const code countryCode.toUpperCase(); // 简单校验防止路径注入 if (!/^[A-Z]{2}$/.test(code)) { console.warn(Invalid country code: ${countryCode}); return null; } return /flags/${code}.svg; }逻辑说明函数接收国家代码转大写后校验格式返回路径。参数上countryCode建议从后端接口拿不要在前端硬编码国家列表。这种方式的缺点是每次新增国家要重新部署静态资源优点是简单、无构建依赖。4.2 用构建工具批量导入如果项目用 Vite 或 Webpack可以用import.meta.glob或require.context批量导入避免手动维护列表// Vite 环境下批量导入所有国旗 SVG const flagModules import.meta.glob(/public/flags/*.svg, { eager: true }); // 构建国家代码到 URL 的映射 const flagMap {}; for (const path in flagModules) { // 从路径中提取文件名如 /public/flags/CN.svg - CN const code path.split(/).pop().replace(.svg, ); flagMap[code] flagModules[path].default; } export function getFlag(countryCode) { return flagMap[countryCode.toUpperCase()] || null; }逻辑说明import.meta.glob是 Vite 的批量导入 APIeager: true表示同步导入。参数上路径要写对/public在 Vite 里是特殊目录实际引用时可能不需要前缀具体看构建配置。这种方式适合国旗数量固定、不常更新的场景。4.3 封装成 React/Vue 组件如果多个页面都要用国旗封装成组件更合适。以 React 为例// Flag.jsx - 国旗组件 import React from react; // 预导入所有国旗实际项目可以用动态导入优化 const flags import.meta.glob(/public/flags/*.svg, { eager: true, as: url }); export function Flag({ code, size 24, alt }) { const upperCode code?.toUpperCase(); const src flags[/public/flags/${upperCode}.svg]; if (!src) { // 找不到国旗时渲染占位避免布局塌陷 return span style{{ width: size, height: size * 0.75, display: inline-block }} /; } return ( img src{src} width{size} height{size * 0.75} alt{alt || ${upperCode} flag} loadinglazy / ); }逻辑说明组件接收code、size、alt三个参数。size控制宽度高度按常见国旗比例 4:3 算。找不到国旗时渲染一个同尺寸占位防止列表布局跳动。参数上loadinglazy对长列表很重要能减少首屏请求。如果项目里国旗出现频率极高可以考虑用 CSS Sprite 替代单独请求。4.4 蓝湖等协作平台导入 Sketch 素材的注意点团队里如果设计稿走蓝湖这类协作平台把 Sketch 国旗素材导进去时要注意蓝湖对 Symbol 的支持和 Sketch 原生不完全一致导入后可能出现图层错位。常见做法是先把国旗画板导出成 PNG 或 SVG再作为图片上传到蓝湖而不是直接传 .sketch 源文件。另外蓝湖的标注功能对矢量图支持有限如果前端需要精确的颜色值建议在 Sketch 里先取色记录再对照蓝湖标注核对。5. 国旗素材落地避坑从授权到渲染的五个真实翻车点这一章全是血泪经验。国旗素材看着简单但涉及授权、政治敏感、渲染兼容、性能、更新维护五个维度每个都能让项目翻车。5.1 授权不明导致商用风险现象素材包下载页没写授权协议直接用在商业产品里后来收到版权方邮件。原因很多国旗素材是从维基百科或其他公开渠道收集的原始授权可能是 CC BY-SA 或公有领域但打包者没标注。解决用之前查每个国旗的来源。国旗本身多数属于公有领域但特定设计版本可能有版权。稳妥做法是用政府公开的国旗规范图或者选明确标注 MIT、CC0 的素材包。商用前让法务过一遍别省这一步。5.2 国家代码与地区标识混淆现象前端按TW拿国旗结果拿到的是错误标识或者某些地区代码在素材包里根本不存在。原因ISO 3166-1 有国家代码也有地区代码素材包可能只覆盖国家不覆盖地区。另外有些代码存在争议。解决先确认你的产品需要哪些代码和素材包的覆盖范围做一次 diff。缺失的代码要么补图要么用中性占位图。代码映射表要单独维护不要散落在各处。5.3 SVG 在部分浏览器渲染异常现象Chrome 里正常的国旗 SVG在 Safari 或某些安卓 WebView 里显示不全或颜色错乱。原因SVG 里用了filter、mask或复杂路径不同浏览器渲染引擎支持度不同。解决导出 SVG 后用 SVGOMG 这类工具优化去掉不必要的滤镜和元数据。如果还不行降级用 PNG。测试时至少覆盖 Chrome、Safari、Firefox 和主流安卓 WebView。5.4 长列表里几百个国旗同时渲染卡顿现象国家选择列表里 200 多个国旗同时加载页面滚动卡顿内存飙升。原因每个国旗一个独立请求加上没有懒加载浏览器同时处理几百个图片解码。解决用虚拟列表只渲染可视区域配合loadinglazy。或者把小尺寸国旗合成一张 Sprite 图用background-position定位。Sprite 方案适合尺寸固定的场景能显著减少请求数。5.5 素材更新后前端映射失效现象素材包更新了一版新增了几个国家但前端映射表没同步新国家显示占位图。原因素材和代码分离更新不同步。解决把素材导出和映射表生成做成一个脚本每次更新素材后自动重新生成映射文件。映射文件纳入版本控制更新时走 code review。这样素材和代码的变更能对应上不会漏。6. 国旗素材的进阶玩法自动化流水线与按需裁剪基础链路跑通后可以往上做一层自动化。我现在的习惯是素材包更新后跑一个脚本完成导出、优化、生成映射、校验四件事全程不用手动开 Sketch。下面是一个可复用的流水线思路。6.1 用脚本串起导出与优化核心是用sketchtool导出再用svgo优化 SVG最后生成映射文件。三步写成一条命令链#!/bin/bash # build-flags.sh - 国旗素材自动化流水线 set -e # 任何一步失败就退出 SOURCE./flags-source.sketch OUTPUT./public/flags TMP./tmp-flags # 1. 清理旧文件 rm -rf $OUTPUT $TMP mkdir -p $OUTPUT $TMP # 2. 从 Sketch 导出 SVG sketchtool export artboards \ --output$TMP \ --formatssvg \ --items* \ $SOURCE # 3. 用 svgo 优化并移动到目标目录 # --multipass 多次优化--pretty 保留可读性 npx svgo --folder$TMP --output$OUTPUT --multipass # 4. 生成映射文件 node -e const fs require(fs); const files fs.readdirSync($OUTPUT).filter(f f.endsWith(.svg)); const map {}; files.forEach(f { const code f.replace(.svg, ); map[code] /flags/ f; }); fs.writeFileSync($OUTPUT/../flag-map.json, JSON.stringify(map, null, 2)); console.log(Generated map with, files.length, flags); 逻辑说明脚本分四步清理、导出、优化、生成映射。set -e保证出错即停避免半成品。svgo的--multipass会多次优化直到体积不再减小对国旗这种路径较多的图效果明显。最后用 Node 生成 JSON 映射前端直接 import 这个 JSON 即可。参数上--folder和--output的路径要对应好svgo不会自动建目录。6.2 按需裁剪只打包用到的国旗如果产品只面向特定区域没必要把 260 多个国旗全打进包。可以在流水线里加一个白名单过滤// filter-flags.js - 按白名单过滤国旗 const fs require(fs); const path require(path); // 从配置读取需要的国家代码 const needed require(./needed-countries.json); // 如 [CN, US, JP] const sourceDir ./public/flags; const targetDir ./public/flags-filtered; fs.mkdirSync(targetDir, { recursive: true }); needed.forEach(code { const src path.join(sourceDir, ${code}.svg); if (fs.existsSync(src)) { fs.copyFileSync(src, path.join(targetDir, ${code}.svg)); } else { console.warn(Missing flag: ${code}); } }); console.log(Copied ${needed.length} flags);逻辑说明从needed-countries.json读白名单逐个复制到目标目录缺失的打印警告。参数上白名单可以按业务线拆成多个文件比如needed-asia.json、needed-europe.json构建时按需组合。这样能把包体积从几 MB 降到几百 KB。6.3 验证流水线是否可靠流水线跑完后做一次端到端验证随机抽几个国家代码检查文件存在、SVG 能打开、映射表里有对应项。我一般写一个简单的测试脚本接进 CI每次素材更新自动跑。这样素材包换版本时不会出现「设计说更新了前端说没生效」的扯皮。这套流水线我用了快两年最大的体会是国旗素材这种看似一次性的资源一旦接进产品就会反复用到前期把自动化做扎实后面每次新增国家或换素材包都是几分钟的事。希望帮到你。本文还有配套的精品资源点击获取