原生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 相关文章推荐
给网站上的广告“加速”显示的方法
Apr 08 Javascript
Javascript学习笔记8 用JSON做原型
Jan 11 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
Jan 08 Javascript
javascript 45种缓动效果 非常酷
Jun 28 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
Nov 21 Javascript
jquery设置按钮停顿3秒不可用
Mar 07 Javascript
javascript制作游戏开发碰撞检测的封装代码
Mar 31 Javascript
基于JS实现翻书效果的页面切换样式
Feb 16 Javascript
Angularjs中的ui-bootstrap的使用教程
Feb 19 Javascript
JS实现带动画的回到顶部效果
Dec 28 Javascript
JS实现随机抽选获奖者
Nov 07 Javascript
vue+iview实现手机号分段输入框
Mar 25 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
JavaScript的eval JSON object问题
2009/11/15 Javascript
js读取本地excel文档数据的代码
2010/11/11 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
ExpressJS入门实例
2015/01/14 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
Python使用django获取用户IP地址的方法
2015/05/11 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
Python hmac模块使用实例解析
2019/12/24 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
公务员的自我鉴定
2013/10/26 职场文书
自我鉴定书面格式
2014/01/13 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
三孔导游词
2015/02/05 职场文书
写给老婆的保证书
2015/02/27 职场文书
党员个人自我评价
2015/03/03 职场文书
小学教代会开幕词
2016/03/04 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android