Vue展开收起动画

一、css transition实现动画效果

在Vue中实现展开收起动画的常用方式就是使用css transition。使用transition可以给目标元素的任意状态变化提供动画效果,比如在元素高度从0到高度自适应的过程中播放动画。

下面是一个基本的例子,其中<transition>元素用于包裹需要动画效果的元素,然后可以通过指定name属性和定义对应状态的css样式来实现动画:

<template>
  <div>
    <button @click="isVisible = !isVisible">Toggle</button>
    <transition name="slide">
      <div v-if="isVisible">Some content here...</div>
    </transition>
  </div>
</template>

<style>
.slide-enter-active,
.slide-leave-active {
  transition: all 0.3s ease;
}
.slide-enter,
.slide-leave-to {
  opacity: 0;
  transform: translateY(100%);
}
</style>

<script>
export default {
  data() {
    return {
      isVisible: false
    };
  }
};
</script>

二、使用第三方Vue库

虽然使用css transition可以实现基本的展开收起动画效果,但是在实现自定义复杂动画效果时就会比较困难。此时可以使用一些第三方Vue组件库,比如Vue的官方动画库vue-transition,还有比较流行的动画库animate.css。

下面以animate.css为例,介绍如何使用第三方库实现动画效果。

首先安装animate.css:

npm install animate.css -S

然后在需要使用动画效果的组件中引入该库:

import 'animate.css';

下面是一个使用animate.css实现展开收起动画的例子:

<template>
  <div>
    <button @click="isVisible = !isVisible">Toggle</button>
    <div class="container" :class="{ 'animate__animated': isVisible, 'animate__fadeIn': isVisible, 'animate__fadeOut': !isVisible }">
      <div class="content" v-if="isVisible">Some content here...</div>
    </div>
  </div>
</template>

<style>
.container {
  display: flex;
  justify-content: center;
}
.content {
  width: 50%;
  padding: 20px;
}
</style>

<script>
export default {
  data() {
    return {
      isVisible: false
    };
  }
};
</script>

三、使用JS方法手动实现动画

如果对于css transition和第三方库都不够熟悉或者不想使用第三方库,那么可以通过JS手动实现动画效果。手动实现动画主要利用Vue提供的以下API:

  • <transition>的钩子函数
  • Vue的$refs属性

下面是一个手动实现展开收起动画的例子。需要注意的是,这个例子只是为了演示手动动画实现的原理,不是一个完整的方案,需要自己根据实际需求进行完善。

<template>
  <div>
    <button @click="toggle">Toggle</button>
    <div ref="content" class="content" :style="{ height: height + 'px' }">Some content here...</div>
  </div>
</template>

<style>
.content {
  transition: height 0.3s ease;
  overflow: hidden;
}
</style>

<script>
export default {
  data() {
    return {
      height: 0
    };
  },
  methods: {
    toggle() {
      if (this.height === 0) {
        this.height = this.$refs.content.scrollHeight;
      } else {
        this.height = 0;
      }
    }
  }
};
</script>

四、应用场景举例

