如何让Leaflet地图与顶部导航栏适配屏幕高度
解决方案
核心问题分析
- 用
100vh设置地图高度时,会忽略顶部导航栏的高度,导致地图整体超出屏幕范围 - 设置
height:100%地图不显示,是因为html和body元素默认没有明确的高度值,百分比高度依赖父级元素有确定高度才能生效
修复步骤
1. 统一页面基础样式
给html、body设置高度并清除默认边距,确保页面布局的基准正确:
html, body { height: 100%; margin: 0; padding: 0; }
2. 用Flex布局实现自适应高度
使用Flex布局让地图自动填充导航栏剩余的屏幕空间,这种方式比固定计算导航栏高度更灵活,能适配导航栏折叠/展开的场景:
body { display: flex; flex-direction: column; } #map { flex: 1; }
3. 修复代码中的其他问题
- 删除重复引入的旧版Leaflet.js(
//cdn.leafletjs.com/leaflet-0.7.3/leaflet.js),避免版本冲突 - 修正Bootstrap4导航栏的折叠按钮属性:将
data-bs-toggle改为data-toggle,data-bs-target改为data-target(Bootstrap4不支持data-bs-*前缀,这是Bootstrap5的用法)
完整修复后的代码
<!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Bootstrap CSS --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css" integrity="sha256-kLaT2GOSpHechhsozzB+flnD+zUyjE2LlfWPgU04xyI=" crossorigin=""/> <!-- Make sure you put this AFTER Leaflet's CSS --> <script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js" integrity="sha256-WBkoXOwTeyKclOHuWtc+i2uENFpDZ9YPdf5Hf+D7ewM=" crossorigin=""></script> <title>Mapview</title> <style> html, body { height: 100%; margin: 0; padding: 0; } body { display: flex; flex-direction: column; } #map { flex: 1; } </style> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <div class="container-fluid"> <a class="navbar-brand" href="#">Navbar</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNavAltMarkup"> <div class="navbar-nav mx-auto"> <a class="nav-link active" aria-current="page" href="#">Home</a> </div> </div> </div> </nav> <div id="map"></div> <script> var map = L.map('map').setView([51.505, -0.09], 13); L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>' }).addTo(map); </script> <!-- Optional JavaScript --> <!-- jQuery first, then Popper.js, then Bootstrap JS --> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> </body> </html>
内容的提问来源于stack exchange,提问作者mapperx
相关产品推荐
相关产品推荐

