小程序自定义组件对话框动画过渡记录

效果图

在这里插入图片描述
在这里插入图片描述

自定义组件wxml

<view class="{{translateY?'modal-shadow':'modal-shadow flex'}}" bindtap="onCancel"  hidden="{{!isShow}}">
    <view class="{{translateY?'modal-dialog translateY':'modal-dialog '}}" animation="{{animation}}"
    >
        <view class="modal-title" wx:if="{{isHeader}}">{{title}}</view>
        <view class="modal-content">
            <slot name="content"></slot>
        </view>
        <view class="modal-footer" wx:if="{{isFooter}}">
            <view class="btn-cancel" bindtap="onCancel" wx:if="{{isCancel}}">{{cancelTxt}}</view>
            <view class="btn-confirm" bindtap="onConfirm" wx:if="{{isConfirm}}">{{confirmTxt}}</view>
            <slot name="auth" ></slot>
        </view>
    </view>
</view>

自定义组件css

.modal-shadow {
    width: 100%;
    height: 100%;
    position: fixed;
    top: 0;
    left: 0;
    background:rgba(0,0,0,0.5);
    z-index: 1000;
}
.flex{
    display: flex;
    align-items:center;
    justify-content: center;
}
.modal-dialog {
    width: 80%;
    overflow: hidden;
    z-index: 1001;
    background: #fff;
    border-radius: 10rpx;
    padding: 30rpx;
    box-sizing: border-box;
}
.translateY{
    width:100%;
    position:absolute;
    bottom:0;
    left: 0;
    transform:translateY(100%);
    padding:0
}
.modal-title {
    font-size: 34rpx;
    text-align: center;
    font-weight:600;
    color:rgba(0,0,0,1);
    line-height:100rpx;
    border-bottom: 1px solid #dedede;
    overflow: hidden ;
    text-overflow: ellipsis;
    -webkit-line-clamp: 1;
    white-space:nowrap;
}
.modal-content {
    padding: 30rpx;
}
.modal-footer {
    display: flex;
    height: 86rpx;
    border-top: 1px solid #dedede;
    font-size: 34rpx;
    line-height: 86rpx;

}
.btn-cancel,.btn-confirm{
    width: 100%;
    text-align: center;
}
.btn-cancel {
    color: #666;
    border-right: 1px solid #dedede;
}

.btn-confirm {
    color: #0bb20c;
    background-color: #fff;
}

自定义组件js

const app = getApp()
Component({
  options:{
    multipleSlots: true //插槽
  },
  properties: {
    animation:{
      type: Object,
      value: {}
    },
    translateY:{
      type: Boolean,
      value: false
    },
    isShow: {
      type: Boolean,
      value: false
    },
    isFooter: {
      type: Boolean,
      value: true
    },
    isHeader: {
      type: Boolean,
      value: true
    },
    isCancel: {
      type: Boolean,
      value: true
    },
    isConfirm: {
      type: Boolean,
      value: true
    },
    cancelTxt: {
      type: String,
      value:"取消"
    },
    confirmTxt: {
      type: String,
      value: "确认"
    },
    title: {
      type: String,
      value: ""
    },
  },

  data: {

  },
  lifetimes: {
    attached: function () {

    },
  },
  methods: {
    onConfirm(){
        this.triggerEvent('onConfirm')
    },
    onCancel(){
      this.triggerEvent('onCancel')
    },
  }
})

效果图1调用

//json
{
  "usingComponents": {
    "anima-modal": "/pages/component/anima-modal/anima-modal"
  }
}

//wxml
<button bind:tap="onShow">显示</button>
<anima-modal isShow="{{authModal.isShow}}"  title="{{authModal.title}}"  animation="{{authModal.animation}}"
             cancelTxt="再看看" confirmTxt="确认授权" bind:onCancel="onCancel"  bind:onConfirm="onConfirm" >
  <view slot="content" >
    <view class="m-title">授权后,您将解锁更多功能</view>
    <view class="m-list flex-center">
      <view class="submit-bg cir"></view>
      <image src="https://static-1256912642.cos.ap-chengdu.myqcloud.com/pm2.0/register/jiangpin.png" mode="widthFix"></image>
      文件收藏
    </view>
    <view class="m-list flex-center">
      <view class="submit-bg cir"></view>
      <image src="https://static-1256912642.cos.ap-chengdu.myqcloud.com/pm2.0/register/wenjian%202.png" mode="widthFix"></image>
      奖品兑换
    </view>
  </view>
  <!--
     <view bind:tap="onConfirm" style="width:100%"  slot="auth">
        <button
                wx:if="{{canIUse}}"
                open-type="getUserInfo"
                bindgetuserinfo="bindGetUserInfo"
                class="btn-confirm"
        >
            确认授权
        </button>
    </view>
    -->
