弹框实现效果及对话框跟随手势下拉的实现方法解析 汤姆网站导航推广页
栏目:网络推广 发布时间:2026-02-02
<p[]一、先看一下弹框实现效果1.抖音实现效果</p> 2.我的实现效果 二、对话框跟随手势下拉实现 通过观察展示的成果截图,能够察觉到浮动
<p[]一、先看一下弹框实现效果1.抖音实现效果</p>

2.我的实现效果

二、对话框跟随手势下拉实现

通过观察展示的成果截图,能够察觉到浮动框会随手势朝下方向位移并达成同步位移,要达成此功能,必须测量出手势朝下移动的具体数值,接着将这个数值赋予浮动框,以此决定其向下收起的幅度。

即:弹窗向下移动的距离 = 手势向下移动的距离

1.手势向下移动距离的计算公式

手势下移的长度等于手势移动末点的Y值减去手势移动起点的Y值

在中提供了可以兼容多端的监听页面上元素的触摸方法:

1.手指开始触摸元素

.:.(: ):

2.手指触摸元素后移动。

.:.(: ):

3.手指结束触摸元素

.:.(: ):

  字段定义如下:

字段类型必填默认值说明

array

触摸事件,当前停留在屏幕中的触摸点信息的数组

array

触摸事件,当前变化的触摸点信息的数组

2.获取手势向下移动的距离

