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

发布时间 - 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骨灰级  SEO留痕:数字营销的隐性力量,如何通过SEO优化让品牌更具竞争力,铁岭网站关键词建设优化  自媒体营销新纪元,如何利用社交媒体打造个人品牌?,青岛抖音seo商家  SEO网:让你的数字营销更加精准高效,开启网络引流新时代,丰县互联网网站推广优势  SEO抓取:让您的网站从零到一的秘诀,佛山网站建设哪家效果好  防火墙的要求、功能、附加功能及局限性你了解多少?   广州百度推广侵权事件分析,深圳建设网站目的  广州百度推广职责,深入解析与实施策略,南沙服装口碑营销推广  揭秘SEO315晚会的背后,如何巧妙规避风险?,华为网站seo关键词  南昌SEO管理,打造你的在线品牌,让流量倍增,汕头企业网站优化  武汉SEO排名探秘,如何让你的网站在竞争激烈的市场中脱颖而出?,江苏关键词排名怎么提高  SEO精通:让你的内容在搜索引擎中脱颖而出,跨境电商 推广营销  揭秘自媒体营销的黄金法则,如何快速提升内容曝光度,珠宝网站网站建设模板  打造个性化家居空间_SEO书架装饰画的魅力与选择指南,常德谷歌seo哪家好  揭秘黑客SEO优化联盟,如何让你的网站在搜索引擎中脱颖而出?,二级网站内容建设要求  SEO获取流量的必杀技:如何通过优化轻松提升网站排名,德州全网营销推广价格  广州百度推广过审的关键步骤与策略,网站建设渠道合作  9月11日叶县党员姜晓康谈吊瓜增产,党员教育课堂成效显著   介绍英文SEO工作,优化步骤、职业前景与挑战,谷歌seo优质文章推广  锡山SEO推广,如何让你的品牌在数字海洋中脱颖而出?,东营机场建设招标网站  江门全网营销SEO外包,助力企业腾飞的新引擎,韶关网站优化案例  SEO做好,企业网站流量翻倍的关键,seo白帽技术有哪些  自媒体营销新纪元,如何在这个变革的时代抓住机遇?,温州最牛叉的seo  SEO占位:如何在竞争激烈的市场中占得先机?,梁平区省心全网营销推广  云浮SEO优化厂家,提升网站排名的关键策略,盐城网站建设银行工作  手机丢后微信钱包被刷走两万?几步操作就能锁死钱包   重庆SEO推广收费模式介绍,介绍优化成本与效果的秘密,仓山区网页seo介绍  SEO确实是企业增长的关键,这些技巧让你走在行业前沿,山东网站建设信息  广州百度推广产品分析与选择指南,山西网站建设论文app  辽源SEO必看,如何让你的网站在搜索引擎中脱颖而出,滨州seo企业营销方案  广州百度推广服务商,助力企业打开网络营销新局面,千川视频推广如何优化营销  SEO站内优化:提升网站排名的核心策略,厦门市网站优化企业  河北SEO推广外包公司,助力企业高效提升网络知名度,奇台seo培训  数字化支付普及下,如何取消微信指纹支付?看这里   介绍快速SEO优化外包,提升网站排名,抢占市场先机,seo排名公司 吉林  折叠页面,SEO优化中的新趋势与步骤,安徽seo推广效果如何  福建百度推广的开户流程是怎样的,贵州网站建设怎么申请  三明市SEO软件,提升品牌影响力的秘密武器,电商seo是什么课程  28火星,介绍神秘星球背后的科学奥秘与探索历程,罗源公司seo优化  SEO利用:让你的网站快速登顶,获取更多流量与客户!,延边小程序推广平台网站  深入探讨福建百度推广用户多次点击的应对策略,岳阳平原网站建设  广州百度推广费用解析,了解推广开销,精准营销从此开始,创意营销推广方案策划ppt  SEO账户运营经验分享,关键词布局与步骤优化,普宁网站优化seo  SEO有点:揭秘优化之道,提升网站排名的秘诀,广州抖音seo厂家地址  一个手机号仅能注册一个微信号,如何解绑重注册?   数字时代音乐资源超丰富!20个实用音乐搜索器和下载平台汇总   汕头市SEO网络推广价格介绍,投资与回报的完美平衡,昌吉网站建设优化公司  SEO优化转化率提升步骤,打造高效营销利器,福建标准网站优化大全  福建百度推广一天150元能用多久?有效投放策略解析,浙江营销推广选择  探索未知,如何高效利用自媒体打造个人品牌,天企如何推广网站