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

首頁 > 編程 > JavaScript > 正文

vue的滾動條插件實現(xiàn)代碼

2019-11-19 10:51:26
字體:
供稿:網(wǎng)友

這篇文章主要介紹了vue的滾動條插件實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

效果如下

代碼如下

<template>  <div class="vue-scroll" ref="vueScrollW">    <div class="vue-scroll-w" ref="vueScroll" >      <div class="vue-scroll-c" :style="{width:cWidth}">        <slot></slot>      </div>    </div>    <div class="vue-scrollbar" v-if="rate < 1">      <div class="vue-scrollbar-thumb"      :style="{height:thumbH,top:thumbTop}"      @mousedown="onmousedown"      @mouseup="onmouseup"      ></div>    </div>  </div></template> <script>   export default {  name:"vue-scroll",  data(){    return {      thumb:0,      top:0,      rate:2,      moveTop:null,      isDrag:false,      cw:10,      observer:null    }  },  computed:{    thumbH(){      return this.thumb + "px";    },    thumbTop(){      return this.top + "px";    },    cWidth(){      return this.cw + "%";    }      },  updated(){    if(!window.MutationObserver){      this.refresh();    }  },  mounted(){    var me = this;    me.$refs.vueScroll.addEventListener("scroll",me.onscroll.bind(me));    window.addEventListener("mouseup",me.onmouseup.bind(me));    window.addEventListener("mousemove",me.onmousemove.bind(me));     if(window.MutationObserver){      //MutationObserver 最低只兼容 ie11      me.observer = new window.MutationObserver(me.mutationCallback.bind(me));      me.observer.observe(me.$refs.vueScroll, {        attributes: true,        childList: true,        subtree: true      });    }        me.refresh();  },  methods:{    mutationCallback(mutationsList){      this.refresh();    },    onscroll(){      this.top = this.$refs.vueScroll.scrollTop * this.rate; //計算滾動條所在的高度      if(this.rate < 1){        this.eventTrigger(this.top);      }    },    refresh(){      var me = this;      var vueScroll = me.$refs.vueScroll;      var rate = vueScroll.clientHeight / vueScroll.scrollHeight; //滾動條高度的比例,也是滾動條top位置的比例      me.rate = rate;      if(rate < 1){        //需要出現(xiàn)滾動條,并計算滾動條的高度        me.thumb = rate * vueScroll.clientHeight; //滾動條的 bar 的高度        //計算出原生的滾動條的寬度        var w = me.$refs.vueScrollW.clientWidth;        //根據(jù)比例,轉(zhuǎn)換為內(nèi)容的百分比        me.cw = w/vueScroll.clientWidth *100;      }else{        //不需要出現(xiàn)滾動條         me.thumb = 0;         me.cw = 10;      }    },      onmousedown(){      this.isDrag = true;      this.moveTop = null;    },    onmouseup(){      this.isDrag = false;    },    onmousemove(e){      if(this.isDrag){        if(this.moveTop !== null){          var speed = e.screenY - this.moveTop;          var top = this.top + speed;          this.scrollThumb(top);        }        this.moveTop = e.screenY;        e.preventDefault();      }           },    scrollThumb(top){      if(top < 0 ){        top = 0;               }      if(top > this.$refs.vueScroll.clientHeight-this.thumb){        top = this.$refs.vueScroll.clientHeight-this.thumb;               }             this.$refs.vueScroll.scrollTop = top/this.rate;      this.top = top;    },    eventTrigger(top){      if(top === 0){        this.$emit("reachTop"); //到達(dá)頂部      }      if(top === this.$refs.vueScroll.clientHeight-this.thumb){        this.$emit("reachBottom"); //到達(dá)底部與      }      this.$emit("vuescroll",this.$refs.vueScroll.scrollTop,this.top);//返回內(nèi)容滾動的高度 和 滾動條所在的高度    },    scrollTo(scrollTop){      //對外的api,滾動的內(nèi)容的哪里       this.$refs.vueScroll.scrollTop = scrollTop;       this.$nextTick(()=>{         this.onscroll();       })    }  },  destroyed(){    var me = this;    me.$refs.vueScroll && me.$refs.vueScroll.removeEventListener("scroll",me.onscroll.bind(me));    window.removeEventListener("mouseup",me.onmouseup.bind(me));    window.removeEventListener("mousemove",me.onmousemove.bind(me));    me.observer&&me.observer.disconnect();  }}</script> <style lang="scss" scoped>.vue-scroll{  height: 100%;  width: 100%;  overflow: hidden;  position: relative;  .vue-scroll-w{    width: 1000%;    height: 100%;    overflow: auto;    .vue-scroll-c{      position: relative;      width: 10%;    }  }  .vue-scrollbar{    position: absolute;    z-index: 1;    right: 0;    top: 0;    width: 4px;    height: 100%;    background: #EEEEEE;    opacity: 0.6;    .vue-scrollbar-thumb{      position: absolute;      top: 0;      right: 0;      width: 4px;      border-radius: 4px;      background: #D3D3D3;      &:hover{        background: #bbb;      }      &:active{        background: #aaa;      }    }  }}</style>

使用

<template>  <div class="scroll">    <vueScroll>      <ul>        <li v-for="item in 60" :key="item">{{item}}</li>      </ul>    </vueScroll>  </div></template> <script>import vueScroll from "@/components/vue-scroll.vue"export default {  data(){    return {      count:60    }  },  components:{    vueScroll  },  mounted(){     }}</script><style lang="less" scoped>.scroll{  width: 400px;  height: 600px;  margin: 0 auto;  border: 1px solid red;  ul{    li{      line-height: 30px;      border-bottom: 1px solid #ddd;    }  }}</style>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 邵阳市| 武陟县| 鄂温| 东兰县| 大连市| 泽州县| 江口县| 威远县| 乌恰县| 鄂托克旗| 黔江区| 晋宁县| 固安县| 新平| 金平| 岳阳市| 吉水县| 涿州市| 新宾| 确山县| 平定县| 京山县| 长春市| 潜江市| 临武县| 五原县| 个旧市| 桃园县| 六安市| 黑山县| 临澧县| 聊城市| 绥阳县| 修武县| 寿光市| 如东县| 西昌市| 木兰县| 叶城县| 乌审旗| 太湖县|