当前位置: 首页 > news >正文

MapLibre GL JS第53课:用Web字体样式化标签

📌 学习目标

  • 掌握用Web字体样式化标签的实现方法
  • 理解相关API的使用
  • 能够独立完成类似功能开发

🎯 核心概念

将Web字体应用到样式的文本标签。

💻 完 整 代 码

代码示例

<!DOCTYPEhtml><htmllang="en"><head><title>Style labels with Web fonts</title><metaproperty="og:description"content="Apply Web fonts to your style’s text labels. Unlike signed distance field (SDF) glyph sets, Web fonts are available from a variety of providers, or your can make your own using popular tools. This option is suitable for fonts that are only available through a third-party content delivery network (CDN) for technical or legal reasons, as well as fonts that are incompatible with SDF, such as variable fonts. For compatibility with Android and iOS applications, specify equivalent fonts in the style’s font-faces property."><metaproperty="og:created"content="2025-10-31"/><metacharset='utf-8'><metaname="viewport"content="width=device-width, initial-scale=1"><linkrel='stylesheet'href='https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.css'><scriptsrc='https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.js'></script><linkrel="preconnect"href="https://fonts.googleapis.com"><linkrel="preconnect"href="https://fonts.gstatic.com"crossorigin><linkhref="https://fonts.googleapis.com/css2?family=Rampart+One&amp;display=swap"rel="stylesheet"><style>body{margin:0;padding:0;}html, body, #map{height:100%;}</style></head><body><divid="map"></div><script>document.fonts.load("24px 'Rampart One'");constmap=newmaplibregl.Map({container:'map',zoom:9,center:[137.9150899566626,36.25956997955441],style:{"version":8,"sources":{"satellite":{"type":"raster","tiles":["https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2020_3857/default/g/{z}/{y}/{x}.jpg"],"tileSize":256},"places":{"type":"geojson","data":{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"name":"Azumino"},"geometry":{"type":"Point","coordinates":[137.9054972,36.3044083]}},{"type":"Feature","properties":{"name":"Matsumoto"},"geometry":{"type":"Point","coordinates":[137.9687141,36.2382047]}}]}}},"layers":[{"id":"satellite","type":"raster","source":"satellite"},{"id":"places","type":"symbol","source":"places","layout":{"text-font":["Rampart One"],"text-size":24,"text-field":["get","name"]},"paint":{"text-color":"white"}}]}});</script></body></html>

🔍 代码解析

1. 初始化地图

使用new maplibregl.Map()创建地图实例,配置了卫星影像底图和GeoJSON点数据源。关键点在于通过内联样式对象配置地图,而非使用外部样式URL。

