[关闭]
@15013890200 2018-08-13T16:08:30.000000Z 字数 5467 阅读 825

vue craousel 轮播插件

vue javascript 插件


1 插件部分

1.1 template部分

  1. <template>
  2. <div class="j_div_carousel" v-if="data.length">
  3. <!-- 左右轮播 -->
  4. <div class="j_div_imgs" @mouseover="show_arrow = true" @mouseout="show_arrow = false" v-if='animate == "left"'>
  5. <div class="j_div_img_show" :style="{left:left}">
  6. <img class="j_carousel_img" @click="turn_page(d.url)" v-for="d in data" :src="d.src" width="100%" height="100%">
  7. </div>
  8. <div class="j_div_radios" v-if="banner">
  9. <span :title="a.name" @click='select(key)' class="j_sp_radio" :class="{'j_sp_radio_selected':key == index}" v-for="(a,key) in data"></span>
  10. </div>
  11. <div class="j_div_arrow" v-if="arrow && show_arrow">
  12. <span @click="turn_img(-1)" class="j_left_arrow" v-if='index > 0'><</span>
  13. <span @click="turn_img(1)" class="j_right_arrow" v-if='index < data.length-1'>></span>
  14. </div>
  15. </div>
  16. <!-- 渐隐渐现 -->
  17. <div class="j_div_imgs" @mouseover="show_arrow = true" @mouseout="show_arrow = false" v-if='animate == "disappear"'>
  18. <img class="j_carousel_img j_dis_img" @click="turn_page(d.url)" v-for="(d,key) in data" :src="d.src" width="100%" height="100%" :style="{opacity: key == index ? 1:0}">
  19. <div class="j_div_radios" v-if="banner">
  20. <span :title="a.name" @click='select(key)' class="j_sp_radio" :class="{'j_sp_radio_selected':key == index}" v-for="(a,key) in data"></span>
  21. </div>
  22. <div class="j_div_arrow" v-if="arrow && show_arrow">
  23. <span @click="turn_img(-1)" class="j_left_arrow" v-if='index > 0'><</span>
  24. <span @click="turn_img(1)" class="j_right_arrow" v-if='index < data.length-1'>></span>
  25. </div>
  26. </div>
  27. <!-- 上下轮播 -->
  28. <div class="j_div_imgs2" @mouseover="show_arrow = true" @mouseout="show_arrow = false" v-if='animate == "vertical"'>
  29. <div class="j_div_img_show" style="transition: top 0.5s;" :style="{top:(-height*index)+'px'}">
  30. <img class="j_carousel_img" @click="turn_page(d.url)" v-for="d in data" :src="d.src" width="100%" height="100%">
  31. </div>
  32. <div class="j_div_radios" v-if="banner">
  33. <span :title="a.name" @click='select(key)' class="j_sp_radio" :class="{'j_sp_radio_selected':key == index}" v-for="(a,key) in data"></span>
  34. </div>
  35. <div class="j_div_arrow" v-if="arrow && show_arrow">
  36. <span @click="turn_img(-1)" class="j_left_arrow" v-if='index > 0'><</span>
  37. <span @click="turn_img(1)" class="j_right_arrow" v-if='index < data.length-1'>></span>
  38. </div>
  39. </div>
  40. </div>
  41. </template>

Tips:轮播动画不同其实只影响包含图片那层div,和其他部分无关,仔细看template部分可以发现

