原生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 相关文章推荐
网页里控制图片大小的相关代码
Jun 13 Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
May 25 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
Dec 09 Javascript
JS 毫秒转时间示例代码
Sep 22 Javascript
JS获取select-option-text_value的方法
Dec 26 Javascript
js构造函数、索引数组和属性的实现方式和使用
Nov 16 Javascript
JavaScript 里的类数组对象
Apr 08 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
ES6学习之变量的两种命名方法示例
Jul 18 Javascript
JavaScript for循环 if判断语句(学习笔记)
Oct 11 Javascript
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
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
关于PHP5 Session生命周期介绍
2010/03/02 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
php查询ip所在地的方法
2014/12/05 PHP
php内嵌函数用法实例
2015/03/20 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
我的javascript 函数链之演变
2011/04/07 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
Angular4表单验证代码详解
2017/09/03 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
python处理大数字的方法
2015/05/27 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
python绘制地震散点图
2019/06/18 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
vscode调试django项目的方法
2020/08/06 Python
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
酒店开业策划方案
2014/06/02 职场文书
我的中国梦口号
2014/06/16 职场文书
先进党组织事迹材料
2014/12/26 职场文书
大学生在校表现评语
2014/12/31 职场文书
故宫英文导游词
2015/01/31 职场文书
承诺书范本大全
2015/05/04 职场文书
元旦晚会开场白
2015/05/29 职场文书