小程序页面滚动穿透

2023-10-29

小程序页面滚动穿透

一、场景

  • 框架: Taro2
  • Taro3不生效的
  • 在项目当中,基础遇到这样的需求

有一个长列表,或者其他可滚动展示的页面,
在这个页面会弹出一个Modal层,如下:

贝壳找房的 的筛选栏

在这里插入图片描述

二、问题

如果这个弹框内容不可滚动,不会有太大问题;

但是当弹出内容是可以滚动的时候,就会有问题,

触摸没有滚动的区域会发现滚动可以穿透,会传递给下面的列表页面,

三、解决办法

程序员是面向Google编程的,找到了下面的解决办法:

  • 监听弹框状态,如果弹框展示就给列表 添加对应样式
 // isShowMask 弹框是否展示
 <view class="dog-container {{isShowMask ? 'bottom-fixed' : ''}}"></view>
.bottom-fixed {
    position: fixed;
    left: 0;
    top: 0;
    overflow: hidden;
}
  • 给遮罩层添加 catchtouchmove的阻止
myCatchTouch: function () {
    return;
}
<view wx:if="{{alert}}" catchtouchmove="myCatchTouch">
    <template is="alert" data="{{alertData}}" />
</view>

这样的话,底部的列表内容就不会出现溢出,也自然不会滚动,

::: warning
但是,这样的做法有一个弊端,

不会去记录我之前访问的位置,也就是每次点开弹框,列表位置会归零,体验终归是不好的。
:::

四、升级方案

于是我去翻了一些开源小程序UI的Demo,去试试看这种弹框类型的交互,

最后发现在Taro UI中有一个组件,Float LayOu,是没有出现穿透的,列表位置也没有发生改变,

Taro UI 一套基于 Taro 框架开发的多端 UI 组件库

  • 于是,我翻了源码,发现他是这样写的(有删减):
  // 重点A:阻止事件冒泡
  handleTouchMove = (e) => {
    e.stopPropagation()
  }
  render() {
    return (
      <View className='rootClass' onTouchMove={this.handleTouchMove}>
        <!-- 遮罩层 --> 
        <View onClick={this.close} className='at-float-layout__overlay' />
        <View className='at-float-layout__container layout'>
          <View className='layout-body'>
            <!-- 重点B: ScrollView(开启scrollY)--> 
            <ScrollView
              scrollY
              scrollX={false}
              className='layout-body__content'
            >
              {this.props.children}
            </ScrollView>
          </View>
        </View>
      </View>
    )
  }
  • 思路解析:

i、首先,需要在自定义弹框的根元素,添加 onTouchMove 监听,并阻止时间的冒泡


    <View className='rootClass' onTouchMove={this.handleTouchMove}>

ii、但是,里面的内容,就不能滚动了,那么,可以使用 ScrollView代替View,并开启Y轴的滚动

    <ScrollView
        scrollY
        scrollX={false}
        className='layout-body__content'
    >
    <!-- 内容区域-->
    <!-- 内容区域-->
    </ScrollView>

按照这样的思路,我在项目里面尝试了下,果然奏效,这样的方式更优雅体验也更好。

笔者使用了Taro,但原理都是一样的。

  • 最终效果:

在这里插入图片描述

五、关于stopPropagation

简单来说:

::: tip
JavaScript中,冒泡和捕获是事件流的两种行为,使用event.stopPropagation()可以起到阻止捕获和冒泡阶段中当前事件的进一步传播。

而使用event.preventDefault()可以取消默认事件。
:::

事件流

事件流描述的是从页面中接受事件的顺序,分为

  • IE的事件流是 事件冒泡流,

  • 标准的浏览器事件流是 事件捕获流。

好了,希望对大家有用,对事件流有兴趣的可以自行Google

或者看下这片文章:JavaScript的事件流


Ending…



csdn

github