展开收起动画在实际应用中有很多场景,比如:

  • 在商品列表中,点击商品标题可以展开该商品的详细信息:
  • <template>
      <div v-for="item in productList">
        <div class="title" @click="toggle(item)">{{ item.title }}</div>
        <transition name="slide">
          <div class="detail" :class="{ 'isActive': item.isActive }" v-if="item.isActive">{{ item.detail }}</div>
        </transition>
      </div>
    </template>
    
    <style>
    .slide-enter-active,
    .slide-leave-active {
      transition: all 0.3s ease;
    }
    .slide-enter,
    .slide-leave-to {
      opacity: 0;
      transform: translateY(100%);
    }
    .title {
      cursor: pointer;
    }
    .detail {
      padding: 10px;
      border: 1px solid black;
      margin-top: 10px;
      display: none;
    }
    .isActive {
      display: block;
    }
    </style>
    
    <script>
    export default {
      data() {
        return {
          productList: [
            { title: 'Product 1', detail: 'Details of product 1', isActive: false },
            { title: 'Product 2', detail: 'Details of product 2', isActive: false },
            { title: 'Product 3', detail: 'Details of product 3', isActive: false }
          ]
        };
      },
      methods: {
        toggle(item) {
          item.isActive = !item.isActive;
        }
      }
    };
    </script>
  • 在评论区中,显示或隐藏评论的回复信息:
  • <template>
      <div v-for="comment in commentList">
        <div class="comment">{{ comment.content }}</div>
        <div class="reply" @click="toggle(comment)" v-if="comment.hasReply">{{ comment.numOfReply }} replies</div>
        <transition name="slide">
          <div class="reply-list" :class="{ 'isActive': comment.isActive }" v-if="comment.isActive">
            <div v-for="reply in comment.replyList" class="reply">{{ reply.content }}</div>
          </div>
        </transition>
      </div>
    </template>
    
    <style>
    .slide-enter-active,
    .slide-leave-active {
      transition: all 0.3s ease;
    }
    .slide-enter,
    .slide-leave-to {
      opacity: 0;
      transform: translateY(100%);
    }
    .reply {
      cursor: pointer;
      margin-top: 10px;
    }
    .reply-list {
      padding: 10px;
      border: 1px solid black;
      margin-top: 10px;
      display: none;
    }
    .isActive {
      display: block;
    }
    </style>
    
    <script>
    export default {
      data() {
        return {
          commentList: [
            { content: 'Comment 1', hasReply: true, numOfReply: 2, replyList: [ { content: 'Reply 1.1' }, { content: 'Reply 1.2' } ], isActive: false },
            { content: 'Comment 2', hasReply: false },
            { content: 'Comment 3', hasReply: true, numOfReply: 1, replyList: [ { content: 'Reply 3.1' } ], isActive: false },
          ]
        };
      },
      methods: {
        toggle(comment) {
          comment.isActive = !comment.isActive;
        }
      }
    };
    </script>

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/236887.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:02
下一篇 2024-12-12 12:02

相关推荐

  • 使用Vue实现前端AES加密并输出为十六进制的方法

    在前端开发中,数据传输的安全性问题十分重要,其中一种保护数据安全的方式是加密。本文将会介绍如何使用Vue框架实现前端AES加密并将加密结果输出为十六进制。 一、AES加密介绍 AE…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • Vue3的vue-resource使用教程

    本文将从以下几个方面详细阐述Vue3如何使用vue-resource。 一、安装Vue3和vue-resource 在使用vue-resource前,我们需要先安装Vue3和vue…

    编程 2025-04-27
  • Vue模拟按键按下

    本文将从以下几个方面对Vue模拟按键按下进行详细阐述: 一、Vue 模拟按键按下的场景 在前端开发中,我们常常需要模拟按键按下的场景,比如在表单中填写内容后,按下“回车键”提交表单…

    编程 2025-04-27
  • ThinkPHP6 + Vue.js: 不使用Fetch的数据请求方法

    本文将介绍如何在ThinkPHP6和Vue.js中进行数据请求,同时避免使用Fetch函数。 一、AJAX:XMLHttpRequest的基础使用 在进行数据请求时,最基础的方式就…

    编程 2025-04-27
  • 开发前端程序,Vue是否足够?

    Vue是一个轻量级,高效,渐进式的JavaScript框架,用于构建Web界面。开发人员可以使用Vue轻松完成前端编程,开发响应式应用程序。然而,当涉及到需要更大的生态系统,或利用…

    编程 2025-04-27
  • 如何在Vue中点击清除SetInterval

    在Vue中点击清除SetInterval是常见的需求之一。本文将介绍如何在Vue中进行这个操作。 一、使用setInterval和clearInterval 在Vue中,使用set…

    编程 2025-04-27
  • 如何用核桃编程完成python动画结局

    核桃编程是一款专为儿童编程而设计的语言,其简单易懂的编程界面和各种丰富的功能在很大程度上促进了儿童们对编程的学习和兴趣。本文将会从多个方面介绍如何用核桃编程完成Python动画结局…

    编程 2025-04-27
  • VueClearable:实现易于清除的Vue输入框

    一、VueClearable基本介绍 VueClearable是一个基于Vue.js开发的易于清除的输入框组件,可以在输入框中添加“清除”按钮,使得用户可以一键清空已输入内容,提升…

    编程 2025-04-25
  • Vue 往数组添加字母key

    本文将详细阐述如何在 Vue 中往数组中添加字母 key,并从多个方面探讨实现方法。 一、Vue 中添加字母 key 的实现方法 在 Vue 中,添加 key 可以使用 v-bin…

    编程 2025-04-25

发表回复

登录后才能评论