当前位置: 首页 > 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.jsqmd.com/news/1024764/

相关文章:

  • Java 转大模型开发:把学习路线变成作品集
  • 2026年开封装修公司选购指南:全包半包整装如何避坑与高性价比破局 - 优质企业观察收录
  • 佛山出黄金别瞎跑!2026 变现底层逻辑看懂少亏千元 - 奢侈品交易观察员
  • 联合概率质量函数(Joint PMF)实战:从电商购物行为到推荐算法基石
  • 2026 年优质服务商汇总,全国前十名小程序开发公司精选 - FaiscoJeff
  • 去屑控油洗发水怎么选?2026高口碑去屑洗发水!实测真正有效款 - 新闻快传
  • 2026杭州百达翡丽名表配件溢价实测|全套/裸表差价内幕、变现避坑7大品牌阶梯测评 - 薛定谔的梨花猫
  • 软件破解版风险剖析:技术原理、安全危害与正版替代方案
  • 光合力量 60W 双头款植物补光灯|大空间植物景观专业补光方案 - 资讯报道
  • 2026年上门提货零担物流平台四家头部服务哪家强 - 奔跑123
  • 电商品牌GEO服务商典范实践:荷里购如何打造现象级人工智能心智突围 - 新闻快传
  • 2026可商用字体网站实测:这6个平台值得收藏
  • AtlasOS软件管理终极指南:3步搞定Windows应用安装卸载难题
  • 阿里巴巴推出智能简历解析神器 - SmartResume,解放HR?
  • 如何快速免费下载抖音无水印视频:终极完整指南
  • 深圳钢材供应商横评:交付能力与品质保障体系分析 - 资讯焦点
  • 5分钟掌握大麦自动抢票:Python自动化抢票工具实战指南
  • 2026 贵阳装修公司怎么选?十家主流品牌全解析 - 装修新知
  • 如何快速部署Go-LDAP管理平台:企业身份认证的完整解决方案
  • 告别重复登录:5分钟让你的AI助手拥有浏览器记忆
  • 2026郑州网站建设公司实测推荐榜:10家服务商设计技术实力横评+选型避坑全攻略 - 资讯报道
  • 贵州全包装修怎么选?工艺、报价、售后全维度拆解 - 品研笔录
  • 如何快速掌握input-overlay:直播者的完整输入可视化教程
  • 计算机毕业设计之基于spark的图书推荐系统的设计与实现
  • 2026年内蒙古设备报废处置全链条解决方案深度横评指南 - 优质企业观察收录
  • 2026年全球数字泵五大品牌权威推荐:从伺服驱动到智能投加,高精度流体计量设备选型全攻略 - 品研笔录
  • 2026阳江企业补贴申请靠谱代办推荐|本地TOP4正规机构申报避坑指南 - 资讯纵览
  • 团队如何落地低代码开发,完整实施经验分享
  • 淮南职业技术学院中专部 2026 招生火热开启!正规公办中专,给孩子可靠好出路 - 我叫小周
  • 装修不踩坑!2026年五大全屋定制高环保板材品牌推荐 - 科技焦点