vue2中如何更改el-dialog出场动画(el-dialog弹窗组件)

目录
  • 前言
  • 效果
  • 基本思路
  • 代码

前言

el-dialog是一个十分好用的弹窗组件,但是出场动画比较单调,于是决定自定义一个出场动画,本文记叙一下思路。

效果

详见上面动图。

基本思路

.el-body分为两个部分,一个弹窗真正要展示的内容,一个出现、关闭时动画的图片展示(不一定是图片,本项目刚好是图片而已),在出场动画的过程中,图片逐渐消失,真正的内容发逐渐展现,看起来就像是原本那张图片通过旋转之后,变成了弹窗。

代码

首先,写一个常规的el-dialog,里面el-body分为两个部分,真正需要展示的内容和执行动画的图片:

<el-dialog
    :visible.sync="visible"
    top='0'  // 设置为零,方便后续的居中处理
    title="详情弹窗"
  >
    <div class="show-info-facce">
      <!-- 真正展示的内容 -->
    </div>

    <!-- 执行动画的图片 -->
    <div class="animation-face">
      <el-image v-if="showInfo.img" :src="showInfo.img" :fit="'contain'" class="show-img" />
    </div>
  </el-dialog>

然后,对.el-dialog元素的样式进行更改,主要是定位和居中处理,方便后续从某个位置逐渐旋转位移到屏幕中间:

  .el-dialog {
    position: absolute;
    // 根据项目中弹窗的大小设定的居中,用其他方式实现居中也行
    left: calc(50% - 400px);
    top: calc(50% - 242px);
    overflow: hidden;
    // 设置过渡,出现与消失的动画是靠过渡实现的
    transition: all 1s;
  }

这个时候,得到了一个居中与屏幕的弹窗,当然,别忘取消原来el-dialog的出现和消失动画:

.el-dialog__wrapper {
  transition-duration: 0.1s;
}
.el-dialog__wrapper.dialog-fade-enter-active,
.el-dialog__wrapper.dialog-fade-leave-active {
  animation: none !important;
}

这个时候就会得到一个没有动画的弹窗:

接下来,就是主要的动画部分了,在这个项目中,可以看到弹窗是在点击之后出现的,而这个点击实际上会操作一个控制弹窗是否出现的变量visible,来控制弹窗是否出现,本人把这个操作封装成一个函数show(),这个函数还接受展示内容的信息info

/**
 * @param { Object } info
 */
show(info) {
    this.showInfo = info
    this.visible = true
}

到这个步骤为止,是大部分el-dialog的常规使用流程;从封面的动图可以看到,el-dialog是从被点击的图片位置出现的,而且弹窗出现后,原本的图片消失了。
这使得需要在show()获取被点击元素target来实现,这个不难获取,然后就是得到target的位置和大小,将el-dialog设为和target一样,接着使用上面用于执行动画的.animation-face元素来模拟原来的target,然后将target的不透明度opacity设为零,整体代码如下:

    /**
     * @param { HTMLElement } target 被点击的元素
     * @param { Object } info 展示的内容
     */
    show (target, info) {
      // 记录target
      this.targetEl = target
      // 获取target的位置和大小
      const position = target.getClientRects()[0]
      // 获取.el-dialog元素,将其设为和`target`一样的大小和位置
      const dialog = this.$el.querySelector('.el-dialog')
      dialog.style.width = position.width + 'px'
      dialog.style.height = position.height + 'px'
      dialog.style.top = position.top + 'px'
      dialog.style.left = position.left + 'px'
      // 记录展示信息
      this.showInfo = info
      this.$nextTick(() => {
        this.visible = true
        // 原本的target设为透明
        target.style.opacity = 0
      })
    }

已经得到了初步的效果了,接下来就是让弹窗旋转变大居中,这些都比较好实现的,可以通过设定行内样式或者添加class就行,因为前面已经在.el-dialog上设置好了过渡属性,只要某个属性发生变化,就会触发。
个人是通过添加class的方式,因为关闭的时候,弹窗还得回到原来target的位置上,到时候只要去除这个class就能实现,比较方便,变化的样式如下:

 .dialog-finally {
    // 设定好最终展示的宽高
    width: 800px !important;
    height: 484px !important;
    // 最终展示的位置
    left: calc(50% - 400px) !important;
    top: calc(50% - 242px) !important;
    // 加点旋转
    transform: rotateY(360deg);

    // 执行动画的图片透明度设置为零,隐藏起来,显示出真正要展示的内容
    div.animation-face {
      opacity: 0;
    }
  }

