|
|
- <template>
- <!-- 如何让他点击遮罩层的时候关闭弹窗 -->
- <view v-if="visible" class="popup-overlay" @click="close">
- <view class="popup-content" @click.stop :animation="animationData">
- <image class="popup-bg" :src="bgImage" mode="aspectFit"></image>
- <image class="popup-title" :src="titleImage" mode="aspectFit"></image>
- <!-- <view class="popup-header"> -->
- <text class="popup-text">{{ content }}</text>
- <text class="popup-subtext">{{ subContent }}</text>
- <!-- </view> -->
- <button v-if="popupType === 'success'" class="popup-btn success" @click="close">我知道了</button>
- <button v-else class="popup-btn fail" @click="close">好的</button>
- </view>
- </view>
- </template>
-
- <script>
- export default {
- name: 'GlobalPopup',
- data() {
- return {
- visible: false,
- content: '',
- subContent: '',
- titleType: '',
- popupType: '',
- animationData: {},
- closefn: () => {}
- }
- },
- computed: {
- bgImage() {
- return `${this.popupType === 'success' ? '/static/成功弹窗.png' : '/static/失败弹窗.png'}`
- },
- titleImage() {
- switch (this.titleType) {
- case 'exchange':
- if (this.popupType === 'success') {
- return '/static/兑换成功.png'
- }else{
- return '/static/兑换失败.png'
- }
- case 'signup':
- return '/static/报名成功.png'
- case 'submit':
- return '/static/提交成功.png'
- default:
- return ''
- }
- }
- },
- methods: {
- close() {
- this.createHideAnimation()
- this.closefn()
- },
- // 主内容 副内容 标题类型 弹窗类型
- open({
- content = '默认内容',
- subContent = '默认子内容',
- titleType = 'exchange', // 报名 兑换 提交
- popupType = 'success', // 成功 失败
- closefn = () => {}
- }) {
- this.content = content
- this.subContent = subContent
- this.titleType = titleType
- this.popupType = popupType
- // 先设置初始动画状态
- this.setInitialAnimation()
- // 显示弹窗
- this.visible = true
-
- // 延迟执行显示动画
- this.$nextTick(() => {
- setTimeout(() => {
- this.createShowAnimation()
- }, 50)
- })
- this.closefn = closefn
- },
- // 设置初始动画状态
- setInitialAnimation() {
- const animation = uni.createAnimation({
- transformOrigin: "50% 50%",
- duration: 0,
- timingFunction: "ease-out",
- delay: 0
- })
- animation.translateX('-50%').translateY('-50%').scale(0).opacity(0).step()
- this.animationData = animation.export()
- },
- // 创建弹窗显示动画
- createShowAnimation() {
- const animation = uni.createAnimation({
- transformOrigin: "50% 50%",
- duration: 200,
- timingFunction: "ease-out",
- delay: 0
- })
- // 动画到最终状态:保持居中,缩放为1,透明度为1
- animation.translateX('-50%').translateY('-50%').scale(1).opacity(1).step()
- this.animationData = animation.export()
- },
- // 创建弹窗隐藏动画
- createHideAnimation() {
- const animation = uni.createAnimation({
- transformOrigin: "50% 50%",
- duration: 200,
- timingFunction: "ease-in",
- delay: 0
- })
- animation.translateX('-50%').translateY('-50%').scale(0).opacity(0).step()
- this.animationData = animation.export()
- // 动画结束后隐藏弹窗
- setTimeout(() => {
- this.visible = false
- }, 200)
- }
- }
- }
- </script>
-
- <style scoped lang="scss">
- .popup-overlay {
- position: fixed;
- inset: 0;
- width: 100%;
- height: 100%;
- background: #00000050;
- z-index: 999;
- .popup-content {
- position: relative;
- top: 50%;
- left: 50%;
- width: 632rpx;
- padding: 0;
- height: 830rpx;
- // background: red;
- // border-radius: 20rpx;
- // background-size: 100% 100%;
- .popup-bg{
- position: absolute;
- inset: 0;
- z-index: -1;
- width: 632rpx;
- height: 830rpx;
- }
- .popup-title{
- position: absolute;
- top: 44rpx;
- left: 88rpx;
- height: 100rpx;
- width: 254rpx;
- }
- .popup-btn{
- position: absolute;
- bottom: 30rpx;
- left: 50%;
- transform: translateX(-50%);
- width: 432rpx;
- height: 94rpx;
- border-radius: 20.5px;
- // width: 28px;
- font-size: 14px;
- line-height: 94rpx;
- color: #ffffff;
- }
- .success{
- background: #1488db;
- }
- .fail{
- background: #e54b4b;
- }
- .popup-text{
- font-size: 16px;
- position: absolute;
- top: 480rpx;
- left: 50%;
- transform: translateX(-50%);
- font-weight: 700;
- color: #000000;
- white-space: nowrap;
- // text-align: center;
- }
- .popup-subtext{
- position: absolute;
- bottom: 252rpx;
- left: 50%;
- transform: translateX(-50%);
- font-size: 14px;
- color: #999999;
- white-space: nowrap;
- // text-align: center;
- }
- }
- }
- </style>
|