预览地址

图片的轮播

假设需要轮播三张图片(1,2,3),以前的思路就如图所示,添加两个节点。通过索引(index)的切换实现组件的无缝轮播。

这种想法的确可行,而且实现出来效果还不错。 缺点在于

  • 大量的dom操作。
  • 代码逻辑相对挺复杂,量也更多。
  • 重构或添加新功能会更麻烦

现在的思路

创建两个组件分别为 carouselcarousel-item

结构如下

<x-carousel :selected.sync="selected"><x-carousel-item name="1"><div class="box"> 1</div></x-carousel-item><x-carousel-item name="2"><div class="box">2</div></x-carousel-item><x-carousel-item name="3"><div class="box">3</div></x-carousel-item>
</x-carousel>
复制代码

selected即为显示的内容的name,用sync做一个"双向绑定"。这样子父组件就可以通过 updated钩子和$children来实时通知子组件,从而控制内容的展示。

updated(){this.updateChildrens(this.selected)}methods:{updateChildrens(){//被选中的那个可以显示了,其他的关闭}}
复制代码

也就是说 carousel负责数据通信,而carousel-item只需完成动画过渡效果就行了,这样逻辑就非常清晰了。

这里当然就存在动画正向与反向的问题,需要两种方向不同的切入切出的动画。 carousel需要做一次判断然后在updateChildrens的时候就告诉子组件方向。

进入方向的判断

  • 需要一个变量记录上一次的selected数值,假设就为 oldSelectednewSelected
  • 自动轮播是默认正向的(往后播放),到最后一个的时候回到第一个应该也是正向的
  • 圆点(图片索引图标)选取切换,只需判断两次变量的大小就行
  • 方向键切换(箭头图标),和自动轮播同理,方向应时刻和箭头方向一致

解决跳过中间图片的问题

不管轮播图数量多少,这里始终只在两张图里面切换。这样就涉及到一个问题就是会 跳过中间的图片

首先carousel-item有一个默认的图片过渡时间,这里可以通过计算oldSelectednewSelected之间的差值来确定跳过图片的数量。当然也有动画方向的问题。

 clickSelected(newSelected){clearInterval(this.timer2)if(oldSelected===newSelected)returnlastSelected = oldSelected// .............this.‘控制时长的函数’(lastSelected,newSelected)},'控制时长的函数'(lastSelected,newSelected){//........let newIndex = newSelected let animationDuration = '计时器的间隔时长'theIndex = ‘下一个展示的图片索引’//.......this.duration = duration  this.'carousel组件'.forEach(vm=>vm.duration=duration)this.$emit('update:selected',names[theIndex])//通知一下父组件将要展示的下一个图片的索引if(theIndex===newIndex)returnthis.timer2 = setInterval(()=>{if(theIndex===newIndex){this.clearAndSet()}this.$emit('update:selected',names[theIndex])oldIndex>newIndex?theIndex--:theIndex++},duration*animationDuration)}
复制代码

基本就能完成跳过中间图片的这样子的问题了,后面的click改为 hover触发功能就很简单了。

Card卡片化

需要默认三个同时出现的图片,这意味着需要一个数组。 但是依然不需要改变selected的数据类型(还是字符串)。这种情况用传递数组只会添加许多不必要的麻烦和降低性能,像是需要做深拷贝,遍历判断这类的。 因为这个应该出现的图片的数组里面的index都是连号的。这个判断只需让子组件来做就行了。

现在在carousel-item通过计算得到一个数组

this.cardSelected = [selected-1,selected,selected+1]
if(`最后一张图`){//.....
}else if(`第一张图`){}
复制代码

现在实时显示的三张图片的数组已经有了,我只需要分配好他们的位置(左边,中间,右边

'我是决定位置的函数'(){let [index,position] = [this.cardSelected.indexOf(Number(this.name)),['left','main','right']]return `position-${position[index]}`
}
复制代码

简单的两行就搞定了。

然后绑定一下

 :class="{......,[我是决定位置的函数]:card}">
复制代码

剩下的定位还是动画什么的,都可以交给css去完成了。

 &.position-left{width: 50%;position: absolute;top: 0;left: -10px;transform:scale(0.82);}&.position-main{width: 50%;transform: translateX(50%);position: relative;z-index: 3;}&.position-right{transform: translateX(100%) scale(0.82);width: 50%;position: absolute;top: 0;left: 10px;}
复制代码

最后就是点击两侧图片会切换

调用父组件的方法就ok了

   '调用父组件的方法'(){let [direction,index] = [this.'我是决定位置的函数'.slice(9,16),this.$parent.selectedIndex]if(direction==='main')returnlet move = {left:'back', right:'go'}this.$parent.'我是父组件的方法'(index,move[direction])}
复制代码

尚未完善的细节

其实我认为动画还是有一点点瑕疵的,后面会在css上修改一下,顺便简单调整样式和更换动态svg。最后,有待加强的地方希望大佬们指出来交流,要是觉得还行的话,给我的项目点个star就是最好的了。

转载于:https://juejin.im/post/5c9352f75188252d6d2face4

vue组件之轮播图的实现相关推荐

  1. Vue 过渡实现轮播图

    Vue 过渡实现轮播图 Vue 过渡 Vue 的过渡系统是内置的,在元素从 DOM 中插入或移除时自动应用过渡效果. 过渡的实现要在目标元素上使用 transition 属性,具体实现参考Vue2 过 ...

  2. 利用swiper在vue中做轮播图,并改变轮播图的原有箭头、图片等内容

    目标:利用swiper在vue中做轮播图,并改变轮播图的原有箭头.图片等内容. 实现效果:1.点击左右箭头可切换图片. 2.点击后图片出现最左侧样式效果,只有被点击的图片有此效果,不被点击恢复默认效果 ...

  3. vue移动端轮播图适配宽高

    vue移动端轮播图适配宽高 /** 初始化轮播图的高度 */initSwipeHeight(){console.log(window.screen.width)let picw = 1242; // ...

  4. php 小程序轮播图,微信小程序swiper组件构建轮播图代码分享

    本文主要和大家介绍微信小程序 swiper组件构建轮播图的实例的相关资料,如有疑问请留言或者到本站社区交流讨论,需要的朋友可以参考下,希望能帮助到大家. 微信小程序 swiper组件构建轮播图的实例 ...

  5. 组件封装 - 轮播图组件

    轮播图组件封装, 我们主要分为三大步来完成: 1. 基本布局 2. 渲染结构 3. 逻辑封装 我们这里封装的轮播图组件和 Element UI 所封装的走马灯组件有所不同 Element UI 是直接 ...

  6. vue 实现无限轮播_用vue写一个轮播图效果

    轮播图在网站中几乎无处不在,占用地方少,交互性好.今天就来聊聊如何用vue实现一个轮播效果. 一.原理 在轮播图数组dataList中,定义一个变量currentIndex = 0表示第一张图片,默认 ...

  7. vue——走马灯-类轮播图

    前端重积累,话不多说,先上一波效果图: 特意总结的裸着就能使用的轮播图,拿走不谢 vue文件,可以用webstorm进行运行 webstorm前置配置可见如下链接: nodejs配置 <temp ...

  8. 如何实现轮播图的内容的多少随div的大小动态变化_小程序学习日志8:swiper滑动轮播组件(轮播图)(上)...

    导读 经过这段时间的学习,大家对小程序的编程和代码掌握的如何了呢? 今天我们来讲小程序里实现轮播图的方法,大家要专心看哦. 组件 这个组件叫做滑块组件,嗯,听起来还挺形象的,你看滑动轮播图的时候是不是 ...

  9. ionic组件-Slides轮播图

    Slides轮播图组件 ionic中的轮播图组件是基于swiper插件,所以配置slides的属性需要在swiper的API中找: Swiper触摸滑动插件:https://www.swiper.co ...

最新文章

  1. 管理软件售前咨询与企业架构
  2. 敏捷项目管理—敏捷四宣言
  3. python3字符串拼接_Python3基础 str + 字符串变量拼接
  4. 关于 C语言的 按位取反 ~
  5. 【白皮书分享】2022新职业教育洞察白皮书:“职”成机遇,“育”见未来.pdf...
  6. div+css布局与seo的关系
  7. 运用Mono.Cecil 反射读取.NET程序集元数据
  8. Word 中文编号标题与数字编号题注
  9. 图文讲解:Win8必知快捷键汇总_-Chaz-_新浪博客
  10. 网页的“六度分隔理论”:从一个网页到另外一个网页,最多只需19次点击
  11. 幼儿园计算机认识键盘上课教案,认识键盘教案
  12. AI领域:如何做优秀研究并写高水平论文?
  13. Swift使用代码进行约束
  14. 学计算机语言步骤,如何学编程语言?好菜鸟学习编程语言的步骤
  15. python PEP8问题及解决
  16. 24段魔尺,骆驼,小狗,金鱼,蝴蝶结
  17. [网鼎杯 2020 玄武组]SSRFMe
  18. Win10+OpenCV4.5 无法正常读取USB摄像头数据解决方案
  19. 为什么要用色彩色差仪?色彩色差仪有哪些应用?
  20. 初中学业水平计算机考不及格,山东初中学业水平考试重要不重要?如果考不及格可以补考吗?...

热门文章

  1. 谈谈重要的TCP、UDP
  2. c++primer12.3文本查询程序的一些问题的感悟和错误剖析
  3. java对象复制到另一个对象中_spring: beanutils.copyproperties将一个对象的数据塞入到另一个对象中(合并对象)...
  4. [攻防世界 pwn]——pwn1(内涵peak小知识)
  5. C++——异步操作(std::future、std::async、std::packaged_task、std::promise)
  6. 西南交通大学计算机基础实验,西南交通大学实验教学平台-关于
  7. session 中对象实例在不同事务中的状态
  8. ./ . 和#!/bin/bash 辨析Linux如何选择当前执行脚本的shell
  9. (golang)HTTP基本认证机制及使用gocolly登录爬取
  10. bzoj2538: [Ctsc2000]公路巡逻