然后在show函数中,给.el-dialog元素添加这个class,需要注意的是,直接添加会被vue2合并成一次更改,直接展示最终的样式,不会触发过渡效果,所以延时一会再把展示的class添加上去,完整的show()代码如下:

    /**
     * @param { HTMLElement } target
     * @param { Object } info
     */
    show (target, info) {
      // 记录target
      this.targetEl = target
      // 获取target的位置和大小
      const position = target.getClientRects()[0]
      // 获取.el-dialog元素,将其设为和`target`一样的大小和位置
      const dialog = this.$el.querySelector('.el-dialog')
      dialog.style.width = position.width + 'px'
      dialog.style.height = position.height + 'px'
      dialog.style.top = position.top + 'px'
      dialog.style.left = position.left + 'px'
      // 记录展示信息
      this.showInfo = info
      // 渲染初始位置
      this.$nextTick(() => {
        this.visible = true
        // 延时添加最终样式
        setTimeout(() => {
          // 原本的target设为透明
          target.style.opacity = 0
          // 添加展示的class
          dialog.classList.add('dialog-finally')
        }, 50)
      })
    }

效果:

至此,出现的效果处理完成,接下来就是弹窗消失的效果,因为上面是使用class来添加展示的位置和样式的,所以关闭时,移除那个class就能让.el-dialog回到target的位置,那么需要使用el-dialog关闭之前的钩子before-close,该钩子接受一个函数,如下:

<el-dialog
    :visible.sync="visible"
    top='0'  // 设置为零,方便后续的居中处理
    title="详情弹窗"
    :before-close="handleAnimateClose" // 使用关闭之前的钩子
  >
    <div class="show-info-facce">
      <!-- 真正展示的内容 -->
    </div>

    <!-- 执行动画的图片 -->
    <div class="animation-face">
      <el-image v-if="showInfo.img" :src="showInfo.img" :fit="'contain'" class="show-img" />
    </div>
  </el-dialog>

handleAnimateClose函数就是在关闭之前先移除展示的class,等弹窗回到target原本的位置之后,target的不透明度设置为1,关闭弹窗,代码如下:

    /** 执行关闭动画 */
    handleAnimateClose (done) {
      // 获取`.el-dialog`元素
      const dialog = this.$el.querySelector('.el-dialog')
      // 移除展示的class
      dialog.classList.remove('dialog-finally')
      // 使用延时,等弹窗回到`target`原本的位置,再关闭弹窗
      setTimeout(() => {
        // 关闭弹窗
        done()
        // target不透明度设为1
        this.targetEl.style.opacity = 1
      }, 1000)
    }

效果:

至此,就完成了。

