You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Leaflet.js页面预加载器仅显示在导航栏问题求助

问题:Leaflet地图页面预加载器仅显示在导航栏区域

在使用Leaflet.js的带导航栏地图页面中,因Leaflet库加载速度慢添加了预加载器,但预加载器仅显示在导航栏区域,无法覆盖整个页面。

问题原因

  1. 预加载器未设置全屏覆盖样式,默认仅在文档流中占据空间
  2. 页面导航栏和地图元素未被预加载器遮挡,缺少全屏遮罩层级
  3. 原JS代码中main元素不存在,显示控制逻辑错误

解决方案

1. 修改HTML结构

将导航栏和地图包裹在统一容器中,方便控制显示状态:

<!DOCTYPE html>
<html style="height: 100%; margin:0;">
<head>
  <title> METAFARM WORLD </title>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="icon" type="image/x-icon" href="/favicon.ico">
  <link rel="stylesheet" type="text/css" href="css/style.css">
  <link rel="stylesheet" type="text/css" href="css/loader1.css">
  <link rel="stylesheet" href="scripts/leaflet/leaflet.css">
  <script src="scripts/leaflet/leaflet.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
  <script src="https://unpkg.com/moralis-v1/dist/moralis.js"></script>
  <script src="https://github.com/WalletConnect/walletconnect-monorepo/releases/download/1.6.2/web3-provider.min.js"></script>
  <script src="js/main.js"></script>
</head>
<body style="height: 100%; margin: 0;">
  <!-- 预加载器容器 -->
  <div class="loader-container">
    <div class="loader">
      <div class="circle"></div>
      <div class="circle"></div>
    </div>
  </div>

  <!-- 页面内容容器 -->
  <div class="page-content">
    <div dir="rtl" style="display:flex;justify-content:flex-end;padding:0.3em;background-color:rgb(4, 24, 54);color:rgb(33, 191, 150);align-items:center">
      <button style="margin-right: 1rem;width:7rem;color:rgb(33, 191, 150);cursor:pointer;height:2rem;margin-left:1rem" id="btn-logout">Logout</button>
      <button style="width:7rem;color:rgb(33, 191, 150);cursor:pointer;height:2rem;margin-left:1rem" id="btn-login">Authenticate</button>
      <button onclick="window.open('https://mfarmgame.com/index.php/ico/metafarm-initial-coin-offering/')" style="margin-left:1rem;background-color:#1890ff;color:white; height:2rem;border:0;cursor:pointer;width:7rem;border-radius:0.2em">
        Presale
      </button>
      <button onclick="window.open('https://marketplace.mfarmgame.com')" style="margin-left:1rem;background-color:#1890ff;color:white; height:2rem;border:0;cursor:pointer;width:7rem;border-radius:0.2em">
        Marketplace
      </button>
      <button onclick="window.open('https://mfarmgame.com')" style="margin-left:1rem;background-color:#1890ff;color:white; height:2rem;border:0;cursor:pointer;width:7rem;border-radius:0.2em">
        Home
      </button>
      <div style="padding:1em;border:1px solid black;border-radius:1em;background-color:rgb(51, 102, 102);margin-left:0.4rem" id="div-wallet">
      </div>
      <a style="margin-left:0.4rem" href="https://mfarmgame.com">
        <svg width="60" height="60" viewBox="0 0 183.33 183.33" fill="none" xmlns="http://www.w3.org/1999/xlink"><polygon points="151.9,156.28 121.26,168.97 90.63,181.67 59.99,168.97 29.35,156.28 16.67,125.65 3.97,95.01 16.67,64.37 29.35,33.74 59.99,21.05 90.63,8.36 121.26,21.05 151.9,33.74 164.59,64.37 177.28,95.01 164.59,125.65 " fill="#009933"></polygon><polygon points="99.77,95.35 127.53,150.76 125.26,154.57 119.98,154.57 91.41,110.76 66.51,153.91 55.97,153.91 51.41,146.27 19.88,94.7 40.7,61.91 45.17,71.79 37.7,94.82 60.5,130.67 81.48,94.68 53.72,39.27 56,35.45 61.27,35.45 90.87,77.89 114.74,36.12 125.28,36.12 129.84,43.75 161.38,95.33 140.55,128.11 136.09,118.24 143.55,95.2 120.75,59.35 " fill="#ffffff"></polygon></svg>
      </a>
    </div>
    <div id="map" style="width: 100%; height: calc(100% - 66px); background: #003333; margin: 0;"></div>
  </div>

  <script type="text/javascript" src="./index.js"></script>
  <script type="text/javascript"> 
    async function initApp() {
      var map = L.map('map').setView([0, 0], 2);
      L.tileLayer('maps/16x162/{z}/{x}/{y}.png', {
        minZoom: 2,
        maxZoom: 6,
        continuousWorld: false,
        noWrap: true,
      }).addTo(map);

      let MY_INVENTORY = await loadInventory(); 

      var bounds = [[43.100983, 1.757813], [40.446947, -1.801758]];
      var rect1 = L.rectangle(
        bounds, 
        { 
          color: calculateColor(getInventoryItemById(MY_INVENTORY, 1 )),
          weight: 1.5 
        }
      ).addTo(map);
      var popup1 = metadataToPopup(getInventoryItemById(MY_INVENTORY, 1 ));
      rect1.bindPopup(popup1);

      var bounds = [[48.04871, 1.757813], [43.100983, -5.405273]];
      var rect2 = L.rectangle(
        bounds, 
        { 
          color: calculateColor(getInventoryItemById(MY_INVENTORY,2)),
          weight: 1.5 
        }
      ).addTo(map);
      var popup2 = metadataToPopup(getInventoryItemById(MY_INVENTORY,2));
      rect2.bindPopup(popup2);
      
      return map;
    }
  </script>
