弹框实现效果及对话框跟随手势下拉的实现方法解析 天门市营销推广哪个好

发布时间 - 2026-02-02 07:45:25    点击率:
<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  # 上海关键词排名技巧分析  # 武义品牌推广营销招聘  # 公众号用网站链接优化  # 海外营销推广有什么方法  # 长安网站建设找哪家  # 广元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亿担保进展