接下来会借助选项api来完成对应任务,这样做也是为了能够同时适配vue2和vue3的不同版本。

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="hljs language-js" lang="js"><template> <span class="xml"><span class="hljs-tag"><<span class="hljs-name">uni-popup</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"popup"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"bottom"</span>></span> <span class="hljs-tag"><<span class="hljs-name">view</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"content"</span>   @<span class="hljs-attr">touchstart</span>=<span class="hljs-string">"touchstart"</span>   @<span class="hljs-attr">touchmove</span>=<span class="hljs-string">"touchmove"</span> ></span> ... <span class="hljs-tag"></<span class="hljs-name">view</span>></span> <span class="hljs-tag"></<span class="hljs-name">uni-popup</span>></span></span> </template> <span class="xml"><span class="hljs-tag"><<span class="hljs-name">script</span>></span><span class="javascript">   <span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> { <span class="hljs-title function_">data</span>(<span class="hljs-params"></span>) { <span class="hljs-keyword">return</span> {   <span class="hljs-comment">// 手势向下移动距离</span>   <span class="hljs-attr">moveDistance</span>: <span class="hljs-number">0</span> } }, <span class="hljs-attr">methods</span>: { <span class="hljs-comment">// 开始触摸元素</span> <span class="hljs-title function_">touchstart</span>(<span class="hljs-params">e</span>) {   <span class="hljs-variable language_">this</span>.<span class="hljs-property">startY</span> = e.<span class="hljs-property">changedTouches</span>[<span class="hljs-number">0</span>].<span class="hljs-property">clientY</span>;   <span class="hljs-variable language_">this</span>.<span class="hljs-property">startIme</span> = <span class="hljs-title class_">Date</span>.<span class="hljs-title function_">now</span>()   <span class="hljs-variable language_">this</span>.<span class="hljs-property">toumoveTime</span> = <span class="hljs-title class_">Date</span>.<span class="hljs-title function_">now</span>() }, <span class="hljs-comment">// 触摸元素后移动</span> <span class="hljs-title function_">touchmove</span>(<span class="hljs-params">e</span>) {   <span class="hljs-keyword">const</span> clientY = e.<span class="hljs-property">changedTouches</span>[<span class="hljs-number">0</span>].<span class="hljs-property">clientY</span>;   <span class="hljs-comment">// 忽略上划</span>   <span class="hljs-keyword">if</span> (clientY < <span class="hljs-variable language_">this</span>.<span class="hljs-property">startY</span>) { <span class="hljs-keyword">return</span>   }   <span class="hljs-comment">// 下滑,计算手势移动距离</span>   <span class="hljs-variable language_">this</span>.<span class="hljs-property">moveDistance</span> = clientY - <span class="hljs-variable language_">this</span>.<span class="hljs-property">startY</span> }, }   } </span><span class="hljs-tag"></<span class="hljs-name">script</span>></span></span> </code></pre></p>

通过e..可获取当前屏幕触摸的Y坐标。

3.弹框向下隐藏同步手指向下触摸移动距离

利用css属性调整弹窗的向下偏移量,能够实现弹窗的隐藏功能。

: `(${this.}px)`

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="hljs language-js" lang="js"><script>   <span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> { <span class="hljs-title function_">data</span>(<span class="hljs-params"></span>) { <span class="hljs-keyword">return</span> {   <span class="hljs-comment">// 手势向下移动距离</span>   <span class="hljs-attr">moveDistance</span>: <span class="hljs-number">0</span> } }, <span class="hljs-attr">computed</span>: { <span class="hljs-title function_">contentStyle</span>(<span class="hljs-params"></span>) {   <span class="hljs-keyword">return</span> { <span class="hljs-attr">transform</span>: <span class="hljs-string">`translateY(<span class="hljs-subst">${<span class="hljs-variable language_">this</span>.moveDistance}</span>px)`</span>,   } } },   } </script> <span class="xml"><span class="hljs-tag"><<span class="hljs-name">template</span>></span> <span class="hljs-tag"><<span class="hljs-name">uni-popup</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"popup"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"bottom"</span>></span> <span class="hljs-tag"><<span class="hljs-name">view</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"content"</span>   <span class="hljs-attr">...</span> <span class="hljs-attr">:style</span>=<span class="hljs-string">"contentStyle"</span> ></span> ... <span class="hljs-tag"></<span class="hljs-name">view</span>></span> <span class="hljs-tag"></<span class="hljs-name">uni-popup</span>></span> <span class="hljs-tag"></<span class="hljs-name">template</span>></span></span> </code></pre></p>

三、关闭弹窗时机

弹窗的拖拽功能现已实现,接下来要设定其收起时机,在符合标准时执行this.$refs.popup.close()指令来关闭弹窗。经过反复验证,发现抖音的评论弹窗存在两种触发收起的状况,一是当界面底部达到特定距离,二是当用户迅速完成对元素的起始、移动及结束触碰这三个连续动作时,弹窗便会自动关闭。

关闭弹窗后,我们能够对元素附加处理,在触摸动作完成之际开展必要运算。

1.计算距离底部距离

距离底部距离 = 窗口高度 - 当前手指触摸结束的Y坐标

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="hljs language-js" lang="js"><span class="hljs-title function_">touchend</span>(<span class="hljs-params">e</span>) { <span class="hljs-comment">// 触摸结束Y坐标</span> <span class="hljs-keyword">const</span> clientY = e.<span class="hljs-property">changedTouches</span>[<span class="hljs-number">0</span>].<span class="hljs-property">clientY</span>; <span class="hljs-comment">// 获取窗口高度</span> <span class="hljs-keyword">const</span> { windowHeight } = uni.<span class="hljs-title function_">getSystemInfoSync</span>(); <span class="hljs-comment">// 距离底部距离</span> <span class="hljs-keyword">const</span>距离等于窗口高度减去当前指针位置 } </code></pre></p>

2.计算手势完成时间

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="hljs language-js" lang="js"><span class="hljs-title function_">touchstart</span>(<span class="hljs-params">e</span>) { <span class="hljs-variable language_">this</span>.<span class="hljs-property">startIme</span> = <span class="hljs-title class_">Date</span>.<span class="hljs-title function_">now</span>() }, <span class="hljs-title function_">touchend</span>(<span class="hljs-params">e</span>) { <span class="hljs-comment">// 手势完成时间(毫秒)</span> <span class="hljs-keyword">const</span> toumoveTime = <span class="hljs-title class_">Date</span>.<span class="hljs-title function_">now</span>() - <span class="hljs-variable language_">this</span>.<span class="hljs-property">startIme</span> }, </code></pre></p>

3.根据计算值,完成弹窗关闭逻辑

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="hljs language-js" lang="js"><span class="hljs-title function_">touchend</span>(<span class="hljs-params">e</span>) { <span class="hljs-comment">// 触摸结束Y坐标</span> <span class="hljs-keyword">const</span> clientY = e.<span class="hljs-property">changedTouches</span>[<span class="hljs-number">0</span>].<span class="hljs-property">clientY</span>; <span class="hljs-comment">// 获取窗口高度</span> <span class="hljs-keyword">const</span> { windowHeight } = uni.<span class="hljs-title function_">getSystemInfoSync</span>(); <span class="hljs-comment">// 距离底部距离</span>

<span class="hljs-keyword">const</span> distance = windowHeight - clientY <span class="hljs-comment">// 滑动时间(毫秒),小于某个时间则自动close</span> <span class="hljs-keyword">const</span> toumoveTime = <span class="hljs-title class_">Date</span>.<span class="hljs-title function_">now</span>() - <span class="hljs-variable language_">this</span>.<span class="hljs-property">startIme</span> <span class="hljs-comment">// 必须触发了touchmove方法</span> <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">this</span>.<span class="hljs-property">moveDistance</span> > <span class="hljs-number">0</span> && (distance < <span class="hljs-variable language_">this</span>.<span class="hljs-property">bottomCloseValue</span> || toumoveTime < <span class="hljs-variable language_">this</span>.<span class="hljs-property">moveCloseTime</span>)) { <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">close</span>(); } <span class="hljs-keyword">else</span> { <span class="hljs-variable language_">this</span>.<span class="hljs-property">moveDistance</span> = <span class="hljs-number">0</span>; } }, </code></pre></p>

当触摸动作停止后,如果符合预设的间距标准,并且达到规定的完成时限,那么就会撤销那个弹出界面;否则,就会把弹窗恢复原状。

四、打开全屏

全屏模式的核心在于确定可用的显示区域,同时将弹出窗口的尺寸调整为该区域的高度。

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="hljs language-js" lang="js"><span class="hljs-title function_">toggleFullScreen</span>(<span class="hljs-params"></span>) { <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">this</span>.<span class="hljs-property">isFullScrren</span>) { <span class="hljs-comment">// 关闭全屏,高度设为内容高度</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">height</span> = <span class="hljs-variable language_">this</span>.<span class="hljs-property">contentHeight</span> } <span class="hljs-keyword">else</span> { <span class="hljs-comment">// 开启全屏,设为视口高度</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">height</span> = <span class="hljs-variable language_">this</span>.<span class="hljs-property">windowHeight</span> } <span class="hljs-variable language_">this</span>.<span class="hljs-property">isFullScrren</span> = !<span class="hljs-variable language_">this</span>.<span class="hljs-property">isFullScrren</span> }, </code></pre></p>

同时兼容ios微信小程序和App端顶部和底部安全区域适配

适配手机顶部和底部安全区域

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="hljs language-js" lang="js"><span class="hljs-keyword">const</span> { safeArea, windowHeight, screenHeight, osName } = uni.<span class="hljs-title function_">getSystemInfoSync</span>(); <span class="hljs-comment">调整布局以适应顶部和底部预留空间, safeArea.height指定安全区域的高度, 以逻辑像素计</span> <span class="hljs-keyword">const</span>安全视口高度等于视口高度减去屏幕高度与安全区域之差<span class="hljs-property">bottom</span>) <span class="hljs-comment">// 打开全屏的高度</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">windowHeight</span> = safeWindowHeight </code></pre></p>

适配手机app端顶部和底部安全区域

<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="hljs language-js" lang="js"><span class="hljs-comment">// #ifdef APP-PLUS</span> <span class="hljs-keyword">const</span> { windowHeight, osName } = uni.<span class="hljs-title function_">getSystemInfoSync</span>(); <span class="hljs-keyword">if</span> (osName === <span class="hljs-string">'ios'</span>) { <span class="hljs-comment">// ios没设备</span> } <span class="hljs-keyword">else</span> { <span class="hljs-comment">// android</span> 打开全屏的高度 <span class="hljs-variable language_">this</span>.<span class="hljs-property">windowHeight</span> = windowHeight } </code></pre></p>

五、总结

以上实现主要有三部分内容:

1.弹窗跟随手势向下移动。

2.手势距离底部一定距离或者手势移动足够快关闭弹窗。

运用uni.()方法取得设备相关数据,依据这些数据计算弹出层所需的全屏垂直尺寸,确保能适配多种设备规格。

去体验插件:插件市场


# 滁州百度网站关键词排名  # seo优化百科  # 贵港网站搜索优化哪家好  # 广告网站建设开发外包  # 黄南网站建设和制作  # 宝安区网站营销推广招聘  # 周口网站优化企业  # 眉山百度知识营销推广公司  # 海曙区网站建设服务  # 国际网站怎么做推广  # 清吧露营推广营销  # 时将  # 休闲*的营销推广  # 我想找个网站优化师  # 唐山抖音seo价格  # seo营销询问27火星  # 钢管行业短视频营销推广  # 昆山网站建设加盟电话  # 企业营销推广难点  # 郑州网站建设平台  # 一般如何进行网站优化  # 便会  # 全屏  # 设为  # 弹出  # 朝下  # 就会  # 一是  # 两种  # 所需  # 这样做  # 弹框实现效果及对话框跟随手势下拉的实现方法解析  # 会把  # 停留在  # 在中  # 这三个  # 来完成  # 对话框  # 先看  # 察觉到  # 必填 


相关文章: WordPress可以通过表格上传产品吗?轻松提升电商效率!  四年级上册数学期末测试卷_典型题怎么找?含完整答案的试卷哪里能免费下载?  四年级上册数学知识点归纳总结_四年级数学上册必考知识点有哪些?重点难点如何突破?  高中英语学科网官网登录入口下载究竟如何一步到位搞定?  免费学习网怎么选?2026年新手必看避坑指南+高性价比平台推荐  四年级小学数学期末考试卷答案_2025年下册人教版最新真题解析附下载  9月16日抖音举办不实信息治理开放日,谣言曝光量降67%   SEO是什么水果刮油,seo是什么技术 ,ai去出血线  优化排名超级蜘蛛-让你的SEO走在时代前沿  Brother打印机启动项可禁止,过多自启影响电脑性能与网速   免费SEO网站排名优化软件哪个好?轻松提升网站排名的选择指南  执行风声紧就注销微信实名账户?能躲过法院冻结吗?   seo线索收集是什么,seo线索收集是什么意思 ,ai软件怎么插入字体  SEO软件营销:如何通过智能工具提升网站排名与转化率  日常生活中微信成重要沟通工具,如何把录音发送到微信?   百度下拉框:关键词联想服务,助力企业推广提升知名度?   seo是什么物质,seo到底是什么 ,军棋ai对手  SEO是什么防晒口罩,seo是什么防晒口罩品牌 ,ai flash  seo要公司什么资源,做seo需要用到什么软件 ,m1超级ai语音音箱  途阔分析短视频SEO趋势,抖音搜索超4亿次,优化要懂啥?   种草的关键你知道吗?品牌种草要重视,搜索才是开始   不需要登录的AI文字助手,轻松提升工作效率与创作灵感!  四年级数学期末考试卷及答案怎么找?这套人教版的易错题解析与提分技巧请收好!  高中英语选择性必修一电子课本外研社哪里能下载?外研社版必修一单词表怎么高效记忆?  初中必背3500个单词txt下载,初中英语15天背完3500词是否真的可行?  seo描述信息写什么,seo店铺描述 ,ai渐变色板下载  高中学科网官网登录入口在哪里?教师3分钟快速登录与资源获取指南  推广客服必看!百度搜索推广效果转化漏斗的五个量解析   seo权重指的是什么,seo权重如何提升 ,ai后台  什么软件能根据摘要分类总结下载的所有文献的主要研究内容?  主流seo是什么,seo是什么推广网站 ,摄像ai性能  seo能解决什么问题,seo会遇到哪些问题 ,王者荣耀ai觉悟第四关  SEO排名优化怎么样?助力企业在线竞争力提升的必由之路  下载ChatGPT桌面版后无法启动网络?解决办法!  人教版四年级数学上册期末试卷哪里找?这份超详下载指南与复习攻略请收好  SEO用什么软件?高效SEO优化的必备工具!  初中英语知识点总结大全(非常全面):哪位学霸能分享一份靠谱的语法难点突破指南?  seo最主要的是什么,seo主要包括 ,ai照腰部  seo是什么职能做到的,seo是做什么工作内容 ,ai生成真实图  免费的爆文库,让你的创作轻松爆发!  在线答题小程序概述,你知道微信在线答题游戏吗?   飞利浦维修网点查询指南,官方网站与移动应用轻松搞定   seo进阶买什么书推广,seo的推广技巧 ,智能AI炒股公司  seo是什么意思 新闻,专业术语中seo的意思是什么 ,ai换窗帘  电驴区域限制如何解决?服务器节点不可用时的应对策略  专业关键词排名优化:提升网站曝光度与流量的关键  seo用什么写属性写,seo属于什么 ,寻找最强ai  seo进阶买什么书运营,seo入门难吗 ,ai工具和ai的区别  毒贩竟将毒品假称肉在网络贩卖,江苏警方破获大案   seo需要学会什么编程,seo要会些什么 ,ai如何弯曲 


相关栏目: 【 网络营销44070 】 【 网络推广122852 】 【 网络优化116010 】 【 网址导航102054 】 【 网络技术82194 】 【 网络资讯43554