原生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 相关文章推荐
jquery 查找select ,并触发事件的实现代码
Mar 30 Javascript
Jquery带搜索框的下拉菜单
May 06 Javascript
HTML5之lang属性与dir属性的详解
Jun 19 Javascript
5款JavaScript代码压缩工具推荐
Jul 07 Javascript
JavaScript中数据结构与算法(三):链表
Jun 19 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 Javascript
JS简单实现仿百度控制台输出信息效果
Sep 04 Javascript
bootstrap手风琴制作方法详解
Jan 11 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
Oct 08 Javascript
angular 服务的单例模式(依赖注入模式下)详解
Oct 22 Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
Feb 13 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实现简单加入购物车功能
2017/03/07 PHP
PHP chop()函数讲解
2019/02/11 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
js控制table合并具体实现
2014/02/20 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
使用node-media-server搭建一个简易的流媒体服务器
2021/01/20 Javascript
python绘图方法实例入门
2015/05/19 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
python实现websocket的客户端压力测试
2019/06/25 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
python中pyplot基础图标函数整理
2020/11/10 Python
高一历史教学反思
2014/01/13 职场文书
企业消防安全制度
2014/02/02 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
生活委员竞选稿
2015/11/21 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL
Python基于百度API识别并提取图片中文字
2021/06/27 Python