1.2 script部分

  1. <script>
  2. export default {
  3. name: 'mycarousel',
  4. data(){
  5. return{
  6. data: null,//轮播图片对象数组
  7. animate: 'left',//轮播动画选择 left disappear vertical
  8. click: true,//图片是否支持点击跳转
  9. banner: true,//是否显示底banner
  10. banner_click: true,//banner圆点是否支持点击
  11. arrow: true,//是否显示左右切换箭头
  12. left: 0,//animate 为left 时候,用于计算style left值
  13. index: 0,// 记录当前轮播到的图片的数组索引,非id
  14. t_out: null,//记录定时任务,当有人为切换播放顺序时,为了避免播放混乱,即清除原定时任务,再重新开始
  15. time: 3,//图片切换间隔时长
  16. show_arrow: false,//记录左右切换箭头是否显示
  17. width: 200,//记录轮播图的宽度
  18. height: 150//记录轮播图的高度
  19. }
  20. },
  21. props: {
  22. carouselObj: {
  23. type: Object,
  24. default: null
  25. }
  26. },
  27. methods: {
  28. start_carousel: function(){
  29. /* 定时轮播任务 */
  30. let t = this;
  31. this.t_out = setTimeout(function(){
  32. setTimeout(function(){
  33. if(t.index > t.data.length-2){
  34. t.index = 0;
  35. }
  36. else{
  37. t.index++;
  38. }
  39. if(t.animate === 'left'){
  40. t.left = -t.index*t.width + 'px';
  41. }
  42. else if(t.animate === 'vertical'){
  43. }
  44. t.start_carousel();
  45. })
  46. },t.time*1000);
  47. },
  48. select: function(index){
  49. /* 人为选择轮播索引 */
  50. if(!this.banner_click)return;
  51. this.index = index;
  52. this.left = -index*this.width + 'px';
  53. clearTimeout(this.t_out);
  54. this.start_carousel();
  55. },
  56. turn_img: function(num){
  57. /* 切换左右箭头 */
  58. this.index = this.index + num;
  59. this.left = -this.index*this.width + 'px';
  60. clearTimeout(this.t_out);
  61. this.start_carousel();
  62. },
  63. turn_page: function(url){
  64. /* 点击图片,触发跳转事件 */
  65. if(!this.click)return;
  66. window.open("//"+url);
  67. }
  68. },
  69. mounted(){
  70. this.start_carousel();
  71. this.width = this.$el.offsetWidth-2;
  72. this.height = this.$el.offsetHeight -2 ;
  73. },
  74. beforeMount(){
  75. /* 将传入对象的各属性赋值给轮播数据 */
  76. if(this.carouselObj){
  77. for(let key in this.carouselObj){
  78. this.$data[key] = this.carouselObj[key];
  79. }
  80. }
  81. },
  82. watch: {
  83. /* 当轮播对象 在切换图片的时候需要有返回函数时返回 */
  84. 'index': function(){
  85. this.$emit('callback',this.index);
  86. }
  87. }
  88. }
  89. </script>

1.3 css部分

  1. <style scoped>
  2. .j_div_carousel{width: 100%;height: 100%;border: 1px solid #ddd;}
  3. .j_div_imgs{width:100%;height:100%;position:relative;overflow:hidden;white-space:nowrap;}
  4. .j_div_imgs2{width:100%;height:100%;position:relative;overflow:hidden;line-height:0;}
  5. .j_div_img_show{width:100%;height:100%;position:absolute;left:0;transition:left 0.5s;}
  6. .j_div_radios{position:absolute;bottom:0;left:0;background:#000;opacity:0.5;height:30px;width:100%;text-align:center;line-height:30px;}
  7. .j_sp_radio{display:inline-block;width:8px;height:8px;border-radius:50%;background-color:#666;margin-left:5px;cursor:pointer;position:relative;}
  8. .j_sp_radio_selected{background-color:#fff;width:9px;height:9px;}
  9. .j_div_arrow{position:absolute;top:40%;left:0;width:100%;height:0;}
  10. .j_left_arrow{width:25px;height:25px;border-radius:50%;background-color:#000;color:#fff;display:inline-block;text-align:center;opacity:0.3;cursor:pointer;float:left;margin-left:5px;line-height:22px;}
  11. .j_right_arrow{width:25px;height:25px;border-radius:50%;background-color:#000;color:#fff;display:inline-block;text-align:center;opacity:0.3;cursor:pointer;float:right;margin-right:5px;line-height:22px;}
  12. .j_carousel_img{cursor:pointer;margin:0;}
  13. .j_dis_img{position:absolute;top:0;left:0;opacity:0;transition:opacity 1s;}
  14. </style>

2 插件的注册和引用

此部分流程大致和评分插件完全一致

  • carousel.js完成注册,组件命名随意,我一般命名my+组件名,所以该插件命名my-carousel
  • 使用my-carousel插件之前,先import carousel.js,然后Vue.use()相关插件
  • 页面部分<my-carousel :carouselObj="carousel" @callback="select"></my-carousel>

具体流程参见评分插件的引用


3 插件的配置

3.1 参数配置

第二部分第三条:carouselObj传入一个对象,具体包含如下属性

属性名称属性意义默认值是否必须
data传入素材轮播数组,每条记录必须包含src属性,可包含id、name、urlnull
click点击图片是否支持跳转true
time图片切换周期(单位秒)3
animate图片切换动画left
arrow是否包含左右切换箭头true
banner图片下方是否展示缩略true
banner_click缩略圆点是否可点击true

3.2 回调函数

callback回调函数select,当图片切换的时候出发,可以自行定义操作,不需要可以不配置回调函数


4 效果图

3d999c4937361254e62327c4187ea63.png-250.2kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注