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

Uniapp使用地图的时候滑动上层的view地图也滑动

问题根源分析

  1. 原生组件层级:uniapp中的原生地图组件(如<map>)默认处于最高层级,普通视图元素无法覆盖
  2. 事件冒泡机制:触摸事件会穿透到下层组件
  3. 滚动冲突:当内容滚动到底部/顶部时继续滑动会触发父容器滚动

完整解决方案

步骤1:结构优化
<template>
  <!-- 地图容器使用固定布局 -->
  <view class="map-container">
    <map 
      id="myMap" 
      style="width:100%;height:100vh" 
      :latitude="latitude" 
      :longitude="longitude"
    ></map>
  </view>

  <!-- 覆盖层使用 cover-view -->
  <cover-view 
    class="mapViewBox" 
    :style="viewStyle" 
    v-if="viewPlan"
    @touchmove.prevent.stop="noop"
    catchtouchmove
  >
    <!-- 关闭按钮使用原生组件 -->
    <cover-image 
      class="close-btn" 
      src="/static/icon/cancel.png" 
      @click="viewPlan = false"
    />

    <!-- 滚动区域隔离事件 -->
    <scroll-view 
      scroll-y 
      class="content-scroll"
      @touchstart.stop="noop"
      @touchmove.stop="noop"
    >
      <!-- 内容区域 -->
    </scroll-view>

    <!-- 底部按钮 -->
    <cover-view class="navigation">
      <button @click="mapNavigation">到这里去</button>
    </cover-view>
  </cover-view>
</template>
步骤2:样式控制
/* 地图容器 */
.map-container {
  position: fixed;
  width: 100%;
  height: 100vh;
  z-index: 1; /* 确保低于覆盖层 */
}

/* 覆盖层 */
.mapViewBox {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 9999; /* 必须高于地图层级 */
  background: #fff;
  max-height: 60vh;
  touch-action: none; /* 禁用默认滚动 */
  box-shadow: 0 -4rpx 20rpx rgba(0,0,0,0.1);
  
  .content-scroll {
    height: calc(60vh - 120rpx); /* 动态高度计算 */
    overflow: hidden;
  }
}

/* 关闭按钮定位 */
.close-btn {
  position: absolute;
  top: -100rpx;
  right: 30rpx;
  width: 30rpx;
  height: 30rpx;
  z-index: 10000;
}
步骤3:事件处理
<script setup>
// 空操作函数阻止事件冒泡
const noop = () => {};

// 动态计算样式
const viewStyle = ref({});
onMounted(() => {
  const systemInfo = uni.getSystemInfoSync();
  viewStyle.value = {
    width: '100%',
    maxHeight: `${systemInfo.windowHeight * 0.6}px`
  };
});
</script>

核心原理详解

  1. 层级控制
    z-index:9999 确保覆盖层在地图组件之上
    position:fixed 脱离文档流避免布局错乱
    • 使用 cover-viewcover-image 原生组件覆盖地图

  2. 事件拦截
    @touchmove.prevent.stop:阻止默认滚动行为 + 停止事件冒泡
    catchtouchmove:小程序专用属性,捕获并终止事件传递
    touch-action:none:CSS属性禁用浏览器默认滚动处理

  3. 滚动隔离
    scroll-view 设置固定高度(calc(60vh - 120rpx)
    • 底部按钮使用绝对定位,避免占据滚动空间
    overflow:hidden 防止内容溢出导致穿透


扩展优化建议

  1. 性能优化
// 在 onPageScroll 生命周期中阻止滚动穿透
onPageScroll(e) {
  if(this.viewPlan) return false;
}
  1. 视觉优化
/* 添加渐变遮罩提示 */
.mapViewBox::after {
  content: '';
  position: absolute;
  bottom: 120rpx;
  left: 0;
  right: 0;
  height: 60rpx;
  background: linear-gradient(to top, rgba(255,255,255,1), rgba(255,255,255,0));
}
  1. 平台差异处理
// 条件编译处理不同平台
// #ifdef MP-WEIXIN
viewStyle.value.maxHeight = '60vh';
// #endif

最终效果验证

  1. 覆盖层滑动时地图保持静止
  2. 滚动到底部/顶部时不会触发地图移动
  3. 点击操作正常响应无穿透
  4. 各平台(H5、小程序、APP)表现一致

通过以上方案,可有效解决uniapp地图组件与覆盖层的滚动冲突问题。如仍有异常,请检查是否使用了非原生组件实现地图功能。

相关文章:

  • 【DevOps】Backstage介绍及如何在Azure Kubernetes Service上进行部署
  • 附下载 | 2024 OWASP Top 10 基础设施安全风险.pdf
  • Shader中着色器的编译目标级别
  • vue3数据双向绑定解析
  • Unity3D 着色器优化(Shader Optimization)
  • 机器人基础知识
  • 如何设置GET请求的参数?
  • SAP SD学习笔记31 - 销售BOM
  • Java基础入门流程控制全解析:分支、循环与随机数实战
  • 部署MuseTalk时, MMCV问题解决方案
  • 【MyBatis Plus 逻辑删除详解】
  • DICOM开发者常用DICOM开源库详解
  • 推理大模型时代,TextIn ParseX助力出版业知识资产重构
  • 全球领先的光学方案设计公司:倚光科技
  • Android Spinner总结
  • 23、vue3+vite配置环境变量实现开发、测试、生产的区分
  • LLM最新的模型微调技术有哪些
  • c语言闯算法--常用技巧
  • LINUX 指令大全
  • 养生,点亮健康生活
  • 保利42.41亿元竞得上海杨浦东外滩一地块,成交楼面单价超8万元
  • 河南省平顶山市副市长许红兵主动投案,接受审查调查
  • 上海楼市“银四”兑现:新房市场高端改善领跑,二手房量价企稳回升
  • 洛杉矶奥组委确认2028年奥运会和残奥会开闭幕式场地
  • 上海“随申兑”服务平台有哪些功能?已归集800余个惠企政策
  • 万里云端遇见上博--搭乘“上博号”主题飞机体验记