原生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 相关文章推荐
javascript的对话框详解与参数
Mar 08 Javascript
javascript操作文本框readOnly
May 15 Javascript
js自定义事件及事件交互原理概述(二)
Feb 01 Javascript
jquery.post用法之type设置问题
Feb 24 Javascript
jQuery实现预加载图片的方法
Mar 17 Javascript
jQuery实现日期联动效果实例
Jul 26 Javascript
jquery实用技巧之输入框提示语句
Jul 28 Javascript
js实现上下左右弹框划出效果
Mar 08 Javascript
angular4模块中给标签添加背景图的实现方法
Sep 15 Javascript
Vue2 添加数据可视化支持的方法步骤
Jan 02 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
Mar 03 Javascript
TypeScript 运行时类型检查补充工具
Sep 28 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
PHP4.04简明安装
2006/10/09 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
python实现的阳历转阴历(农历)算法
2014/04/25 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python中元组,列表,字典的区别
2017/05/21 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
python实现密码强度校验
2020/03/18 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
电子商务专业个人的自我评价
2013/11/19 职场文书
旅游个人求职信范文
2014/01/30 职场文书
兽医医药专业求职信
2014/07/27 职场文书
病房管理制度范本
2015/08/06 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
MySQL千万级数据表的优化实战记录
2021/08/04 MySQL