小程序页面滚动穿透

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(使用前将#替换为@)

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

  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • 如何测试 javascript 闭包内的函数

    这似乎是不可能的 也可能是 但我正在尝试更多的 TDD 但我总是在闭包方面碰壁 假设我有以下内容 function createSomething init function privateMethod param return init
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 使用模数按字母顺序对列表进行排序

    我在获取元素列表并按字母顺序对它们进行排序方面没有任何问题 但我很难理解如何使用模数来做到这一点 更新 这是按我的方式工作的代码 但是 我更喜欢下面提供的答案的可重用性 因此接受了该答案
  • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

    首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 如何更改此 jquery 插件的时区/时间戳?

    我正在使用这个名为 timeago 的插件 在这里找到 timeago yarp com 它工作得很好 只是它在似乎不同的时区运行 我住在美国东部 费城时区 当我将准确的 EST 时间放入 timeago 插件时 比如 2011 05 28
  • 为什么 jquery 没有检测到单选按钮未被选中的情况? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery radioButton change 在取消选择期间不会触发 https stackoverflow com questions 5176803 jquery radiobutton c
  • 如何获取浏览器视口中当前显示的内容

    如何获取当前正在显示长文档的哪一部分的指示 例如 如果我的 html 包含 1 000 行 1 2 3 9991000 并且用户位于显示第 500 行的中间附近 那么我想得到 500 n501 n502 或类似的内容 显然 大多数场景都会比
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • 如何从图像输入中获取 xy 坐标?

    我有一个输入设置为图像类型

随机推荐

  • 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层 如下 贝壳找房的 的筛选栏 二 问题 如果这个弹框内容不可滚动 不