在 vue 中用 transition 实现轮播效果
概述
今天我接到一个需求:轮播效果。本来我是打算使用 Swiper 实现的,但是想起来貌似 transition 也能实现。于是就试了下,真的可以,还挺简单的,于是就记录下来,供以后开发时参考,相信对其他人也有用。
参考资料:进入/离开 & 列表过渡
transition
我从官网扒了一个示例的源码,如下所示:
<div id="no-mode-translate-demo" class="demo">
  <div class="no-mode-translate-demo-wrapper">
    <transition name="no-mode-translate-fade">
      <button v-if="on" key="on" @click="on = false">
        on
      </button>
      <button v-else="" key="off" @click="on = true">
        off
      </button>
    </transition>
  </div>
</div>
<script>
new Vue({
  el: '#no-mode-translate-demo',
  data: {
    on: false
  }
})
</script>
<style>
.no-mode-translate-demo-wrapper {
  position: relative;
  height: 18px;
}
.no-mode-translate-demo-wrapper button {
  position: absolute;
}
.no-mode-translate-fade-enter-active, .no-mode-translate-fade-leave-active {
  transition: all 1s;
}
.no-mode-translate-fade-enter, .no-mode-translate-fade-leave-active {
  opacity: 0;
}
.no-mode-translate-fade-enter {
  transform: translateX(31px);
}
.no-mode-translate-fade-leave-active {
  transform: translateX(-31px);
}
</style>
这个示例是,如果点击按钮,按钮就会从左边渐隐消失,然后另一个按钮会从右边渐隐出现。这不就是轮播效果吗?所以我仿照这个例子做了如下改写:
<template>
  <div>
    <div class="chart-wrapper">
      <transition name="slide">
        <div v-if="id === 0" class="chart" key="0">
          <e-charts
            :options="chartOption"
          />
        </div>
        <div v-else-if="id === 1" class="chart" key="1">
          <e-charts
            :options="chartOption"
          />
        </div>
        <div v-else-if="id === 2" class="chart" key="2">
          3333
        </div>
        <div v-else-if="id === 3" class="chart" key="3">
          444
        </div>
      </transition>
    </div>
    <ul style="display: flex;">
      <li @click="id = 0">第一个</li>
      <li @click="id = 1">第二个</li>
      <li @click="id = 2">第三个</li>
      <li @click="id = 3">第四个</li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      id: 0,
    };
  },
  computed: {
    chartOption() {
      return {
        xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
        },
        yAxis: {
            type: 'value'
        },
        series: [{
            data: [820, 932, 901, 934, 1290, 1330, 1320],
            type: 'line'
        }],
      };
    },
  },
};
</script>
<style lang="scss">
.chart-wrapper {
  position: relative;
  margin-left: 200px;
  width: 800px;
  height: 400px;
}
.chart-wrapper .chart {
  display: flex;
  position: absolute;
  width: 100%;
  height: 400px;
}
.slide-enter-active, .slide-leave-active {
  transition: all 1s;
}
.slide-enter {
  opacity: 0;
  transform: translateX(100%);
}
.slide-leave-active {
  opacity: 0;
  transform: translateX(-100%);
}
</style>
上面我们希望通过轮播,来切换 echarts 的图标,但是,实际用起来我们发现,当切换第三页和第四页的时候,切换效果是正常的,说明已经成功了。但是在切换第一页和第二页的时候,echarts 图表总是会无缘无故消失。
冷静分析,我们在切换的时候,是通过利用 v-if 来实现的,也就是说,v-if 先起作用,然后带动 scss 的动画起作用。那么因为第三页和第四页中的内容是静态的,所以 v-if 对它没什么影响;但是第一页和第二页中的 echarts 图表组件,在 v-if 起作用的瞬间,就已经调用 destroy 方法销毁掉了,然后 scss 才开始起作用,最后出现轮播的动画效果,所以就出现了 echarts 图表先消失,然后才发生轮播动画的情况。
所以这里如果要实现 echarts 图表组件的渐隐,就不能用 v-if 方法,只能用 v-show 方法。
transition-group
如果用 v-show 方法,那么 transition 组件里面就有不止一个元素了,所以必须将 transition 改成 transition-group。改后的代码如下:
<template>
  <div>
    <div class="chart-wrapper">
      <transition-group name="slide">
        <div v-show="id === 0" class="chart" key="0">
          <e-charts
            :options="chartOption"
          />
        </div>
        <div v-show="id === 1" class="chart" key="1">
          <e-charts
            :options="chartOption"
          />
        </div>
        <div v-if="id === 2" class="chart" key="2">
          3333
        </div>
        <div v-else-if="id === 3" class="chart" key="3">
          444
        </div>
      </transition-group>
    </div>
    <ul style="display: flex;">
      <li @click="id = 0">第一个</li>
      <li @click="id = 1">第二个</li>
      <li @click="id = 2">第三个</li>
      <li @click="id = 3">第四个</li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      id: 0,
    };
  },
  computed: {
    chartOption() {
      return {
        xAxis: {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
        },
        yAxis: {
            type: 'value'
        },
        series: [{
            data: [820, 932, 901, 934, 1290, 1330, 1320],
            type: 'line'
        }],
      };
    },
  },
};
</script>
<style lang="scss">
.chart-wrapper {
  position: relative;
  margin-left: 200px;
  width: 800px;
  height: 400px;
}
.chart-wrapper .chart {
  display: flex;
  position: absolute;
  width: 100%;
  height: 400px;
}
.slide-enter-active, .slide-leave-active {
  transition: all 1s;
}
.slide-enter {
  opacity: 0;
  transform: translateX(100%);
}
.slide-leave-active {
  opacity: 0;
  transform: translateX(-100%);
}
</style>
由于 transition-group 和 transition 的原理基本上是一样的。所以只需要把 transition 改成 transition-group,然后把 v-if 改成 v-show 就行了,其它地方根本不需要动。
运行起来后,发现 echarts 图表的轮播效果正常了!
在 vue 中用 transition 实现轮播效果的更多相关文章
- Vue和SuperSlide做轮播效果
		使用这个插件做轮播需要的js应该知道,就是vue.js和jquery.SuperSlide.2.1.1.js 下载地址: vue:https://vuejs.org/js/vue.js 这里直接Ctr ... 
