弹框实现效果及对话框跟随手势下拉的实现方法解析 天门市营销推广哪个好
发布时间 - 2026-02-02 07:45:25 点击率:次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
# 上海关键词排名技巧分析
# 武义品牌推广营销招聘
# 公众号用网站链接优化
# 海外营销推广有什么方法
# 长安网站建设找哪家
# 广元seo优化型号
# 江苏seo网络推广方法
# 怎样线上营销推广赚钱呢
# 延吉团购推广网站有哪些
# discuz好做seo
# 网页配*站建设
# 建设网站推广费用
# 视频如何优化网站
# 虹口营销推广公司招聘信息
# 如何做seo推广帖子
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
SEO汇报:如何通过数据分析提升网站排名,助力企业业绩增长,免费推广网站大全百度经验
台州SEO行者SEO06,详细介绍SEO优化步骤,助力企业网站脱颖而出,绥化关键词排名怎么提高
福建百度推广非企开户有风险吗?,广州网站推广策略
广州百度推广外包助力企业营销大爆发,闵行区网站建设制作
手机相册爆满删又难恢复慢?简单万无一失备份方法快来看
广州百度推广服务费解析及优化建议,健康养生营销推广
SEO北京:数字时代,企业成功的关键,湖南网站建设湖南岚鸿
惠州SEO广告推广费用介绍,合理布局,精准营销,京东商城seo营销策略
SEO埋词技巧,如何提升网站排名?,贵州营销推广方法
福建百度推广的费用如何取出来?,丹东网站建设与维护推广
探索未知,我的SEO毕业报告之旅,北京服装营销策划推广
杨圣亮谈SEO,详细介绍搜索引擎优化步骤与方法,seo优化推广代理商
微粒贷放款快又便利,曾白名单邀请,现竟有内部开通渠道?
北京抖搜SEO,掌握这5大技巧,让你的内容秒变爆款!,界首网站建设及优化
SEO好吗?助力网站成功的关键之道,网站优化方案范文怎么写
广州SEO软件首选乐云SEO,专业赋能,助力企业高效招商,香港seo推广优化公司
分享免费下载无损音乐网站,车载CD刻录歌曲不愁啦
介绍燕郊SEO服务公司,助力企业腾飞的秘密武器,网站的优化策略怎么写
详细介绍谷歌SEO推荐的应用,掌握优化之路,提升App排名,口碑好的扬州seo
SEO免费培训,掌握搜索引擎优化,助力网站排名提升,SEO维护专员
广州百度推广费用记账,优化成本管理的关键策略,优酷土豆网站推广
做页面常遇下拉列表样式问题?看JQuery自定义插件解决
SEO技术如何通过优化提升网站流量与排名,四平网站优化公司
淘宝SEO优化攻略,关键词布局与提升店铺排名的方法,长沙开福区seo运营
广州百度推广模式解析,助力企业数字营销新突破,江干全网营销推广招聘网
郑州SEO矩阵公司,助力企业腾飞的关键策略,承德网站建设广告词优化
河南雷霆扫毒!去年抓获2368名毒品犯罪嫌疑人,形势如何?
SEO小白必看!从零起步SEO的秘诀,轻松提升网站排名,南京网站运营优化平台
SEO站群:打造强大网络营销引擎,助力企业快速提升排名与流量,seo网站排名案例
SEO全套秘籍:提升网站流量与排名的终极指南,荣昌手机网站建设
揭秘邯郸SEO排名优化背后的真相,费用、效果与策略,推广套餐营销策略分析怎么写
SEO查:如何用精准的SEO诊断助力网站流量爆发,美团关键词排名怎么补
广州百度推广一户多开,探索营销新模式的可能性,綦江高端网站建设
广州百度推广学校,助力企业迈向数字化未来,邮件怎么推广携程网站
揭秘成功的自媒体营销秘籍,如何让你的品牌在浩瀚的内容海洋中脱颖而出?,网站设计建设报告范文
广州百度推广封号多久?解析原因及解决方案,丹东营销推广服务
律师SEO推广,投资与回报的完美平衡,seo是姓还是名
探索山西SEO优化公司的奥秘,枣庄化工网站建设招标
郑州SEO排名探秘,如何找到优质创作源泉?,辽宁seo服务软件排名
新余运营SEO,投资回报比高的互联网营销步骤,金华做网站seo优化多少钱
SEO网络推广霸屏,介绍互联网时代下的品牌崛起之路,seo写法大全
关键词挖掘在项目SEO中的应用与步骤,多页面seo
福建百度推广点击率高却无人加好友,问题出在哪?,网站推广语句
西藏特色产品SEO优化步骤,挖掘潜力,助力品牌腾飞,电商网站页面优化怎么做
青海SEO营销排名前十,探索数字时代的营销奥秘,南京正规网站推广服务商
广州百度推广联盟,助力企业营销新突破,安徽建筑网站建设需要
南阳抖音SEO优化,如何让你的品牌在抖音上脱颖而出?,灯会营销推广
如何在广州实现免费的百度推广方案,行业网站建设十大品牌
沙坪坝SEO搜索优化,助力企业抢占网络市场先机,seo发展如何
广西广电(600936):为全资子公司广电网络科技公司提供70亿担保进展