</anima-modal>
//js
const anima = require('../../utils/animation')
Page({
  data: {
    authModal: {
      isShow: false,
      isWxShow: false,
      isConfirm: false,
      title: '微信昵称头像授权',
      animation: 'animationData'
    },
    // canIUse: wx.canIUse('button.open-type.getUserInfo'),
  },
  onShow: function() {
    anima.showModal(this, 'authModal.isShow', 'authModal.animation', 1000, 1, 200, 'opacity')
  },
  onConfirm() {
    this.onCancel()
  },
  onCancel() {
    anima.hideModal(this, 'authModal.isShow', 'authModal.animation', 1000, 0, 500, 'opacity')
  },
  bindGetUserInfo(){

  }
})

效果图2调用

//wxml
<button bind:tap="onShow">显示</button>
<anima-modal isShow="{{isShow}}"  isHeader="{{false}}"  isFooter="{{false}}"
                bind:onCancel="onCancel" animation="{{animationData}}" translateY="{{true}}">
    <view slot="content" >
    </view>
  </anima-modal>
//js
const anima = require('../../utils/animation')
Page({
  data: {
      isShow: false,
  },
  onShow: function() {
     anima.showModal(this,'isShow','animationData',600,0,200,'translateY')
  },
  onCancel() {
         anima.hideModal(this,'isShow','animationData',600,500,700,'translateY')
  },
})

animation.js

module.exports={
    showModal: function (that,name,animationData,duration,style,timeout,way) {
        let animation = wx.createAnimation({
            duration: duration,//动画的持续时间 
            timingFunction: 'ease',//动画的效果 
        })
        let showName = '{"' + name + '":""}'
        showName = JSON.parse(showName);
        showName[name] = true
        that.setData(showName)
        setTimeout(function(){
            if(way==="translateY")//style值为距离
                animation.translateY(style).step()
            else if(way==='opacity')//style值为1-0
                animation.opacity(style).step({duration:0}) //重置动画,再次触发动画
            //将param转换为key
            let json = '{"' + animationData + '":""}'
            json = JSON.parse(json);
            json[animationData] = animation.export()
            that.setData(json)
        },timeout)//延迟执行
    },
    // 隐藏遮罩层
    hideModal: function (that,name,animationData,duration,style,timeout,way) {
        let animation = wx.createAnimation({
            duration: duration,
            timingFunction: 'ease',
        })
        if(way==="translateY")
            animation.translateY(style).step()
        else if(way==='opacity')
            animation.opacity(style).step({})
         let json = '{"' + animationData + '":""}'
        json = JSON.parse(json);
        json[animationData] = animation.export()
        that.setData(json)
        setTimeout(function(){
             let showName = '{"' + name + '":""}'
            showName = JSON.parse(showName);
            showName[name] = false
            //设置动画
            that.setData(showName)
        },timeout)//先执行动画,再隐藏模块

    },
}

WPF 提示对话框样式是指对应用程序中的弹出提示信息框进行自定义样式设计。WPF 提供了丰富的组件和属性来实现对话框的个性化设置。 首先,我们可以使用样式(Style)来修改对话框的外观。通过为对话框中的控件应用自定义样式,我们可以改变按钮的颜色、边框的样式、字体的大小和颜色等。可以使用预定义的样式,也可以自定义样式以满足特定需求。 其次,WPF 提供了弹出动画的支持,使得对话框的出现和消失能够更加平滑。开发人员可以使用内置的动画效果(如淡入淡出或滑动),或者自定义动画来实现对话框过渡效果,增加用户体验。 此外,WPF 还提供了对话框的位置和大小进行控制的功能。我们可以调整对话框的大小,使其适应内容的长度和宽度,并确保它在屏幕上的位置合适。通过指定对话框的最小和最大大小以及位置的绑定,可以使其在不同的窗口大小上实现自适应。 最后,WPF 提供了多种选择和事件处理机制,以便与用户进行交互。开发人员可以根据不同的用户操作创建不同的对话框响应,例如单击确认按钮或取消按钮时的不同行为,以实现复杂的交互逻辑。 总结来说,WPF 提供了丰富的功能和灵活性,使开发者能够轻松地创建具有个性化样式的提示对话框。通过使用样式和动画效果以及控制大小和位置,可以实现更好的用户体验和可定制性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值