原生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 相关文章推荐
用jscript实现列出安装的软件列表
Jun 18 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
Jan 15 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
Apr 21 Javascript
DOM基础教程之使用DOM设置文本框
Jan 20 Javascript
javascript自定义in_array()函数实现方法
Aug 03 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
Jun 28 Javascript
浅谈js算法和流程控制
Dec 29 Javascript
JS实现图片放大缩小的方法
Feb 15 Javascript
Bootstrap导航中表单简单实现代码
Mar 06 Javascript
angularJS1 url中携带参数的获取方法
Oct 09 Javascript
微信小程序使用npm支持踩坑
Nov 07 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
截获网站title标签之家内容的例子
2006/10/09 PHP
PHP基础学习小结
2011/04/17 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
php mysql 封装类实例代码
2016/09/18 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
Vue 父子组件、组件间通信
2017/03/08 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
js防抖和节流的深入讲解
2018/12/06 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
python制作一个桌面便签软件
2015/08/09 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
司机的工作范围及职责
2013/11/13 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
赡养老人协议书
2014/04/21 职场文书
班组长安全工作职责
2014/07/15 职场文书
三峡导游词
2015/01/31 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
单方投资意向书
2015/05/11 职场文书
原告离婚代理词
2015/05/23 职场文书
家长通知书家长意见
2015/06/03 职场文书