草庐IT

微信小程序解决view点击事件穿透地图map触发markertap

Joke# 2023-06-30 原文

微信小程序中使用map组件,ios手机中点击地图上的view,会触发底下的markertap,只要底下如果有marker点的话。

这就造成了用户体验不是很好。

然后无意间我发现点击能滑动的scroll-view反而不会触发底下的markertap,就等于是一个不穿透的容器。我就在想是不是view也可以换成scroll-view,然后防止穿透点击,答案是:可以。

但是体验还是不太好,因为scroll-view会滑动,所以按钮里面的内容也会滑动,不是最佳的解决方法。于是,我就想到可以用透明的可滑动的scroll-view放在上层作为隐形按钮,下层放普通的按钮样式,这回真正的解决了ios的bug。

一、地图上覆盖的子组件代码

wxml代码

<view class="box">
    <swiper circular>
        <swiper-item wx:for="{{switchArr}}">
            <view class="container" catchtap="switchItem" data-index="{{index}}" data-name="{{item.name}}">
                <view class="card">
                    <view class="content">
                        <view class="icon">
                            <image src="{{item.imageUrl}}" mode="aspectFill"></image>
                        </view>
                        <view class="bt">
                            <view class="title">{{item.name}}</view>
                        </view>
                    </view>
                </view>
            </view>
            <scroll-view class="scroll-view" scroll-y="true" catchtap="switchItem" data-index="{{index}}" data-name="{{item.name}}">
                <view style="height:100vh;"></view>
            </scroll-view>

        </swiper-item>
    </swiper>
    <view class="cancelSwitch" style="top:{{statusHeight+3}}px" catchtap="cancelSwitch">
        <text>退出页面</text>
    </view>

</view>

less代码

/* pages/subPack/otherAnimation/index.wxss */

page {
    box-sizing: border-box;
    font-family: sans-serif;
}

.cancelSwitch{
    position: absolute;
    left: 40rpx;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 210rpx;
    height: 60rpx;
    line-height: 60rpx;
    border-radius: 30rpx;
    color:#fff;
    background-color: #d94251;
    image{
        width: 35rpx;
        height: 30rpx;
        margin-left: 3rpx;
    }
}
.box{
    position: fixed;
    z-index: 10000;
    min-height: 100vh;
    background-color: #1a1c22;
    width: 100%;

    swiper {
        width: 100%;
        height: 100vh;

        swiper-item {
            width: 100%;
            height: 100vh;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;

            .container {
                position: relative;
                display: flex;
                justify-content: space-around;
                align-items: center;
                width: 710rpx;

                .card {
                    width: 100%;
                    margin: 20px;
                    padding: 40px 30px;
                    border-radius: 40px;
                    background-color: #20252a;
                    border: 4rpx solid #ffefa1;
                    box-shadow: -0px -0px 10px #ffefa1;

                    .imgBx {
                        position: relative;
                        text-align: center;
                    }
                    .content {
                        text-align: center;
                        display: flex;
                        flex-wrap: wrap;
                        justify-content: center;
                        align-items: center;

                        .icon {
                            padding: 20px;
                            margin-top: 15px;
                            height: 100%;
                            width: 120%;
                            border-radius: 40px;
                            color: #32a3b1;
                            font-size: 16px;
                            overflow: hidden;
                            text-decoration: none;
                            background: #20252a;
                            box-shadow: 13px 13px 26px #181c20, -13px -13px 26px #282e35;

                            image {
                                width: 100%;
                                border-radius: 10px;
                            }
                        }

                        .bt {
                            display: inline-block;
                            padding: 10px 20px;
                            margin-top: 45px;
                            border-radius: 40px;
                            color: #ffefa1;
                            font-size: 16px;
                            text-decoration: none;
                            background: #20252a;
                            box-shadow: 20px 20px 41px #161a1d,
                                -20px -20px 41px #2a3037;

                            &:hover {
                                background: #20252a;
                                box-shadow: inset 20px 20px 41px #161a1d,
                                    inset -20px -20px 41px #2a3037;
                            }
                        }
                    }
                    &:hover {
                        background: #20252a;
                        box-shadow: inset 20px 20px 41px #161a1d,
                            inset -20px -20px 41px #2a3037;
                    }

                }
            }
            .scroll-view{
                width: 750rpx;
                background-color: #fff;
                position:absolute;
                height: 1000rpx;
                opacity: 0;
            }
        }
    }
}

js代码

const app = getApp();
Component({
  data: {
    statusHeight: app.globalData.statusHeight,
    buttonCanUse:true
  },
  properties: {
      switchArr:{
          type:Array,
          value:[]
      }
  },
  methods: {
    switchItem(e) {
        if(!this.data.buttonCanUse){
            return
        }
        this.setData({
            buttonCanUse:false
        })
        this.triggerEvent('switchItem', {
            index:e.currentTarget.dataset.index,
            name:e.currentTarget.dataset.name
        })
        this.setData({
            buttonCanUse:true
        })
    },
    cancelSwitch() {
        this.triggerEvent('cancelSwitch')
    },
  }
})

二、小程序效果

map效果:map上面有很多点位 这些点位都是可以点击进去其他页面的点

 切换旅游路线的子组件:是覆盖在map之上的一个容器 z-index:10000

点击就可以切换到路线

三、问题所在

点击这个全景路线的时候 如果点击的位置下方有一个marker点,则他触发两个点击事件,即同时切换路线 同时进入marker点链接的路径

四、解决思路

利用可滑动的scroll-view不会穿透的特性,在子组件上面插入隐形scroll-view,设置点击事件,(用户以为点击的是子组件,实际上点击的是scroll-view,这是一个通用的思路),然后将scroll-view大小覆盖子组件

五、代码分析

核心代码:

<view class="container" catchtap="switchItem" data-index="{{index}}" data-name="{{item.name}}">
  <view class="card">
    <view class="content">
       <view class="icon">
         <image src="{{item.imageUrl}}" mode="aspectFill"></image>
       </view>
       view class="bt">
         <view class="title">{{item.name}}</view>
       </view>
    </view>
   </view>
</view> 
<scroll-view class="scroll-view" scroll-y="true" catchtap="switchItem" data-index="{{index}}" data-name="{{item.name}}">
       <view style="height:100vh;"></view>
</scroll-view>
.scroll-view{
   width: 750rpx;
   background-color: #fff;
   position:absolute;
   height: 1000rpx;
   opacity: 0;
}

 <view class="container" catchtap="switchItem" data-index="{{index}}" data-name="{{item.name}}">是子组件里面每个路线的容器,点击可以切换路线

我在同级写了一个scroll-view 设置宽度750rpx撑满屏幕 然后高度1000rpx盖住整个路线容器 并且将透明度改为零(即opacity:0)

然后在wxml中 设置scroll-y=“true” 在scroll-view里面放一个高度100vh的盒子,让整个scroll-view可滑动,因为scroll-y,所以是上下滑动。

这里为什么不设置scroll-x=“true” 然后在横向上滑动 是因为 我本身用了swiper组件 左右滑动切换,用scroll-x的话,两个滑动事件会冲突,会影响原有的滑动感受。然后在scroll-view上

然后在scroll-view上添加原本写在container上面的点击的点击事件,让用户点的实际上是scroll-view

这样就可以保证ios系统手机点击不会穿透了。

有关微信小程序解决view点击事件穿透地图map触发markertap的更多相关文章

  1. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  2. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  3. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  4. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  7. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  8. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  9. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  10. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

随机推荐