基于JavaScript实现自定义滚动条


Posted in Javascript onJanuary 25, 2017

可直接使用的js滚动条,先看看效果图:

基于JavaScript实现自定义滚动条

代码如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>自定义滚动条</title>
</head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>滚动条</title>
<style type="text/css">
*{ margin:0; padding:0;}
#mainBox{ 
 width:400px; 
 height:500px; 
 border:1px #bbb solid; 
 position:relative; 
 overflow:hidden;
  margin:50px auto;
 }
#content{ 
 height:2500px; 
 position:absolute; 
 left:0; 
 top:0; 
 background:url(https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1485320653275&di=b7bc29cc2c7b3388d44958d8f97db0a3&imgtype=0&src=http%3A%2F%2Fphotocdn.sohu.com%2F20151212%2Fmp48094209_1449905365456_7.jpg) 
}
.scrollDiv{
 width:18px; 
 position:absolute; 
 top:0; 
 background:#666;
 border-radius:10px;
}
</style>
</head>
<body>
<div id="mainBox">
 <div id="content"></div>
</div>
<script type="text/javascript">
var doc=document;
var _wheelData=-1;
var mainBox=doc.getElementById('mainBox');
function bind(obj,type,handler){
 var node=typeof obj=="string"?$(obj):obj;
 if(node.addEventListener){
 node.addEventListener(type,handler,false);
 }else if(node.attachEvent){
 node.attachEvent('on'+type,handler);
 }else{
 node['on'+type]=handler;
 }
}
function mouseWheel(obj,handler){
 var node=typeof obj=="string"?$(obj):obj;
 bind(node,'mousewheel',function(event){
 var data=-getWheelData(event);
 handler(data);
 if(document.all){
 window.event.returnValue=false;
 }else{
 event.preventDefault();
 }
 });
 //火狐
 bind(node,'DOMMouseScroll',function(event){
 var data=getWheelData(event);
 handler(data);
 event.preventDefault();
 });
 function getWheelData(event){
 var e=event||window.event;
 return e.wheelDelta?e.wheelDelta:e.detail*40;
 }
}
function addScroll(){
 this.init.apply(this,arguments);
}
addScroll.prototype={
 init:function(mainBox,contentBox,className){
 var mainBox=doc.getElementById(mainBox);
 var contentBox=doc.getElementById(contentBox);
 var scrollDiv=this._createScroll(mainBox,className);
 this._resizeScorll(scrollDiv,mainBox,contentBox);
 this._tragScroll(scrollDiv,mainBox,contentBox);
 this._wheelChange(scrollDiv,mainBox,contentBox);
 this._clickScroll(scrollDiv,mainBox,contentBox);
 },
 //创建滚动条
 _createScroll:function(mainBox,className){
 var _scrollBox=doc.createElement('div')
 var _scroll=doc.createElement('div');
 var span=doc.createElement('span');
 _scrollBox.appendChild(_scroll);
 _scroll.appendChild(span);
 _scroll.className=className;
 mainBox.appendChild(_scrollBox);
 return _scroll;
 },
 //调整滚动条
 _resizeScorll:function(element,mainBox,contentBox){
 var p=element.parentNode;
 var conHeight=contentBox.offsetHeight;
 var _width=mainBox.clientWidth;
 var _height=mainBox.clientHeight;
 var _scrollWidth=element.offsetWidth;
 var _left=_width-_scrollWidth;
 p.style.width=_scrollWidth+"px";
 p.style.height=_height+"px";
 p.style.left=_left+"px";
 p.style.position="absolute";
 p.style.background="#ccc";
 contentBox.style.width=(mainBox.offsetWidth-_scrollWidth)+"px";
 var _scrollHeight=parseInt(_height*(_height/conHeight));
 if(_scrollHeight>=mainBox.clientHeight){
 element.parentNode.style.display="none";
 }
 element.style.height=_scrollHeight+"px";
 },
 //拖动滚动条
 _tragScroll:function(element,mainBox,contentBox){
 var mainHeight=mainBox.clientHeight;
 element.onmousedown=function(event){
 var _this=this;
 var _scrollTop=element.offsetTop;
 var e=event||window.event;
 var top=e.clientY;
 //this.onmousemove=scrollGo;
 document.onmousemove=scrollGo;
 document.onmouseup=function(event){
 this.onmousemove=null;
 }
 function scrollGo(event){
 var e=event||window.event;
 var _top=e.clientY;
 var _t=_top-top+_scrollTop;
 if(_t>(mainHeight-element.offsetHeight)){
  _t=mainHeight-element.offsetHeight;
 }
 if(_t<=0){
  _t=0;
 }
 element.style.top=_t+"px";
 contentBox.style.top=-_t*(contentBox.offsetHeight/mainBox.offsetHeight)+"px";
 _wheelData=_t;
 }
 }
 element.onmouseover=function(){
 this.style.background="#444"; 
 }
 element.onmouseout=function(){
 this.style.background="#666"; 
 }
 },
 //鼠标滚轮滚动,滚动条滚动
 _wheelChange:function(element,mainBox,contentBox){
 var node=typeof mainBox=="string"?$(mainBox):mainBox;
 var flag=0,rate=0,wheelFlag=0;
 if(node){
 mouseWheel(node,function(data){
 wheelFlag+=data;
 if(_wheelData>=0){
  flag=_wheelData;
  element.style.top=flag+"px";
  wheelFlag=_wheelData*12;
  _wheelData=-1;
 }else{
  flag=wheelFlag/12;
 }
 if(flag<=0){
  flag=0;
  wheelFlag=0;
 }
 if(flag>=(mainBox.offsetHeight-element.offsetHeight)){
  flag=(mainBox.clientHeight-element.offsetHeight);
  wheelFlag=(mainBox.clientHeight-element.offsetHeight)*12;
 }
 element.style.top=flag+"px";
 contentBox.style.top=-flag*(contentBox.offsetHeight/mainBox.offsetHeight)+"px";
 });
 }
 },
 _clickScroll:function(element,mainBox,contentBox){
 var p=element.parentNode;
 p.onclick=function(event){
 var e=event||window.event;
 var t=e.target||e.srcElement;
 var sTop=document.documentElement.scrollTop>0?document.documentElement.scrollTop:document.body.scrollTop;
 var top=mainBox.offsetTop;
 var _top=e.clientY+sTop-top-element.offsetHeight/2;
 if(_top<=0){
 _top=0;
 }
 if(_top>=(mainBox.clientHeight-element.offsetHeight)){
 _top=mainBox.clientHeight-element.offsetHeight;
 }
 if(t!=element){
 element.style.top=_top+"px";
 contentBox.style.top=-_top*(contentBox.offsetHeight/mainBox.offsetHeight)+"px";
 _wheelData=_top;
 }
 }
 }
}

