原生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入门—JQuery程序的代码风格详细介绍
Jan 03 Javascript
jQuery实现密保互斥问题解决方案
Aug 16 Javascript
jQuery响应enter键的实现思路
Apr 18 Javascript
js 动态为textbox添加下拉框数据源的方法
Apr 24 Javascript
js正则表达式replace替换变量方法
May 21 Javascript
微信小程序 教程之WXML
Oct 18 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
Sep 12 Javascript
10个经典的网页鼠标特效代码
Jan 09 Javascript
js canvas实现二维码和图片合成的海报
Nov 19 Javascript
一文快速详解前端框架 Vue 最强大的功能
May 21 Javascript
对layui中的onevent 和event的使用详解
Sep 06 Javascript
Vue设置长时间未操作登录自动到期返回登录页
Jan 22 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中strtotime函数使用方法分享
2012/01/10 PHP
PHP插入排序实现代码
2013/04/04 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python+django快速实现文件上传
2016/10/24 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
python编程线性回归代码示例
2017/12/07 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
出国留学自荐信
2013/10/25 职场文书
幼儿园保育员辞职信
2014/01/12 职场文书
大学学风建设方案
2014/05/04 职场文书
公司聚餐通知
2015/04/22 职场文书
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技