个人站点

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小程序页面滚动穿透 的相关文章

  • JavaScript CSV 验证

    如何检查文本框中的逗号分隔值并在未找到时发出警报 如果有的话 里面应该有字符 比如A B C D function validate validate text box
  • 为什么 Jshint 在此 if 语句中说“变量已定义”?

    我有这个代码 if something is true var someVar true else var someVar false JsHint 表示在 else 语句部分 someVar 已被定义 这是为什么 我该如何解决 Thank
  • 如何使用标准 JavaScript 在 CSS 转换结束后立即重新启动它?

    我构建了一种密码生成器 只要倒计时到期 它就会显示新密码 不幸的是 我只设法弄清楚如何运行我的代码一次 倒计时由一个简单的 CSS 过渡组成 我想保留它 因为它比我的其他尝试平滑得多 其中我尝试使用 JavaScript 重复更新宽度 va
  • Mongoose 查询执行后回调函数从未被调用

    以下是我的代码 mongoose connect mongodb localhost mydatabase var db mongoose connection db on error console error bind console
  • 如何从 javascript 错误对象读取错误消息

    有人可以帮我解决以下问题吗 我正在通过 redux 操作进行后调用 如下所示 export const addEmployee firstName surname contactNumber email gt async dispatch
  • 多次训练brain.js?

    在第一次训练后 如何将新信息 仅新信息 而不是所有信息 因为这会花费太多性能 训练到我的用 Brain js 制作的神经网络 它有点粗糙 但您可以使用以下结构来实现 如果我们加入 2 个训练数据集 旧数据集与新数据集 然后重新训练keepN
  • 有没有办法让 jslint 在 javascript 的下一行中使用大括号?

    我改变了我的编码风格 function getParams entity use strict var accountID store getItem AccountID switch entity case Topic to functi
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • setTimeout范围问题

    我在控制玩家重生的函数内部定义了一个 setTimeout 我正在创建一个游戏 var player death function this alive false Console log death var timer3 setTimeo
  • 在 UIWebView 中禁用复制和粘贴

    几乎 我已经尝试了一切方法来禁用复制 粘贴UIWebView但对我来说没有任何作用 我正在加载我的UIWebView来自字符串 字符串数组 如下所示 webView loadHTMLString NSString stringWithFor
  • 如何防止输入文本中出现“后重音”

    我相信这是一个简单的问题 但在谷歌上搜索几个小时后我找不到任何答案 也许我无法在搜索中使用正确的单词 P 我有一个 javascript 方法 可以防止用户用数字以外的其他字符填充文本框 如下面的代码所示 它在 KeyDown 事件中使用
  • 对使用“new”创建的数组上“map”的行为感到困惑[重复]

    这个问题在这里已经有答案了 我对结果感到困惑mapping 使用创建的数组new function returnsFourteen return 14 var a new Array 4 gt undefined x 4 in Chrome
  • jquery 中可点击 div 中的按钮

    我有整个 div 您可以单击它来切换该 div 的主要部分 问题是我在该 div 中也有可点击的按钮 当我点击它时 它会执行它应该做的事情 但同时也会切换整个 div 我怎样才能禁用它 Use event stopPropagation 单
  • 使用 Javascript/Node.js 在代码内执行 mongoimport

    node js javascript 中是否有任何库可供个人使用mongoimport在代码中 据我了解 mongoimport 有点像 exe 您必须先执行它 然后才能使用其文本输入环境 是否可以在我的代码中执行 mongoimport
  • 将文本字段限制为仅包含数字的最佳方法?

    I m using the following Javascript to restrict a text field on my website to only accept numerical input and no other le
  • 如何绕过Access-Control-Allow-Origin?

    我正在一个平台上对我自己的服务器进行ajax调用 他们设置了阻止这些ajax调用的平台 但我需要它从我的服务器获取数据以显示从我的服务器数据库检索到的数据 我的 ajax 脚本正在运行 它可以将数据发送到我的服务器的 php 脚本以允许其处
  • JQuery $.ajax() 在 java servlet 中发布数据

    我想将数据发送到 java servlet 进行处理 数据将具有可变长度并采用键 值对 A1984 1 A9873 5 A1674 2 A8724 1 A3574 3 A1165 5 数据不需要这样格式化 这就是我现在的方式 var sav
  • 在 Meteor 应用程序中实现 MongoDB 2.4 的全文搜索

    我正在考虑向 Meteor 应用程序添加全文搜索 我知道 MongoDB 现在支持此功能 但我对实现有一些疑问 启用文本搜索功能的最佳方法是什么 textSearchEnabled true 在 Meteor 应用程序中 有没有办法添加索引
  • Safari 扩展将消息发送到特定选项卡

    有没有办法从全局页面发送消息到特定选项卡 我目前正在做的是 在创建选项卡时 注入的脚本会创建一个唯一的 ID 并将包含该编号的消息发送到全局页面 并且全局页面会保存该编号 如果全局页面需要发送一些数据到一个tab 即 tab 3 然后全局页
  • 使用
    元素作为 JavaScript 代码的输入。这是最好的方法吗?

    各位 显然 我是编码新手 所以最近完成了一些有关 HTML 和 Javascript 的 Lynda 课程后 我的简单 HTML 页面遇到了困难 基本上 我想要的是使用 JavaScript 进行基本计算 让用户使用 HTML 输入两个数字