new addScroll('mainBox','content','scrollDiv');
</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Ajax+Json 级联菜单实现代码
Oct 27 Javascript
通过百度地图获取公交线路的站点坐标的js代码
May 11 Javascript
jQuery.buildFragment使用方法及思路分析
Jan 07 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
Jan 23 Javascript
jQuery实现点击该行即可删除HTML表格行
Oct 17 Javascript
Bootstrap模态框调用功能实现方法
Sep 19 Javascript
BootStrap与Select2使用小结
Feb 17 Javascript
深入理解Node.js中的进程管理
Mar 13 Javascript
jQuery中 DOM节点操作方法大全
Oct 12 jQuery
js使用swiper实现层叠轮播效果实例代码
Dec 12 Javascript
浅谈Fetch 数据交互方式
Dec 20 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
Jun 05 Javascript
基于javascript实现数字英文验证码
Jan 25 #Javascript
js阻止移动端页面滚动的两种方法
Jan 25 #Javascript
servlet+jquery实现文件上传进度条示例代码
Jan 25 #Javascript
json数据处理及数据绑定
Jan 25 #Javascript
详解jQuery中ajax.load()方法
Jan 25 #Javascript
js实现鼠标左右移动,图片也跟着移动效果
Jan 25 #Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
Jan 25 #Javascript
You might like
PHP:风雨欲来 路在何方?
2006/10/09 PHP
获取远程文件大小的php函数
2010/01/11 PHP
mayfish 数据入库验证代码
2010/04/30 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
[50:50]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.20
2020/12/23 DOTA
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
Python记录详细调用堆栈日志的方法
2015/05/05 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
Python count函数使用方法实例解析
2020/03/23 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
小学生自我评价范例
2013/09/24 职场文书
国际贸易专业推荐信
2013/11/15 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
总结Python变量的相关知识
2021/06/28 Python
SQL SERVER中的流程控制语句
2022/05/25 SQL Server
python双向链表实例详解
2022/05/25 Python