到此这篇关于vue2中如何更改el-dialog出场动画的文章就介绍到这了,更多相关vue2 el-dialog出场动画内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue项目中实现el-dialog组件可拖拽效果

    目录 0. 首先上图,看效果 1. 实现方法 参考资料 0. 首先上图,看效果 1. 实现方法 第一步:创建 drag.js文件 实现拖拽源码 /**  * 拖拽移动  * @param  {elementObjct} bar 鼠标点击控制拖拽的元素  * @param {elementObjct}  target 移动的元素  * @param {function}  callback 移动后的回调  */ export function startDrag(bar, target, call

  • elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo

    调试了好久, 还能凑合用, 请直接看DOME 示例,复制就能用: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- import CSS --> <link rel="stylesheet" href="https://u

  • vue如何随心所欲调整el-dialog中body的样式

    目录 vue调整el-dialog中body样式 自定义el-dialog的样式 1.默认dialog的样式 2.项目需求是这样我们需要自定义的样式 3.代码修改属性部分 vue调整el-dialog中body样式 <el-dialog :visible.sync="dialogVisible" width="30%" class="dialogClass"//设置弹框样式 :showClose="showClo" :c

  • vue2中如何更改el-dialog出场动画(el-dialog弹窗组件)

    目录 前言 效果 基本思路 代码 前言 el-dialog是一个十分好用的弹窗组件,但是出场动画比较单调,于是决定自定义一个出场动画,本文记叙一下思路. 效果 详见上面动图. 基本思路 将.el-body分为两个部分,一个弹窗真正要展示的内容,一个出现.关闭时动画的图片展示(不一定是图片,本项目刚好是图片而已),在出场动画的过程中,图片逐渐消失,真正的内容发逐渐展现,看起来就像是原本那张图片通过旋转之后,变成了弹窗. 代码 首先,写一个常规的el-dialog,里面el-body分为两个部分,真

  • vue3:vue2中protoType更改为config.globalProperties问题

    目录 protoType替换为config.globalProperties Vue3 vs Vue2 Vue3 的新组件 文件对比 全局 API protoType替换为config.globalProperties 原文地址 在main.js中: vue2 Vue.prototype.$verson = '1.0.0' 使用 this.$verson vue3 Vue.config.globalProperties.$verson = '1.0.0' 使用 <script setup lan

  • vue2中filter()的实现代码

    vue2.0里,不再有自带的过滤器,需要自己定义过滤器.定义的方法如下: 注册一个自定义过滤器,它接收两个参数:过滤器 ID 和过滤器函数. Vue.filter('filtername',function(value,参数){ return 参数+value.split('').reverse().join(''); });1234123 完整代码如下: <!doctype html> <html> <head> <meta charset="UTF-

  • 详解如何在Vue2中实现组件props双向绑定

    Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用props的twoWay和.sync绑定修饰符就可以实现props的双向绑定功能,但是在Vue2中彻底废弃了此功能,如果需要双向绑定需要自己来实现. Vue2的组件props通信方式 在Vue2中组件的props的数据流动改为了只能单向流动,即只能由组件外(调用组件方)通过组件的DOM属性attribu

  • LayoutAnimation给ListView中的item设置动态出场效果(实例)

    LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,当它的子元素出场时都按照这个动画出场. LayoutAnimation作用于viewgroup有两种方式: 1. 静态的使用xml文件实现. 2. 在代码中动态实现. 下面用ListView中的item设置动态出场效果来分别介绍两种方式: 静态的使用xml文件实现,分为三步 1. 在res的anim目录(res的文件夹下没有anim文件夹自己新建一个)下定义LayoutAnimation命名为anim_la

  • Vue2中的过滤器filter使用及注意说明

    目录 Vue2中的过滤器是什么 什么是vue的过滤器 过滤器怎么写 注意filter方法在vue3中已被废除 Vue2中的过滤器是什么 什么是vue的过滤器 过滤器可以通俗理解成是一个特殊的方法,用来加工数据的 比如枚举值可以使用过滤器:如 1 2 3 4 对应 成功 失败 进行中 已退回 比如价格后面跟个过滤器,将价格格式化成小数点两位 比如时间格式化等,又比如可以过滤聊天中的某些脏话 过滤器怎么写 <div id="app"> <h3>过滤器基本使用<

  • 深入了解Vue2中的的双端diff算法

    目录 简单diff算法 更新文本节点 key的作用 如何移动呢 双端diff算法 比较方式 非理想情况的处理方式 今天又重读了vue2的核心源码,主要之前读vue2源码的时候纯属的硬记,或者说纯粹的为了应付面试,导致我们并没有去细品源码中的精妙之处.如果回头在重读源码的时候,发现其中有很多地方是值得我们深入了解的.比如我们今天要看的“双端diff”.还记得之前就记得双端diff对比的口诀”头头.尾尾.头尾.尾头“,具体对比做了啥事,这种对比有什么好处,可以说是一无所知.今天我们就来好好的看看.

  • vue2 中如何实现动态表单增删改查实例

    最近项目中遇到的需求是要操作大量的表单,之前的项目中有做过这方的研究,只不过是用jquery来操作. 项目A 先简单说说以前项目A中的应用场景,可能有小伙伴儿也遇到相同的需求.A项目是公司的OA系统中有的项目,是用java的jsp渲染的页面,需求是要改成:嵌入APP中显示,前后端分离, 后端返回的内容,还不能修改, 只是后端同事做了下接口处理,返回给前端的是一大堆的表单数据. 每个表单都有多个字段表示它的属性: 是否可编辑 表单类型 (text, textarea, select, radio,

  • iOS开发中仿Tumblr点赞心破碎动画效果

    最近Tumblr轻博客无论是web端还是移动端,都非常受欢迎,简单调研了一下,其中动画是我感兴趣的,特此写了个仿Tumblr点赞心破碎动画: 1.首先看下效果: 2.模仿Tumblr中的效果应用如下: 原理:使用按钮点击Action增加两个事件,通过改变背景hidden和frame,切换图片,增加动画效果等: setupUI及touch Action: <span style="font-size:14px;">- (void)setupUI { // 点击的btn UIB

  • 详解Vue2中组件间通信的解决全方案

    前言 在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,下面这篇文章将给大家介绍关于Vue2组件间通信的相关内容,下面话不多说,来一起看看详细的介绍. 组件通讯包括:父子组件间的通信和兄弟组件间的通信.在组件化系统构建中,组件间通信必不可少的. 父组件--> 子组件 1. 属性设置 父组件关键代码如下: <template> <Child :child-msg="msg"></Child> </templat

随机推荐