- CSS3图片轮播效果
		原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且 ... 
- vue项目全局引入vue-awesome-swiper插件做出轮播效果
		在安装了vue的前提下,打开命令行窗口,输入vue init webpack swiper-test,创建一个vue项目且名为swiper-test(创建速度可能会有点慢,耐心等),博文讲完后,源码托 ... 
- Vue如何使用vue-awesome-swiper实现轮播效果
		在Vue项目中如何实现轮播图的效果呢,在传统项目中第一个想到的一般都是swiper插件,代码简单好用.一开始我也是直接npm安装swiper然后照着之前的传统写法写,然而却没有效果,只会显示图片但没有 ... 
- vue实现轮播效果
		vue实现轮播效果 效果如下:(不好意思,图有点大:) 功能:点击左侧图片,右侧出现相应的图片:同时左侧边框变颜色. 代码如下:(也可以直接下载文件) <!DOCTYPE html> &l ... 
- 常见的仿Flash图片轮播效果
		现在基本在很多网站上都能看到轮播效果,虽然有点烂大街的赶脚,但是这个效果确实很好看,很时尚,今天分享下代码相对较少的轮播框架,望采纳 . ①向左滑动: 思路: 将几个图片用分别用几个 li 包住,并且 ... 
- 针对淡入淡出的定时轮播效果js
		如果不使用jquery的fadeIn和fadeOut的接口和不适用animate情况下,如果要做用js实现淡入淡出轮播效果,我所想到的办法就是使用css3新特性transition(注意好兼容性). ... 
- 点击轮播图片左右button,实现轮播效果
		点击左右button.实现图片轮播效果.js代码例如以下: $(function () { var index = 1; var pPage = 1; var $v_citemss = $(" ... 
- html中使用JS实现图片轮播效果
		1.首先是效果图,要在网页中实现下图的轮播效果,有四张图片,每张图片有自己的标题,然后还有右下角的小方框,鼠标悬浮在小方框上,会切换到对应的图片中去. 2.先是HTML中的内容,最外层是轮播图整个的容 ... 
随机推荐
- ceph问题汇总
			1. [ceph_deploy][ERROR ]RuntimeError: Failed to execute command: yum -y install epel-release 解决方案 进入 ... 
- 使用Spring Mail发送QQ邮件
			一.邮箱设置 QQ邮箱设置:http://service.mail.qq.com/cgi-bin/help?id=28, 下面这些服务需要开启(需要设置邮箱独立密码): 二.applicationCo ... 
- Dubble 01 架构模型&start project
			Dubbo 01 架构模型 传统架构 All in One 测试麻烦,微小修改 全都得重新测 单体架构也称之为单体系统或者是单体应用.就是一种把系统中所有的功能.模块耦合在一个应用中的架构方式.其优点 ... 
- Codeforces Round #344 (Div. 2) 631 C. Report (单调栈)
			C. Report time limit per test2 seconds memory limit per test256 megabytes inputstandard input output ... 
- 网红题之一题多变$\;\;\text{e}^x\geqslant x^2+(\text{e}-2)x+1(x>0)$
			母题 证明$:\;\;\text{e}^x\geqslant x^2+(\text{e}-2)x+1\;\;(x>0)$ 注$:\;$用不同的结构变形来证明 变式1: 若$\forall x\i ... 
- k8sJob控制器
			Job控制器用于调配pod对象运行一次性任务,容器中的进程在正常运行结束后不会对其进行重启,而是将pod对象置于completed状态.若容器中的进程因错误而终止,则需要依据配置确定重启与否,未运行完 ... 
- 2018中国大学生程序设计竞赛 - 网络选拔赛 Find Integer
			Find Integer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ... 
- ZJOI2010 诸神眷顾的幻想乡
			题目链接:戳我 非常不好意思,因为想要排版,所以今天先只把代码贴出来,明天补题解. #include<iostream> #include<cstdio> #include&l ... 
- 【CF963C】Cutting Rectangle(数论,构造,map)
			题意: 思路:考虑构造最小的单位矩形然后平铺 单位矩形中每种矩形的数量可以根据比例算出来,为c[i]/d,其中d是所有c[i]的gcd,如果能构造成功答案即为d的因子个数 考虑如果要将两种矩形放在同一 ... 
- 详解vue的diff算法原理
			我的目标是写一个非常详细的关于diff的干货,所以本文有点长.也会用到大量的图片以及代码举例,目的让看这篇文章的朋友一定弄明白diff的边边角角. 先来了解几个点... 1. 当数据发生变化时,vue ... 
