原生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 &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
Jun 02 Javascript
jQuery中:lt选择器用法实例
Dec 29 Javascript
js使用DOM操作实现简单留言板的方法
Apr 10 Javascript
详解vuejs几种不同组件(页面)间传值的方式
Jun 01 Javascript
[js高手之路]寄生组合式继承的优势详解
Aug 28 Javascript
EasyUI实现下拉框多选功能
Nov 07 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
JavaScript 有用的代码片段和 trick
Feb 22 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
Dec 09 Javascript
bootstrap实现嵌套模态框的实例代码
Jan 10 Javascript
js对象属性名驼峰式转下划线的实例代码
Sep 17 Javascript
一篇文章学会Vue中间件管道
Jun 20 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
PHP4中session登录页面的应用
2008/07/25 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
PDO::inTransaction讲解
2019/01/28 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
Python 创建空的list,以及append用法讲解
2018/05/04 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
python实现合并两个排序的链表
2019/03/03 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
dpn网络的pytorch实现方式
2020/01/14 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
怎样有效的进行自我评价
2013/10/06 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
服务理念口号
2014/06/11 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
无线电知识基础入门篇
2022/02/18 无线电