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火星
# 钢管行业短视频营销推广
# 昆山网站建设加盟电话
# 企业营销推广难点
# 郑州网站建设平台
# 一般如何进行网站优化
# 便会
# 全屏
# 设为
# 弹出
# 朝下
# 就会
# 一是
# 两种
# 所需
# 这样做
# 弹框实现效果及对话框跟随手势下拉的实现方法解析
# 会把
# 停留在
# 在中
# 这三个
# 来完成
# 对话框
# 先看
# 察觉到
# 必填
相关文章:
使用ChatGPT4.0网页版,体验全新AI对话时代
为什么要监控SEO效果,国家为什么要监控个人 ,ai辅助学习考核
seo是什么官职,seo是什么工作内容 ,写作猫ai智能写作
seo需要学会什么编程,seo要会些什么 ,ai如何弯曲
seo需要了解什么,seo需要学些什么内容 ,ai软件电脑免费下载
seo给你什么帮助,seo的利与弊 ,战机特效ai
SEO网络和优化:让你的网站脱颖而出的秘诀
什么是seo快排,seo快排方案 ,国内ai认证
什么AI是可以上传文件的?AI工具的无限潜能!
微信上线后悔药功能,误删聊天记录有救啦!网友纷纷点赞
iPhone11 pro max微信分身版下载安装教程,立即下载
微信朋友圈九宫格拼图教程来啦!爱心九宫格图片超好看
深圳安居房申请条件全解析,这些要点你必须知道
seo权重指的是什么,seo权重如何提升 ,ai后台
微信群里骂人群主担责?广州互联网法院两宗判决揭示答案
seo是什么东西啊,seo什么意思简单来说 ,长沙ai动画
SEO有哪些推广方式?助力网站排名提升的有效策略
数字化支付时代,如何关闭微信指纹支付?看这里
seo监控什么意思,seo数据监控 ,ai3066
SEO量:如何通过精准的SEO策略提升网站流量与排名
小学一年级免费试卷哪里可以安全下载并高效使用?
小学生教育作业有哪些_如何设计分层趣味作业提升学习效果
人教版小学四年级数学应用题库中,为什么有超过70%的失分都集中在归一与归总问题?
亚马逊的seo是什么阿,亚马逊seo项目 ,能写作文的软件ai
JavaScript 解决方案:点击页面 body 区域关闭下拉菜单的实现
秋风送爽新学期开启,网警进校园带来网络安全课啦
免费SEO编辑器:让你的内容轻松排名,流量爆增!
抖音播放电影版权问题怎么解决?|直播|电影这些要点要注意
地主来了2019微信赢红包版,经典玩法与炫酷特效等你来
手机丢后微信钱包被刷走两万?几步操作就能锁死钱包
什么是seo如何进行seo,何谓seo ,微软ai写作
SEO软件应用介绍:提升网站排名的智能利器
seo资源是什么意思,seo资源怎么打开 ,ai程序勋章
九年级上册英语笔记整理到底怎么做才能快速抓住重点?有没有单元短语汇总可以直接用?
交友群都有哪些,交友群是干什么的 ,ai破洞效果
四年级小学数学期末考试卷答案_2025年下册人教版最新真题解析附下载
高中英语选择性必修一电子课本外研社哪里能下载?外研社版必修一单词表怎么高效记忆?
SEO工装裤-打造时尚与实用兼备的工作利器
高一英语课程教学视频免费人教版_新人教版高中英语课文听读注解?哪里找免费带翻译的资源
为什么ChatGPT无法加载?提示“检查您的网络设置并尝试重启ChatGPT”解决方案
为什么做seo矩阵项目,为什么做seo矩阵项目不能做 ,ai.anqi513
逆战未来武器插件获取与使用指南:如何用50个量子振芯合成心愿插件,轻松提升战力?
WordPress可以导入*信息插件:让你轻松打造*资源网站
专业的SEO:提升网站排名的终极指南
1600词汇表(可打印)如何高效利用?带音标版本真的能提升30%记忆效率吗
seo文本链接工具是什么,seo 链接 ,ai训练ai创业
3月8日中国版国际旅行健康证明微信小程序正式上线!你了解吗?
为什么要seo排名,为什么要做seo推广 ,ai 金融领域
seo追词是什么,seo词条 ,保定ai智能写作助手
什么是独立关键词?全方位解析,让你在SEO优化中脱颖而出!
相关栏目:
【
网络营销44070 】
【
网络推广122852 】
【
网络优化116010 】
【
网址导航102054 】
【
网络技术82194 】
【
网络资讯43554 】