随机推荐

  • R实战:【基本类型】可扩展时间序列类型xts(Extensible Time Series)

    R实战系列专栏 本文翻译自 xts Extensible Time Series Jeffrey A Ryan Joshua M UlrichMay 18 2008 背景介绍 在xts出现之前 R语言有很多种时间序列类型 这对最终的用户来说
  • [网络通信] NIO高性能通信实战(一)

    网络通信 NIO高性能通信实战 一 文章目录 网络通信 NIO高性能通信实战 一 NIO 三大核心 缓冲区 Buffer 通道 Channel 选择器 Selector 通道的注册 选择器的检查 零拷贝实现高性能文件传输 小结 REFERE
  • Quaternion

    01 欧拉角 1 欧拉角Vector3 x y z 代表的是旋转物体 若是标准旋转那么是旋转坐标轴x y z 转换为旋转物体则旋转角度取反顺序不变 且是将物体从物体坐标系旋转到惯性坐标系 世界坐标系中为了渲染 故旋转顺序为 z y x也就是
  • linux命令之cd,ls,vi进入及退出文件

    一 cd用来进入指定的某个目录 说cd这个命令是Linux上使用率最高的两个命令之一不为过吧 另一个当然是ls了 前两天看到了一个cd命令的小技巧是我一直都不知道的 呵呵 这里顺便记下来 cd 回到上次所在目录 感觉还是比较有用 省略了很多
  • 关于“No subject alternative DNS name matching”的解决

    最近突然后台报错 I O error on POST request for https test xxxxxxx com api xxx xxx xxx java security cert CertificateException No
  • RHP-Zero

    https www powerelectronics com technologies power management article 21860287 understanding the righthalfplane zero part
  • python作品-python实例作品

    广告关闭 腾讯云双11爆品提前享 精选热门产品助力上云 云服务器首年88元起 买的越多返的越多 最高满返5000元 多尺度模板匹配结果不要拿我的话来说 这种方法的作品 我们来看一些例子 打开您的终端并执行以下命令 multi scale t
  • unity3d coroutine、invoke的应用

    提供了两种异步方式的调用 1 coroutine 协程 应该是untity对c 多线程的一种封装吧 内部不是很了解 调用的函数需标示IEnumerator迭代配合yield return xxx使用 yield标示着是否暂停迭代 yield
  • 荣耀Magicbook安装黑苹果教程(OpenCore引导)

    荣耀笔记本电脑Magicbook安装黑苹果双系统教程 有空再写 可以先看下面的参考资料 准备工作 系统 macOS 12 3 1 Monterey 21E258 u盘 两个 一个用于安装黑苹果系统 一个用于引导修复 磁盘分区等工作 无线网卡
  • Java 正确的做字符串编码转换

    Java 正确的做字符串编码转换 字符串的内部表示 字符串在java中统一用unicode表示 即utf 16 LE 对于 String s 你好哦 如果源码文件是GBK编码 操作系统 windows 默认的环境编码为GBK 那么编译时 J
  • 2013年度总结 -- 向着IT前进

    各位朋友 请将手机调整到飞行模式 我们将乘时光机回到2013年元月 一起见证作者Mr Chen在过去这一年里的 丰功伟绩 现在开始闭上眼睛 进入倒计时10 9 8 7 6 5 4 3 2 1 2013年元月 上线前的冲刺 兄弟们 辛苦一下
  • 【工具使用】STM32CubeMX-DMA配置(ADC+DMA 和 UART+DMA)

    一 概述 无论是新手还是大佬 基于STM32单片机的开发 使用STM32CubeMX都是可以极大提升开发效率的 并且其界面化的开发 也大大降低了新手对STM32单片机的开发门槛 本文主要讲述STM32芯片的DMA的配置及其相关知识 二 软件
  • 计算机快捷键大全截图,电脑截图快捷键是哪个?电脑快捷键使用大全

    原标题 电脑截图快捷键是哪个 电脑快捷键使用大全 在电脑日常工作中 截图是经常会使用到的功能 相信绝大数的用户都是通过第三方截图软件 比如QQ 旺旺等程序自带的电脑截图功能 却不知道Win系统中也是自带截图工具 和键盘上某键配合使用 键盘上
  • Vue 路由的params参数

    1 路由的params参数 1 配置路由 声明接收params参数 routes path about component About component Home children path news component News com
  • android flash无图标,Android - Android - 安装应用(APP) 不显示桌面图标、隐藏图标

    PackageManager COMPONENT ENABLED STATE ENABLED 显示应用图标 PackageManager COMPONENT ENABLED STATE DISABLED 隐藏应用图标 我用这俩个值来显示和隐
  • 天龙3d服务器维护,《新天龙八部》2017年3月6日全服更新维护公告

    亲爱的玩家 大家好 为保证游戏运行的稳定性 提升整体服务质量 新天龙八部 游戏全部服务器 部分服务器将提前至5 00维护 具体服务器列表请见公告下方 将于2017年3月6日7 00 9 00进行更新维护 维护后版本号升级为3 61 5303
  • -bash: /usr/bin/yum: No such file or directory解决方案

    删除了yum文件 导致yum命令出现 bash情况 root localhost yum bash usr bin yum No such file or directory 解决方案 http mirrors 163 com centos
  • el-select下拉框:数据回显后,无法重新选中或修改

    选中其他值以后 数据并没有发生改变 且无法选中 解决 给el select 点击事件 change getTeacherId 强制数据刷新 表单同理 input getTeacherId getTeacherId val this next
  • 数据可视化第四章

    比例数据 是根据类别 子类别和群体来进行划分的数据 对于比例 通常想要得到最大值 最小值和总体分布 前两者比较简单 将数据由小到大进行排列 位于两端的分别就是最小值和最大值 数据对比也是比例可视化的一个重要应用 在一个图表中集中反映多个维度
  • 小程序页面滚动穿透

    小程序页面滚动穿透 一 场景 框架 Taro2 Taro3不生效的 在项目当中 基础遇到这样的需求 有一个长列表 或者其他可滚动展示的页面 在这个页面会弹出一个Modal层 如下 贝壳找房的 的筛选栏 二 问题 如果这个弹框内容不可滚动 不