国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

詳解vue 自定義marquee無(wú)縫滾動(dòng)組件

2019-11-19 11:50:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

先上效果圖:

(1) 看起來(lái)可能有點(diǎn)卡頓,但是實(shí)際上頁(yè)面上看起來(lái)挺順暢的。

(2) 思路就是獲取每一個(gè)列表的寬度,設(shè)置定時(shí)器移動(dòng)列表,當(dāng)移動(dòng)的距離達(dá)到一個(gè)列表的寬度的時(shí)候,把這個(gè)距離放到數(shù)組的最后。這樣就能達(dá)成無(wú)縫循環(huán)滾動(dòng)了。

 大致的情況就是下面這樣:

 

接下來(lái)就是代碼的實(shí)現(xiàn):

index.vue 引入組件

<template> <div>  <marqueeLeft :send-val='send'></marqueeLeft > </div></template><script> import marqueeLeft from '../components/marquee' export default {  data:function(){   return{    send:[{place: "來(lái)自東莞市的", name: "黃女士"},   {place: "來(lái)自太原市的", name: "吳先生"},   {place: "來(lái)自常州市的", name: "戚先生"},   {place: "來(lái)自金華市的", name: "尤先生"},   {place: "來(lái)自貴陽(yáng)市的", name: "陳女士"},   {place: "來(lái)自長(zhǎng)春市的", name: "魏女士"},   {place: "來(lái)自泉州市的", name: "褚先生"},   {place: "來(lái)自南昌市的", name: "蔣女士"},   {place: "來(lái)自南京市的", name: "沈先生"},   {place: "來(lái)自天津市的", name: "韓先生"},   {place: "來(lái)自寧波市的", name: "鄒女士"},   {place: "來(lái)自嘉興市的", name: "周女士"},   {place: "來(lái)自長(zhǎng)沙市的", name: "秦先生"},   {place: "來(lái)自濟(jì)南市的", name: "孫女士"},   {place: "來(lái)自杭州市的", name: "楊先生"}]   }  },  components:{ marqueeLeft }, }</script>

marquee.vue 組件頁(yè)面

<template> <div class="my-outbox">  <div class="my-inbox" ref='box'>   <div class="my-list" v-for="(item,index) in sendVal" :key='index' ref='list'>    {{item.place}}<span class="my-uname">{{item.name}}</span>剛剛購(gòu)買(mǎi)了產(chǎn)品   </div>  </div> </div></template><script> export default {  name:'my-marquee-left',  props:{     sendVal:Array  },  data() {   return {    nowTime:null,//定時(shí)器標(biāo)識(shí)    disArr:[],//每一個(gè)內(nèi)容的寬度   }  },   mounted:function(){   var that = this;   var item = this.$refs.list;    var len = this.sendVal.length;   var arr = [];   var margin = this.getMargin(item[0]) //因?yàn)樵O(shè)置的margin值一樣,所以取第一個(gè)就行。   for(var i = 0;i < len;i++){    arr.push(item[i].clientWidth + margin)//把寬度和 margin 加起來(lái)就是每一個(gè)元素需要移動(dòng)的距離   }   this.disArr = arr;   this.moveLeft();  },  beforeDestroy:function(){   clearInterval(this.nowTime);//頁(yè)面關(guān)閉清除定時(shí)器   this.nowTime = null;//清除定時(shí)器標(biāo)識(shí)  },  methods:{   //獲取margin屬性   getMargin:function(obj){    var marg = window.getComputedStyle(obj,null)['margin-right'];    marg = marg.replace('px','')    return Number(marg) //強(qiáng)制轉(zhuǎn)化成數(shù)字   },   //移動(dòng)的方法   moveLeft:function(){    var outbox = this.$refs.box;    var that=this;    var startDis = 0;//初始位置    this.nowTime = setInterval(function(){     startDis -= 0.5;     if(Math.abs(startDis) > Math.abs(that.disArr[0])){      that.disArr.push(that.disArr.shift())//每次移動(dòng)完一個(gè)元素的距離,就把這個(gè)元素的寬度      that.sendVal.push(that.sendVal.shift())//每次移動(dòng)完一個(gè)元素的距離,就把列表數(shù)據(jù)的第一項(xiàng)放到最后一項(xiàng)      startDis = 0;     }     outbox.style = 'transform: translateX('+ startDis +'px)'; //每次都讓盒子移動(dòng)指定的距離    },1000/60)   }  } }</script><style lang="less" scoped> .my-outbox{  color: #D7BC8D;  overflow: hidden;  height: 35px;  background: #422b02;  .my-inbox{   white-space: nowrap;   .my-list{    margin-right: 25px;    display: inline-block;    font-size: 13px;    height: 35px;    line-height: 35px;    .my-uname{     color: #FF8900;    }   }  } }</style>

(1) 添加一個(gè)獲取margin的方法,是為了保證如果是使用 rem em 等單位時(shí),margin值不會(huì)出現(xiàn)偏差的情況

(2) 如果引入組件的頁(yè)面中,send-val的值是異步請(qǐng)求的。那么,在marquee.vue組件頁(yè)面,多數(shù)情況會(huì)獲取不了 refs 。這時(shí)候我自己的解決方法是:

<marqueeLeft :send-val='send' v-if='send'></marqueeLeft >

 表示只有當(dāng) send 不為空的時(shí)候才渲染該組件,不過(guò)這種情況會(huì)導(dǎo)致如果 請(qǐng)求響應(yīng)太慢,組件會(huì)一直渲染不出來(lái),就可能會(huì)影響布局。

(3) 如果不想每次都去設(shè)置transform,那么可以把transform放到該元素上,然后修改data中的數(shù)據(jù)就行了,比如:

<div class="my-inbox" :style='transform: translateX('+ cssStyle +'px)'></div>
// 然后在 js 中把 每次移動(dòng)的值,賦值給cssStyle就行了。不過(guò)我感覺(jué)這種沒(méi)什么區(qū)別

 如果想實(shí)現(xiàn),上下無(wú)縫滾動(dòng),這種效果。思路和左右無(wú)縫滾動(dòng)一樣,基本上只需要把 transform 改成 Y軸移動(dòng) ,每個(gè)列表的寬度改成高度就行了。

不清楚這種方式實(shí)現(xiàn)是否會(huì)有什么問(wèn)題,F(xiàn)PS一直保持在 接近60左右。暫時(shí)沒(méi)發(fā)現(xiàn)什么缺點(diǎn)。。。

以上所述是小編給大家介紹的vue自定義marquee無(wú)縫滾動(dòng)組件詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 北流市| 新闻| 江阴市| 连江县| 黎平县| 黔西县| 普定县| 忻州市| 邓州市| 凌源市| 仁寿县| 万年县| 佛坪县| 寿光市| 获嘉县| 和静县| 雷山县| 建瓯市| 新沂市| 北流市| 洞头县| 萨迦县| 乌拉特中旗| 襄樊市| 无为县| 镇雄县| 额济纳旗| 彩票| 浦江县| 泰和县| 双鸭山市| 资溪县| 黑河市| 张家川| 卢龙县| 晋宁县| 广平县| 乐清市| 铁力市| 平原县| 蓬安县|