</body>
</html>

2. 修改CSS样式

添加全屏预加载器容器样式,默认隐藏页面内容:

@import url('https://fonts.googleapis.com/css?family=Lato|ZCOOL+KuaiLe&display=swap');

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

body {
  font-family: 'Lato', sans-serif;
  font-size: 18px;
  line-height: 1.6;
  height: 100vh;
  overflow: hidden;
}

/* 预加载器容器 - 全屏覆盖 */
.loader-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(255, 255, 255, 0.9);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 9999;
  transition: opacity 0.5s ease;
}

/* 页面内容 - 默认隐藏 */
.page-content {
  width: 100%;
  height: 100%;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.5s ease, visibility 0.5s ease;
}

/* 加载完成后显示内容 */
.page-content.loaded {
  opacity: 1;
  visibility: visible;
}

/* LOADER 动画样式 */
.loader {
  height: 50px;
  transform-origin: bottom center;
  animation: rotate 3s linear infinite;
}

.circle {
  display: inline-block;
  background-color: purple;
  height: 40px;
  width: 40px;
  border-radius: 50%;
  transform: scale(0);
  animation: grow 1.5s linear infinite;
  margin: -10px;
}

.circle:nth-child(2) {
  background-color: palevioletred;
  animation-delay: 0.75s;
}

@keyframes rotate {
  to {
    transform: rotate(360deg);
  }
}

@keyframes grow {
  50% {
    transform: scale(1);
  }
}

3. 修改JS逻辑

等待地图初始化完成后隐藏预加载器,替换原超时逻辑:

const loaderContainer = document.querySelector('.loader-container');
const pageContent = document.querySelector('.page-content');

async function initLoader() {
  try {
    // 等待地图初始化完成
    await initApp();
    
    // 平滑隐藏预加载器
    loaderContainer.style.opacity = '0';
    setTimeout(() => {
      loaderContainer.style.display = 'none';
    }, 500);
    
    // 显示页面内容
    pageContent.classList.add('loaded');
  } catch (error) {
    console.error('地图加载失败:', error);
    // 加载失败仍显示页面内容
    loaderContainer.style.display = 'none';
    pageContent.classList.add('loaded');
  }
}

initLoader();

内容的提问来源于stack exchange,提问作者Sam Black

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:48:32