当前位置: 首页 > news >正文

vue实现自定义滚动条

vue实现自定义滚动条

具体效果如下,这边我用的rem单位,比例是1:40,

vue实现自定义滚动条

先写下页面布局,把原生的滚动条给隐藏掉,给自定义的滑块增加transition: marginLeft 1s linear;可以使左边距过度的更顺滑
 .top-box-2::-webkit-scrollbar {height: 0;}
  <div class="wrap"><!-- 滚动窗口 --><divclass="top-box-2"@scroll="onScroll"ref="box1"><divclass="top-item"v-for="(item,index) in 6":key="index"></div></div><!-- 自定义滚动条 --><divclass="bar"ref="bar"><!-- 滚动滑块 --><spanref="barInner":style="{'margin-left':barLeft+'px'}"></span></div></div>
首先我们要先获取滚动窗口的滚动百分比
 this.diff = this.$refs.box1.scrollWidth - this.$refs.box1.clientWidth; //获取原生滚动条可以滚动的距离,盒子的总宽度-盒子的可视宽度this.barWidth =this.$refs.bar.clientWidth - this.$refs.barInner.clientWidth; //获取自定义滚动条可以滚动的距离,盒子的总宽度-滑块的宽度
然后获取滚动盒子的百分比,然后设置自定义滚动条滑块的左边距
      this.radio = Math.ceil((e.target.scrollLeft * 100) / this.diff); //获取原生滚动盒子的百分比this.barLeft = this.barWidth * (this.radio / 100);   //计算自定义滑块左边距

下面是完整的代码

<template><div class="wrap"><!-- 滚动窗口 --><divclass="top-box-2"@scroll="onScroll"ref="box1"><divclass="top-item"v-for="(item,index) in 6":key="index"></div></div><!-- 自定义滚动条 --><divclass="bar"ref="bar"><!-- 滚动滑块 --><spanref="barInner":style="{'margin-left':barLeft+'px'}"></span></div></div>
</template><script>
export default {data() {return {diff: 0,scrollLeft: 0,radio: 0,barLeft: 0,barWidth: 0,barInnerWidth: 0,};},mounted() {// 延迟2秒执行获取元素宽度的方法,否则原生滚动条可以滚动的距离计算出来会是0setTimeout(() => {this.$nextTick(() => {this.init();});}, 2000);},methods: {init() {this.diff = this.$refs.box1.scrollWidth - this.$refs.box1.clientWidth; //获取原生滚动条可以滚动的距离,盒子的总宽度-盒子的可视宽度this.barWidth =this.$refs.bar.clientWidth - this.$refs.barInner.clientWidth; //获取自定义滚动条可以滚动的距离,盒子的总宽度-滑块的宽度},onScroll(e) {this.radio = Math.ceil((e.target.scrollLeft * 100) / this.diff); //获取原生滚动盒子的百分比this.barLeft = this.barWidth * (this.radio / 100); //计算自定义滑块左边距},},
};
</script><style lang='scss' scoped>
.wrap {.top-box-2::-webkit-scrollbar {height: 0;}.top-box-2 {display: flex;height: 5rem;overflow-x: scroll;margin: 0 2rem;.top-item {flex-shrink: 0;width: 4rem;height: 3rem;border: 0.04rem solid red;margin: 0.5rem;box-sizing: border-box;&:first-child {margin: 0.5rem 0.5rem 0.5rem 0;}&:last-child {margin: 0.5rem 0 0.5rem 0.5rem;}}}.bar {width: 3rem;border-radius: 0.5rem;height: 0.5rem;border: 0.02rem solid red;margin: 0 auto;span {display: block;width: 0.8rem;height: 0.5rem;background: blueviolet;border-radius: 0.5rem;transition: marginLeft 1s linear;}}
}
</style>
http://www.lryc.cn/news/189910.html

相关文章:

  • 基于Qt C++的工具箱项目源码,含命令行工具、桌面宠物、文献翻译、文件处理工具、医学图像浏览器、插件市场、设置扩展等工具
  • C# AnimeGANv2 人像动漫化
  • gateway接口参数加解密
  • WorkPlus定制化的局域网会议软件,提供安全稳定的会议体验
  • 干货|小白也能自制电子相册赶紧码住~
  • docker之Harbor私有仓库
  • 服务器上部署python脚本
  • 【excel技巧】如何在Excel表格中添加选项按钮?
  • 前端 vite+vue3——写一个随机抽奖组件
  • 语音芯片基础知识 什么是语音芯 他有什么作用 发展趋势是什么
  • 设计模式01———简单工厂模式 c#
  • 如何解决MidJourney错过付费后被暂停
  • 考研人考研魂——英语单词篇(20231010)
  • java 版 项目管理工程系统,实现项目全周期管理-源码交付
  • TOGAF(企业架构)
  • vue中v-model的原理是什么?v-model作用在组件上的原理是什么?sync修饰符的原理是什么?
  • 新闻api接口,新闻资讯,社交媒体,体育赛事,全国热门带正文新闻查询API接口
  • Redis - php通过ssh方式连接到redis服务器
  • IDEA的使用(四)创建不同类型的工程(IntelliJ IDEA 2022.1.3版本)
  • Mac上brew切换国内源【极简方案】
  • 计算机网络面试常问问题--保研及考研复试
  • elasticsearch 8.5.3问题记录
  • 【Ubuntu虚拟机】
  • 江苏服务器有哪些特点
  • acwing算法基础之基础算法--求逆序对的数目
  • uni-app 实现考勤打卡功能
  • Jenkins发布失败记录
  • 【算法|双指针系列No.6】leetcode LCR 179. 查找总价格为目标值的两个商品
  • python flask接口字段存在性校验函数(http接口字段校验)(返回提示缺少的字段信息)validate_fields()
  • Linux文件-内存映射mmap