使用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