使用vue.js封装一个包含图片的跑马灯组件


初衷:

  学习完Vuejs后,来准备练习仿写一下老东家的门户页面,主要是为了熟悉一下常用插件的使用,比如video.js,wow.js,swiper等等;而其中涉及到一个包含图片跑马灯组件,大概长这样(从左到右进行轮播  ps:太懒,没有截动图):

 

 

 历程:

  像我这样的小白,立马想到的肯定不是自己写了;于是百度查阅,看有没有现成的插件之类,搜索到了vue-marquee-tips,但是查看api,自己试用了一下,发现好像只支持纯文本,无法满足需求;

  查询插件无果,又想着看一下有没有人已经写好了类似的组件,自己可以直接来用的(搜索和研究api就花费了30多分钟的时间,看来我真的很懒……),查询到一个无缝衔接的文字跑马灯,主要是用定时器对字符串进行切割和重新拼接来实现的,虽然代码实现相对简单,但对我这样的小白来说,个人觉得思路是挺不错的,这里附上链接:https://www.cnblogs.com/zhahuhu/p/11592400.html,但是该组件还是只能用于文字,无法满足需求;

  终于,我放弃了找现成插件的想法(或许是百度用的不好吧……),准备自己封装一个跑马灯组件;

实现思路:

  之前学习js的时候,使用定时器做过一个轮播图组件,考虑到跑马灯应该与之类似,只是定时器设置时间较短而已

  首先使用一个外层div来包裹住展示区域div,外层div设置overflow:hidden,子绝父相进行定位,再定时改变子div的left,考虑到如果不设置条件判断,left会一直改变,所以要在left达到某个值时,将left设置回去,这样就可以实现一直轮播的效果,具体代码如下:

 1 <template>
 2   <div class="marquee">
 3     <div class="marquee-content" @mouseover="clearTimer" @mouseout='startTimer'>
 4       <div class="img-item" v-for="(item,index) in imglists" :key="index">
 5         <img :src="item" alt="">
 6         <span>视频点播</span>
 7       </div>
 8     </div>
 9   </div>
10 </template>
11 
12 <script>
13 export default {
14   name: "Marquee",
15   components: {
16   },
17   data() {
18     return {
19       imglists: [],
20       timer: ''
21     };
22   },
23   created() {
24     for (var i = 1; i < 18; i++) {
25       this.imglists.push('http://www.360tianma.com/application/cms/static/images/component'+i+'.png')
26     }
27     this.imglists.push('http://www.360tianma.com/application/cms/static/images/component1.png')
28     // console.log(this.imglists)
29   },
30   mounted() {
31      this.startTimer();
32   },
33   methods: {
34     clearTimer() {
35       clearInterval(this.timer)
36     },
37     startTimer() {
38       var content = document.querySelector('.marquee-content');
39       this.timer = setInterval(() => {
40       var oldleftstr = getComputedStyle(content,null).left
41       var oldleft = parseInt(oldleftstr);
42       content.style.left = oldleft-1 + 'px'
43       if (oldleft <= -2925) {
44         content.style.left = 0
45       }
46     }, 10);
47     }
48   }

49 50 }; 51 </script> 52 53 <style scoped> 54 .marquee { 55 width: 1140px; 56 height: 80px; 57 margin: 0 auto; 58 position: relative; 59 overflow: hidden; 60 margin-top: 100px; 61 padding: 15px; 62 } 63 .marquee-content { 64 width: 4050px; 65 position: absolute; 66 left: 0; 67 } 68 69 .img-item { 70 width: 225px; 71 height: 80px; 72 line-height: 80px; 73 float: left; 74 text-align: center; 75 } 76 img { 77 width: 50px; 78 height: 50px; 79 } 80 </style>

  注:因为是仿写,主要练习功能实现,所以上述代码中的图片都用for循环来添加成一样的了

个人总结:

  上述代码虽然简单,而且也存在不少缺陷,但是也为今后解决类似的问题提供一种思路;对于我这样的小白也算是多一次练习和提升;以后遇到类似的组件,可能会多想到自己来封装,而非找其他插件;

该仿写页面已完成,github:https://github.com/Xiaohuimao/Vue-tianma.git,感兴趣的同学可自行查阅(该项目文件组织有点惨不忍睹,还望不要吐槽)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM