【小程序】如何实现从底部弹出对话框

这篇具有很好参考价值的文章主要介绍了【小程序】如何实现从底部弹出对话框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前面两篇两篇文章介绍了如何在小程序中实现上下滑动效果以及如何用 Canvas 绘制一张图片,这一篇作为前两篇的延续,介绍如何从底部弹出一个对话框

相比而言,底部弹出对话框的功能比较通用,因此非常适合定义成组件(component)。

先来看一下最终实现效果:

小程序底部弹出框,小程序,小程序

首先是布局文件:

<view wx:if='{{visible}}'>
  <view class='wrap {{wrapAnimate}}' style='background:rgba(0,0,0,{{bgOpacity}});'></view>
  <view catchtap='hideFrame' class='frame-wrapper {{frameAnimate}}'>
    <view catchtap='catchNone' class='frame'>
      <view class="share-btn-wrapper">
        <button class="share-btn" open-type='share'>分享给好友</button>
        <button class="share-btn" bindtap="onShareToMoments">分享到朋友圈</button>
      </view>
    </view>
  </view>
</view>

这段代码是一个包含条件渲染、点击事件和图像的小程序视图结构。根据不同的条件和用户的交互,将显示不同的视图元素,并触发相应的事件处理函数。

我们来逐行分析下关键代码:

  • <view wx:if='{{visible}}'>:这是一个条件渲染的语法,只有当 visible 变量为真时,才会渲染下面的内容。
  • <view class='wrap {{wrapAnimate}}' style='background:rgba(0,0,0,{{bgOpacity}});'></view>:这是一个空的视图元素,应用了名为 wrap 的类和 wrapAnimate 变量作为类名。还设置了背景颜色为 rgba(0,0,0,{{bgOpacity}})。bgOpacity 变量用于控制背景透明度。
  • <view catchtap='hideFrame' class='frame-wrapper {{frameAnimate}}'>:这是一个视图元素,应用了名为 frame-wrapper 的类和 frameAnimate 变量作为类名。还定义了一个点击事件 catchtap,当被点击时会触发名为 hideFrame 的事件处理函数。
  • <view catchtap='catchNone' class='frame'>:这是一个视图元素,应用了名为 frame 的类。同样,定义了一个点击事件 catchtap,当被点击时会触发名为 catchNone 的事件处理函数。

其中第一个子元素的CSS 类 .wrap 将创建一个占据整个屏幕的固定定位的元素,它的层叠顺序为 1,位置固定在窗口的左上角,并且宽度和高度均占满整个窗口。 用于创建遮罩层或全屏背景等效果。

.wrap {
  position: fixed;
  z-index: 1;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}

变量 wrapAnimate 有两个取值,分别是 .wrapAnimate.wrapAnimateOut,一个控制淡入动画,一个控制淡出动画。

.wrapAnimate 的代码如下:

.wrapAnimate {
  animation: wrapAnimate 0.5s ease-in-out forwards
}

@keyframes wrapAnimate {
  0% {}

  100% {
    background: rgba(0, 0, 0, 0.35);
  }
}

该动画将在 0.5 秒内逐渐将元素的背景颜色变为半透明的黑色。动画结束后,元素将保持最后一个关键帧的状态。

  • animation: wrapAnimate 0.5s ease-in-out forwards;:通过 animation 属性指定了动画的名称、持续时间、动画速度和结束后的状态。

    • wrapAnimate 是动画的名称,表示要应用的关键帧动画。
    • 0.5s 是动画的持续时间,表示动画从开始到结束所需的时间,这里是 0.5 秒。
    • ease-in-out 是动画的速度曲线,表示动画在开始和结束时会缓慢变化,而在中间阶段会加速变化。
    • forwards 表示动画结束后元素将保持最后一个关键帧的状态。
  • @keyframes wrapAnimate { ... }:定义了名为 wrapAnimate 的关键帧动画。

    • 0% {}:表示动画的起始关键帧,这里为空,表示没有任何样式。
    • 100% { background: rgba(0, 0, 0, 0.35); }:表示动画的结束关键帧,在动画完成时,背景颜色将变为 RGBA 值为 rgba(0, 0, 0, 0.35),即半透明的黑色背景。

.wrapAnimateOut 的代码如下:

.wrapAnimateOut {
  animation: wrapAnimateOut 0.2s ease-in-out forwards
}

@keyframes wrapAnimateOut {
  0% {
    background: rgba(0, 0, 0, 0.35);
  }

  100% {
    background: rgba(0, 0, 0, 0);
  }
}