2. 关键配置项

  • document.fonts.load(): 预先加载Web字体,确保字体在地图渲染前可用
  • text-font: 指定使用的Web字体名称(如Rampart One
  • text-field: 使用表达式["get", "name"]从GeoJSON属性中获取标签文本
  • text-color: 设置标签颜色为白色,与卫星底图形成对比

⚙️ 参数说明

参数类型必填说明
text-fontarray指定字体名称数组,支持回退机制
text-sizenumber标签字体大小(像素)
text-fieldexpression定义标签显示内容的表达式
text-colorstring标签颜色,默认黑色

🎨 效果说明

运行代码后,地图显示日本松本市和安曇野市区域的卫星影像底图,在两个标记点上方显示白色的地名标签,字体使用Google Fonts提供的Rampart One字体,呈现独特的手写风格。

💡 常 见 问 题

Q1: Web字体显示为默认字体怎么办?
A:检查以下几点:

  1. 确认已在HTML中引入字体链接(如Google Fonts的link标签)
  2. 使用document.fonts.load()确保字体加载完成后再渲染
  3. 检查字体名称是否正确,注意大小写敏感

Q2: Web字体在移动端不显示?
A:某些移动浏览器对Web字体支持有限,建议:

  1. 在style的font-faces属性中指定fallback字体
  2. 考虑使用系统字体作为备选
  3. 使用font-display: swap提高加载体验

Q3: 如何确保字体加载性能?
A:使用document.fonts.readyPromise等待字体加载完成:

document.fonts.ready.then(()=>{// 字体已加载,初始化地图});

📝 练习任务

  1. 基础练习:尝试更换为其他Google Fonts字体(如Roboto、Open Sans)
  2. 进阶挑战:添加多个不同字体的标签层,展示字体效果差异
  3. 拓展思考:如何实现根据缩放级别动态切换字体大小?
  4. 综合实践:创建一个支持中英文双语标签的地图,使用不同字体

🌟 最佳实践

  1. 字体预加载: 使用document.fonts.load()font-display: swap避免FOIT(Flash of Invisible Text)
  2. 字体回退: 在text-font数组中按优先级排列多个字体,确保兼容性
  3. 跨平台兼容: 为Android和iOS应用在style的font-faces中指定等效字体
  4. 性能优化: 只加载必要的字重和字符集,减少字体文件大小
  5. 对比度保证: 标签颜色与底图要有足够对比度,确保可读性

🔗 延伸阅读

  • Map API文档

  • MapLibre GL JS 官方文档

  • [下一课预告]:将继续学习地图图层的基础知识

http://www.zskr.cn/news/1536631.html

相关文章:

  • Java 转大模型开发:把学习路线变成作品集
  • 2026年开封装修公司选购指南:全包半包整装如何避坑与高性价比破局 - 优质企业观察收录
  • 去屑控油洗发水怎么选?2026高口碑去屑洗发水!实测真正有效款 - 新闻快传
  • 2026杭州百达翡丽名表配件溢价实测|全套/裸表差价内幕、变现避坑7大品牌阶梯测评 - 薛定谔的梨花猫
  • AtlasOS软件管理终极指南:3步搞定Windows应用安装卸载难题
  • 软件破解版风险剖析:技术原理、安全危害与正版替代方案
  • 阿里巴巴推出智能简历解析神器 - SmartResume,解放HR?
  • 2026可商用字体网站实测:这6个平台值得收藏
  • 如何快速免费下载抖音无水印视频:终极完整指南
  • 计算机毕业设计之基于spark的图书推荐系统的设计与实现
  • 如何快速掌握input-overlay:直播者的完整输入可视化教程
  • 2026阳江企业补贴申请靠谱代办推荐|本地TOP4正规机构申报避坑指南 - 资讯纵览
  • 助睿实验 6-2:浏览器用户画像分析 - 大屏数据接入
  • 2026年 冷水机厂家最新推荐榜单:风冷/水冷/螺杆式工业冷水机,低温/防爆/化工冷水机品牌实力与口碑盘点 - 企业推荐官【官方】
  • Wireshark图文步骤(附安装包,2026最新)
  • 2026年包头酒店设备用品回收完全指南 - 优质企业观察收录
  • 30天自制操作系统终极指南:从零构建你的第一个操作系统
  • 去屑洗发水哪个牌子效果好?公认排行榜前五名的宝藏洗发水 - 新闻快传
  • JAVA内部类基础
  • 从实验室微观晶相到国民餐桌,悠米兔定义新生代健康陶瓷餐 - 资讯报道
  • 2026年哈尔滨优质职业教育院校甄选:深耕本土职教,铁路、高铁乘务、火车司机、航空服务等,兼顾多元升学与定向就业 - 海棠依旧大
  • Steam Deck控制器Windows驱动深度解析:SWICD完整实战指南
  • 2026报考云南机器人工程专业,强烈推荐这四所 - 品牌2026
  • 2026年投身线下零基础AI培训,值不值?江浙沪转行实录 - 品牌报告
  • 后端技术23-撮合引擎<50微秒!GDAX交易所的微服务架构揭秘,Go+Kafka+Cassandra交易所技术栈的极致性能
  • 2026国内闸阀/蝶阀/不锈钢阀门/化工阀门/沪工阀门TOP5!广东佛山等地供应链口碑过硬广受好评 - 十大品牌榜
  • 2026压滤机/厢式压滤机/板框压滤机厂家推荐榜单:江苏苏东化工 - 奔跑123
  • 官宣底价!今晚20:00苹果全面破价,iPhone17跌至4000+!手把手教你叠满国补与618红包,轻松省千元 - 资讯焦点
  • specs/features/DragAndDrop.spec.md中的测试用例
  • 天津滨海全域优选!品尚艺墅深耕 14 年,装修靠谱不踩坑 - 速递信息