原生JS实现自定义滚动条效果


Posted in Javascript onOctober 27, 2020

本文实例为大家分享了JS实现自定义滚动条的具体代码,供大家参考,具体内容如下

实现思路:

1.外层设置一个div,在外层的div里面设置一个特别高的div(高度为外层5个div的高度),在高的div里面设置5个div,每个div的高度,都和父级的高度相同
2.在外层div的右侧边框以里自定义一个滚动条,(本人用div设置样式作为滚动条)
3.最外层的div添加onmousewheel事件,使用e.wheelDelta来获取每次滑动的距离,若为正数则向上滑动,将每次增加的数,赋给滚动条的top值,若为负数则向下互动,将每次减少的值,赋值给滚动条的top值,并对特别高的div作对应的上下平移处理
4.注意:滚动条的高度需要和高的div的高度成比例滑动

<!DOCTYPE html> 
<html> 
 <head> 
  <meta charset="UTF-8"> 
  <title>自定义滚轮事件</title> 
  <style type="text/css"> 
   *{ 
    padding: 0; 
    margin: 0; 
   } 
   #wrap{ 
    height: 500px; 
    width: 300px; 
    position: relative; 
    /*超出隐藏*/ 
    overflow: hidden; 
    margin: 200px auto 0; 
    border: 3px solid black; 
   } 
   #content{ 
    width: 300px; 
    /*不需要设置高度,可被图片撑开*/ 
    position: absolute; 
    left: 0; 
    top: 0; 
    border: 1px solid red; 
   } 
   #content > div{ 
    width: 294px; 
    /*去除图片间的间隙*/ 
    vertical-align: top; 
    height: 500px; 
    border: 1px solid red; 
    text-align: center; 
    font-size: 100px; 
    line-height: 500px; 
   } 
   #sliderWrap{ 
    height:100% ; 
    width:16px ; 
    background-color: greenyellow; 
    position: absolute; 
    right: 0; 
    top: 0; 
   } 
   #slider{ 
    width: 10px; 
    height: 50px; 
    background-color: blue; 
    position: absolute; 
    left: 3px; 
    top: 0px; 
    border-radius: 10px; 
   } 
  </style> 
 </head> 
 <body> 
  <div id="wrap"> 
   <div id="content"> 
    <div>1</div> 
    <div>2</div> 
    <div>3</div> 
    <div>4</div> 
    <div>5</div> 
   </div> 
   <!--右侧滚动条部分--> 
   <div id="sliderWrap"> 
    <div id="slider"> 
      
    </div> 
   </div> 
  </div> 
 </body> 
 <script type="text/javascript"> 
  var wrapDiv = document.getElementById("wrap"); 
  var contentDiv = document.getElementById("content"); 
  var sliderWrap = document.getElementById("sliderWrap"); 
  var slider = document.getElementById("slider"); 
  //设置比例 
  //clientHeight - 不包括border 
  var scale = wrapDiv.clientHeight / contentDiv.clientHeight; 
  //设置滑块的高度 
  var h1 = sliderWrap.clientHeight * scale; 
  //为了合理设置高度,设置滑块的最小高度 
  if (h1 < 50) { 
   h1 = 50; 
  }else if (scale >= 1) { 
   //说明当前内容能过完全显示在可视区域内,不需要滚动条 
   sliderWrap.style.display = "none"; 
  } 
  //设置滑块的高度 
  slider.style.height = h1 +"px"; 
  //设置y轴的增量 
  var y = 0; 
  //为wrap添加滚轮事件 
  wrapDiv.onmousewheel = function(e){ 
   var event1 = event || e 
   if (event.wheelDelta < 0) { 
    //滑动条向下滚动 
    y += 10; 
   }else if (event.wheelDelta > 0) { 
    //滑动条向上滚动 
    y -= 10; 
   } 
   //y变化时说明在滚动,此时使滚动条发生滚动,以及设置content内容部分滚动 
   //判断极端情况,滑块不能划出屏幕 
   if (y <= 0) { 
    //滑块最多滑到顶部 
    y = 0; 
   } 
   if(y >= sliderWrap.clientHeight - slider.clientHeight){ 
    //滑块最多滑到最底部 
    y = sliderWrap.clientHeight - slider.clientHeight; 
   } 
   //更新滑块的位置 
   slider.style.top = y +"px"; 
   scale = wrapDiv.clientHeight / contentDiv.clientHeight; 
   contentDiv.style.top = - y / scale +"px"; 
  } 
 </script> 
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
类似GMAIL的Ajax信息反馈显示
Feb 16 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 Javascript
javascript开发随笔二 动态加载js和文件
Nov 25 Javascript
js中文逗号转英文实现
Feb 11 Javascript
js鼠标点击图片实现随机变换图片的方法
Feb 16 Javascript
JQuery导航菜单选择特效
Apr 11 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
May 31 Javascript
浅谈ES6 模板字符串的具体使用方法
Nov 07 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
Jan 25 Javascript
vue获取当前点击的元素并传值的实例
Mar 09 Javascript
VUE2.0中Jsonp的使用方法
May 22 Javascript
Vue核心概念Action的总结
Jan 18 Javascript
JS HTML图片显示Canvas 压缩功能
Jul 21 #Javascript
JavaScript 用fetch 实现异步下载文件功能
Jul 21 #Javascript
详解vue 模版组件的三种用法
Jul 21 #Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
Jul 21 #Javascript
vue-resource调用promise取数据方式详解
Jul 21 #Javascript
Vue resource中的GET与POST请求的实例代码
Jul 21 #Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
Jul 21 #Javascript
You might like
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
php控制文件下载速度的方法
2015/03/24 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
初步解析Python中的yield函数的用法
2015/04/03 Python
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
python实现简单坦克大战
2020/03/27 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
计算机专业推荐信范文
2013/11/20 职场文书
新学期班主任寄语
2014/01/18 职场文书
运动会800米加油稿
2014/02/22 职场文书
《学会待客》教学反思
2014/02/22 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
武当山导游词
2015/02/03 职场文书
银行催款通知书
2015/04/17 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
Redis 异步机制
2022/05/15 Redis