该动画将在 0.2 秒内逐渐将元素的背景颜色从半透明的黑色变为完全透明,使元素逐渐消失。动画结束后,元素将保持最后一个关键帧的状态。

  • .wrapAnimateOut 是一个类名,表示要应用的动画效果。

  • animation: wrapAnimateOut 0.2s ease-in-out forwards;:通过 animation 属性指定了动画的名称、持续时间、动画速度和结束后的状态。

    • wrapAnimateOut 是动画的名称,表示要应用的关键帧动画。
    • 0.2s 是动画的持续时间,表示动画从开始到结束所需的时间,这里是 0.2 秒。
    • ease-in-out 是动画的速度曲线,表示动画在开始和结束时会缓慢变化,而在中间阶段会加速变化。
    • forwards 表示动画结束后元素将保持最后一个关键帧的状态。
  • @keyframes wrapAnimateOut { ... }:定义了名为 wrapAnimateOut 的关键帧动画。

    • 0% { background: rgba(0, 0, 0, 0.35); }:表示动画的起始关键帧,在动画开始时,背景颜色为半透明的黑色。
    • 100% { background: rgba(0, 0, 0, 0); }:表示动画的结束关键帧,在动画完成时,背景颜色将完全透明,即不可见。

第二个子元素 <view> 通过 CSS 类 .frame-wrapper 和变量 {{frameAnimate}} 来控制动画效果。

其中 .frame-wrapper 的定义如下:

.frame-wrapper {
  position: fixed;
  height: 100vh;
  width: 100vw;
  z-index: 2;
  top: 50vh;
}

这段代码用于创建一个具有固定定位的元素,该元素的高度和宽度均占满整个视口,垂直居中定位,并位于其他具有较低 z-index 值的元素之上。

  • position: fixed;:设置元素的定位方式为固定定位,这意味着元素将相对于视口固定位置,不会随滚动而移动。
  • height: 100vh;:设置元素的高度为视口的高度,即占满整个可视区域的高度。
  • width: 100vw;:设置元素的宽度为视口的宽度,即占满整个可视区域的宽度。
  • z-index: 2;:设置元素的堆叠顺序,即元素在重叠时的层级顺序。具有较高 z-index 值的元素将显示在具有较低 z-index 值的元素之上。
  • top: 50vh;:将元素的顶部边缘与视口垂直中心对齐,即垂直居中定位。

变量 frameAnimte 的取值也是两个:frameAnimateframeAnimateOut,分别用于控制淡入和淡出动画:

.frameAnimate {
  animation: frameAnimate 0.5s ease forwards;
}

@keyframes frameAnimate {
  0% {}

  100% {
    opacity: 1;
    top: 0vh;
  }
}

.frameAnimateOut {
  animation: frameAnimateOut 0.2s ease forwards;
}

@keyframes frameAnimateOut {
  0% {
    opacity: 1;
    top: 0vh;
  }

  100% {
    opacity: 0;
    top: 100vh;
  }
}

以上代码定义了两个动画:

  • .frameAnimate 动画将元素的不透明度设为 1,并使其从顶部进入视口,
  • .frameAnimateOut 动画将元素的不透明度设为 0,并使其从当前位置向视口底部移出。
.frame {
  background: #fff;
  position: absolute;
  bottom: 0;
  width: 88.2vw;
  padding: 5.9vw 5.9vw 0;
  border-top-left-radius: 20rpx;
  border-top-right-radius: 20rpx;
  z-index: 3;
}

.frame 定义了一个底部弹出框或浮动窗口的样式,具有白色背景、圆角边框和一定的宽度。该元素的位置会相对于其最近的定位父元素进行定位,并且位于其他元素的上方,z-index 值为 3。

小程序底部弹出框,小程序,小程序

其代码含义如下:

  • background: #fff;:指定了元素的背景颜色为白色(#fff)。
  • position: absolute;:将元素的定位方式设置为绝对定位,相对于其最近的非静态定位父元素定位。
  • bottom: 0;:将元素的底部边缘与父元素的底部边缘对齐。
  • width: 88.2vw;:将元素的宽度设置为视口宽度的 88.2%。
  • padding: 5.9vw 5.9vw 0;:设置元素的内边距,上方为视口宽度的 5.9%,左右方向为视口宽度的 5.9%,下方为 0。
  • border-top-left-radius: 20rpx;:设置元素的左上角边框半径为 20 像素。
  • border-top-right-radius: 20rpx;:设置元素的右上角边框半径为 20 像素。
  • z-index: 3;:指定元素的堆叠顺序,具有更高的 z-index 值的元素将覆盖具有较低 z-index 值的元素。

通过以上代码可以看出,决定动画框架的一共有三个 <view>,其所对应的 css 分别是:

  • wrap
  • frame-wrapper
    • frame

它们三者的布局关系,可以用一张图来表示:

小程序底部弹出框,小程序,小程序

布局和展示关系定义好之后,最后我们来看下对应的 js 代码:

  • 展示

    showFrame() {
        this.setData({ 
            visible: true, 
            wrapAnimate: 'wrapAnimate', 
            frameAnimate: 'frameAnimate' 
        });
    }
    
  • 隐藏

    hideFrame(e) {
        let that = this
        this.setData({ wrapAnimate: 'wrapAnimateOut', frameAnimate: 'frameAnimateOut' });
        setTimeout(() => {
            that.setData({ visible: false })
        }, 200);
    }
    

用法很简单:

<share-dialog id="bottomFrame" bindsharetomoments="onShareToMoments"></share-dialog>

