vue 自定义指令实现,滚动条百分比进度条。

您可以戳这里查看演示效果



v-progress.js

import "./v-progress.css";

const scrollInit = (dom, opts, progress, progressContent) => {
  let width = "height";
  let scrollTop = dom.scrollTop;
  let scroll = dom.scrollTop;
  let top = "top";
  progressContent.style.height = "100%";
  progressContent.style.width = ((dom.scrollTop / (dom.scrollHeight - dom.clientHeight) * 100) || 0) + "%";
  switch (opts.type) {
    case "top":
      break;
    case "bottom":
      scrollTop = -dom.scrollTop;
      top = "";
      break;
    case "left":
      width = "width";
      scrollTop = 0;
      scroll = dom.scrollTop;
      progressContent.style.width = "100%";
      progressContent.style.height = ((dom.scrollTop / (dom.scrollHeight - dom.clientHeight) * 100) || 0) + "%";
      break;
    case "right":
      width = "width";
      scrollTop = 0;
      scroll = dom.scrollTop;
      progressContent.style.width = "100%";
      progressContent.style.height = ((dom.scrollTop / (dom.scrollHeight - dom.clientHeight) * 100) || 0) + "%";
      break;
    default:
      width = "height";
  }

  let height = width == "height" ? "width" : "height";
  progressContent.style.background = opts.color;
  progress.style.cssText = `background: ${opts.background}; ${width}: ${opts.width}; ${height}: 100%; ${opts.type}: ${scrollTop}px; ${top}: ${scroll}px;`;
}
export default {
  bind(el, binding) {
    const opts = Object.assign(
      {
        color: "#409EFF",  //颜色
        background: "transparent",  // 底部颜色
        width: "3px",  // 宽度
        type: "top", // "top 上  bottom 下  left 左  right 右"
      },
      binding.value
    );

    if (el) {
      setTimeout(() => {
        if (
          !window.getComputedStyle(el, null).position ||
          window.getComputedStyle(el, null).position == "static" ||
          window.getComputedStyle(el, null).position == "initial"
        ) {
          el.style.position = "relative";
        }
        el.style.overflowY = "scroll";
        el.style.overflowX = "hidden";
        let progress = document.createElement("div");
        let progressContent = document.createElement("p");
        progress.className = "scroll-progress";
        progress.appendChild(progressContent);
        el.appendChild(progress);

        scrollInit(el, opts, progress, progressContent);
        el.onscroll = () => {
          scrollInit(el, opts, progress, progressContent);
        }
      });
    }
  }
};


复制代码


复制代码

index.js

import progress from './v-progress.js'
// 添加install方法
const Progress = {
    install: function (Vue) {
        Vue.directive("progress", progress)
    }
}

// Progress
export default Progress

复制代码


v-progress.css

.scroll-progress {
  position: absolute;
  z-index: 99999;
}复制代码

使用案例:

app.vue

<template>
  <div id="app" v-progress>
    <div v-progress="{backgroundColor: 'red'}" class="box-a">
      <p v-for="(x,i) in 30" :key="i">我是{{i}}</p>
    </div>
    <div v-progress="{type: 'bottom', color: 'radial-gradient(#14b9ff, #67C23A)'}" class="box-b">
      <p v-for="(x,i) in 30" :key="i">我是{{i}}</p>
    </div>
    <div v-progress="{type: 'right', color: 'linear-gradient(to bottom ,#F56C6C, #E6A23C)'}" class="box-c">
      <p v-for="(x,i) in 30" :key="i">我是{{i}}</p>
    </div>
    <div  v-progress="{type: 'left', color: 'radial-gradient(#14b9ff, #67C23A)', background: 'linear-gradient(to bottom ,#F56C6C, #E6A23C)'}" class="box-d">
      <p v-for="(x,i) in 30" :key="i">我是{{i}}</p>
    </div>
  </div>
</template>

复制代码


手机模式下略有问题,手机计算能力下进度条略有抖动。建议再PC 模式下使用。



转载于:https://juejin.im/post/5c8b56f25188257f882f16b4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值