概述

今天我接到一个需求:轮播效果。本来我是打算使用 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 实现轮播效果的更多相关文章

  1. Vue和SuperSlide做轮播效果

    使用这个插件做轮播需要的js应该知道,就是vue.js和jquery.SuperSlide.2.1.1.js 下载地址: vue:https://vuejs.org/js/vue.js 这里直接Ctr ...

  2. CSS3图片轮播效果

    原文:CSS3图片轮播效果 在网页中用到图片轮播效果,单纯的隐藏.显示,那再简单不过了,要有动画效果,如果是自己写的话(不用jquery等),可能要费点时间.css3的出现,让动画变得不再是问题,而且 ...

  3. vue项目全局引入vue-awesome-swiper插件做出轮播效果

    在安装了vue的前提下,打开命令行窗口,输入vue init webpack swiper-test,创建一个vue项目且名为swiper-test(创建速度可能会有点慢,耐心等),博文讲完后,源码托 ...

  4. Vue如何使用vue-awesome-swiper实现轮播效果

    在Vue项目中如何实现轮播图的效果呢,在传统项目中第一个想到的一般都是swiper插件,代码简单好用.一开始我也是直接npm安装swiper然后照着之前的传统写法写,然而却没有效果,只会显示图片但没有 ...

  5. vue实现轮播效果

    vue实现轮播效果 效果如下:(不好意思,图有点大:) 功能:点击左侧图片,右侧出现相应的图片:同时左侧边框变颜色. 代码如下:(也可以直接下载文件) <!DOCTYPE html> &l ...

  6. 常见的仿Flash图片轮播效果

    现在基本在很多网站上都能看到轮播效果,虽然有点烂大街的赶脚,但是这个效果确实很好看,很时尚,今天分享下代码相对较少的轮播框架,望采纳 . ①向左滑动: 思路: 将几个图片用分别用几个 li 包住,并且 ...

  7. 针对淡入淡出的定时轮播效果js

    如果不使用jquery的fadeIn和fadeOut的接口和不适用animate情况下,如果要做用js实现淡入淡出轮播效果,我所想到的办法就是使用css3新特性transition(注意好兼容性). ...

  8. 点击轮播图片左右button,实现轮播效果

    点击左右button.实现图片轮播效果.js代码例如以下: $(function () { var index = 1; var pPage = 1; var $v_citemss = $(" ...

  9. html中使用JS实现图片轮播效果

    1.首先是效果图,要在网页中实现下图的轮播效果,有四张图片,每张图片有自己的标题,然后还有右下角的小方框,鼠标悬浮在小方框上,会切换到对应的图片中去. 2.先是HTML中的内容,最外层是轮播图整个的容 ...

随机推荐

  1. python中的else语句

    python语言和其它语言一样在支持else语句,通常else语句和if语句合用,完成程序的分支选择功能. 例如如下打印学成成绩代码: score = int(input("请输入成绩:&q ...

  2. PAT Basic 1007 素数对猜想 (20 分)

    让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数.显然有d​1​​=1,且对于n>1有d​n​​是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素 ...

  3. Euler-path

    对于每个连通块欧拉回路存在的条件 无向图:只存在两个或者零个度数为奇数的点 有向图:每个点的入度等于出度或者至多有两个点入度不等于出度且一个出度比入度多一另一个入度比出度多一 HDU 多校第二场 C. ...

  4. 用Python实现的二分查找算法(基于递归函数)

    一.递归的定义 1.什么是递归:在一个函数里在调用这个函数本身 2.最大递归层数做了一个限制:997,但是也可以自己限制 1 def foo(): 2 print(n) 3 n+=1 4 foo(n) ...

  5. echarts常用的配置项

    最近使用echarts可视化的业务,但是有一些配置项需要修改,把这段时间的学习总结一下 1. 修改默认配置 a. 去掉分割线和网格线,在xAxis或者yAxis中设置 splitLine: { sho ...

  6. split 命令

    最近下游一直说我供给的文件存在乱码,下游定位到了具体哪一条. 一个250w的数据量,有一条数据有问题.几百兆的文件用note去搜索. 我使用用notepad++后,发现根本打不开. 于是只能先拆分后用 ...

  7. jquery 自定义右键菜单

    如果要自定义右键菜单,那么就需要禁止原本的右键菜单,代码如下 document.oncontextmenu = new Function("return false;");//禁止 ...

  8. Python实现PDF文件截取

    python3截取PDF文件中的一部分. from PyPDF2 import PdfFileWriter, PdfFileReader # 开始页 start_page = 0 # 截止页 end_ ...

  9. 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结

    垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象. ...

  10. chr ord 去重

    找不同字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. def func(s, t): num1 = 0 num2 = 0 for i in s: nu ...