原生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入门教程(6) Window窗口对象
Jan 31 Javascript
jquery的键盘事件修改代码
Feb 24 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 Javascript
Javascript动态引用CSS文件的2种方法介绍
Jun 06 Javascript
JQuery中解决重复动画的方法
Oct 17 Javascript
Javascript中的prototype与继承
Feb 06 Javascript
Angular 4环境准备与Angular cli创建项目详解
May 27 Javascript
基于Vuex无法观察到值变化的解决方法
Mar 01 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
Aug 31 Javascript
vue-cli中安装方法(图文详细步骤)
Dec 12 Javascript
vue实例的选项总结
Jun 09 Javascript
springboot+vue实现文件上传下载
Nov 17 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
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
python fabric实现远程部署
2017/01/05 Python
Python实现登录接口的示例代码
2017/07/21 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
基于python的字节编译详解
2017/09/20 Python
Python实现简易Web爬虫详解
2018/01/03 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
wxPython实现画图板
2020/08/27 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
代收款委托书范本
2014/10/01 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
安全先进个人材料
2014/12/29 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
Java异常体系非正常停止和分类
2022/06/14 Java/Android