Bootstrap Navbar与Leaflet地图Div重叠问题解决求助
解决Bootstrap固定导航栏与Leaflet地图重叠问题
问题场景
给简单的Leaflet地图添加Bootstrap导航栏后,出现容器重叠问题:地图(含缩放按钮)被导航栏遮挡,地图从浏览器顶部开始渲染,而非导航栏底部。
原代码
<!DOCTYPE html> <html> <head> <title>Title</title> <meta charset="UTF-8"> <!-- Leaflet--> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.1/dist/leaflet.css" /> <script src="https://unpkg.com/leaflet@1.9.1/dist/leaflet.js"></script> <!-- Jquery --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script> <!-- Bootstrap--> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> <style> html, body {height: 100%; margin: 0;} #map { width: 100%; height: 100%; } </style> </head> <body> <!-- Simple Navbar--> <nav class="navbar navbar-expand-lg navbar-light bg-light fixed-top"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> <li class="nav-item"> <select class="custom-select"> <optgroup label="Menu"> <option selected value="0">Option 0</option> <option value="1">Option 1</option> <option value="2">Option 2</option> <option value="3">Option 3</option> </optgroup> </select> </li> </ul> </div> </nav> <!-- Div for my Leaflet map--> <div id='map'></div> <script> myMap = L.map('map') myMap.setView([0,0], 3) BgLayer = L.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png') BgLayer.addTo(myMap) </script> </body> </html>
效果截图

解决方法
重叠原因是fixed-top类的导航栏固定在视口顶部,不占据文档流空间,导致地图从顶部开始渲染。以下两种Bootstrap适配方案可解决:
方案一:适配固定导航栏的内边距与地图高度
- 给
<body>添加Bootstrap内边距类pt-5(对应顶部内边距3rem,适配默认56px高度的导航栏,可根据实际导航栏高度调整为pt-4等),避免地图顶部被遮挡。 - 修改地图容器的CSS高度,用
calc(100vh - 56px)替代100%,确保地图高度为视口高度减去导航栏高度,不会超出视口。
修改后的完整代码:
<!DOCTYPE html> <html> <head> <title>Title</title> <meta charset="UTF-8"> <!-- Leaflet--> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.1/dist/leaflet.css" /> <script src="https://unpkg.com/leaflet@1.9.1/dist/leaflet.js"></script> <!-- Jquery --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script> <!-- Bootstrap--> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> <style> html, body {height: 100%; margin: 0;} #map { width: 100%; height: calc(100vh - 56px); } </style> </head> <body class="pt-5"> <!-- Simple Navbar--> <nav class="navbar navbar-expand-lg navbar-light bg-light fixed-top"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> <li class="nav-item"> <select class="custom-select"> <optgroup label="Menu"> <option selected value="0">Option 0</option> <option value="1">Option 1</option> <option value="2">Option 2</option> <option value="3">Option 3</option> </optgroup> </select> </li> </ul> </div> </nav> <!-- Div for my Leaflet map--> <div id='map'></div> <script> myMap = L.map('map') myMap.setView([0,0], 3) BgLayer = L.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png') BgLayer.addTo(myMap) </script> </body> </html>
方案二:改用粘性导航栏
如果不需要导航栏始终固定在顶部,可将导航栏的fixed-top类替换为sticky-top。该类会让导航栏在文档流中占据空间,滚动到顶部时自动固定,地图会自动从导航栏下方开始渲染,无需额外调整样式:
<nav class="navbar navbar-expand-lg navbar-light bg-light sticky-top">
内容的提问来源于stack exchange,提问作者Lucien S.
相关产品推荐
相关产品推荐

