基于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 相关文章推荐
JavaScript 数组循环引起的思考
Jan 01 Javascript
js 图片等比例缩放代码
May 13 Javascript
window.name代替cookie的实现代码
Nov 28 Javascript
jQuery 无刷新分页实例代码
Nov 12 Javascript
详解addEventListener的三个参数之useCapture
Mar 16 Javascript
JS动态修改iframe高度和宽度的方法
Apr 01 Javascript
借助node实战JSONP跨域实例
Mar 30 Javascript
bmob js-sdk 在vue中的使用教程
Jan 21 Javascript
详解Chai.js断言库API中文文档
Jan 31 Javascript
深入学习Vue nextTick的用法及原理
Oct 08 Javascript
vue 内联样式style中的background用法说明
Aug 05 Javascript
原生js实现移动小球(碰撞检测)
Dec 17 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数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
php 不使用js实现页面跳转
2014/02/11 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
jQuery分组选择器用法实例
2014/12/23 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
javascript+HTML5 canvas绘制时钟功能示例
2019/05/15 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
对vue生命周期的深入理解
2020/12/03 Vue.js
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
给同学的道歉信
2014/01/16 职场文书
高二生物教学反思
2014/01/27 职场文书
访谈节目策划方案
2014/05/15 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
新员工入职感想
2015/08/07 职场文书
高三数学教学反思
2016/02/18 职场文书