其中 bindsharetomoments 的代码定义在组件的 js 文件中:

onShareToMoments(e) {
    this.hideFrame()
    this.triggerEvent('sharetomoments')
}

以上就是如何实现从底部弹出对话框的全部代码,完整代码请移步 self-discipline-toolbox-weapp。文章来源地址https://www.toymoban.com/news/detail-728829.html

到了这里,关于【小程序】如何实现从底部弹出对话框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HarmonyOS自定义弹出对话框CustomDialog并传递变量

    HarmonyOS定义了一系列弹窗反馈类的组件​ 和前端开发框架VUE3配套生态库element plus中的提供各种组件相比,还是要少一些。可能是手机端操作和PC端操作的差异导致的​ 如果内置的弹窗不满足要求,可以基于CustomDialog自定义出各种个性化的反馈组件。 首先新建一个ets文件,使

    2024年01月25日
    浏览(34)
  • 完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示R登录成功“,提供一个Ok按钮,用户点击OK后,关闭登录界面,跳转到其他界面,

    如果账号和密码不匹配,弹出错误对话框,给出信息\\\"账号和密码不匹配,是否重新登录\\\",并提供两个按钮Yes|No,用户点击Yes后,清除密码框中的内容,继续让用户进行登录,如果用户点击No按钮,则直接关闭登录界面如果用户点击取消按钮,则弹出一个问题对话框,给出信息

    2024年04月10日
    浏览(61)
  • Python 图形化界面基础篇:使用弹出窗口和对话框

    在开发图形用户界面( GUI )应用程序时,与用户进行交互的一种常见方式是通过弹出窗口和对话框。这些弹出窗口允许用户输入数据、进行选择、查看信息等。 Python 的 Tkinter 库和一些第三方库提供了创建和管理弹出窗口和对话框的方法。在本篇博客中,我们将深入探讨如何

    2024年02月03日
    浏览(88)
  • Window10下解决弹出兼容性助手对话框的方法

    注: Win7或其他版本可以参考这个,Win10下亲测可用。 Window10下安装运行一些旧版的软件后,经常在运行或退出时弹出程序兼容性助手对话框: 解决方法如下: 1、关闭Windows服务下的程序兼容性服务,设置为禁用; 2、在策略中设置“关闭程序兼容性助理”为启用; 上面2个方

    2024年02月06日
    浏览(39)
  • 小程序对话框的实现方式

    在微信小程序中,有以下几种方式可以实现对话框(Dialog)的展示: 1. wx.showModal :wx.showModal 是微信小程序提供的一个API,用于显示模态对话框。模态对话框是一种阻塞式的对话框,需要用户进行交互后才能关闭。可以通过调用 wx.showModal 方法来显示对话框,并设置标题、内

    2024年02月12日
    浏览(74)
  • android 12.0长按Power弹出关机对话框去掉屏幕截图和紧急呼救功能

    在12.0的系统长按关机键,会弹出关机的对话框,关机对话框里面由关机重启截图和紧急呼叫等功能,而由于开发功能需求要求去掉屏幕截图和紧急呼叫等功能,所以就要先找到关机对框的代码 然后实现功能 功能分析: 长按电源键弹出关机对话框,通过adb shell命令发现 就是

    2024年02月06日
    浏览(77)
  • 小程序对话框的几种实现方式

    在微信小程序中,有以下几种方式可以实现对话框(Dialog)的展示: 1. wx.showModal :wx.showModal 是微信小程序提供的一个API,用于显示模态对话框。模态对话框是一种阻塞式的对话框,需要用户进行交互后才能关闭。可以通过调用 wx.showModal 方法来显示对话框,并设置标题、内

    2024年02月10日
    浏览(41)
  • Android 13.0 framework中实现默认长按电源键弹出关机对话框功能

    在13.0的系统定制化开发中,在12.0的系统之前默认的都是长按电源键弹出关机对话框,而在13以后 就改成音量+电源键弹出对话框,由于使用不方便,所以就改成默认长按弹出关机对话框功能 PhoneWindowManager是供系统进程使用,是WindowManagerService 的一部分,WindowManagerService 会利用

    2024年02月11日
    浏览(63)
  • Bootstrap之JavaScript的模态框(modal)使用-不离开父窗体的情况下的互动-点击按钮弹出对话框

    Bootstrap的JavaScript的模态框(modal)是覆盖在父窗体上的子窗体。通常,目的是显示一个单独的内容,可以在不离开父窗体的情况下有一些互动。 子窗体可以自定义内容,可提供信息展示、交互等功能。 运行效果如下: 一个完整的模态框包括三个部分:头部、正文和页脚,分别

    2024年02月04日
    浏览(62)
  • Android如何自定义输入文本对话框?

      笔者研究的课题涉及到安卓软件开发,在开发过程中,发现普通的显示消息对话框一般可以调用android自带包实现,而要通过文本框输入交互,则无法轻易实现。在查阅网络资料后,实现了自定义输入文本对话框的功能,本文记录实现自定义输入文本对话框的过程。   

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包