基于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 相关文章推荐
跟我一起学写jQuery插件开发方法(附完整实例及下载)
Apr 01 Javascript
jQuery学习笔记之Helloworld
Dec 22 Javascript
通过js获取div的background-image属性
Oct 15 Javascript
javascript常用方法汇总
Dec 02 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
Aug 22 Javascript
jquery+json实现动态商品内容展示的方法
Jan 14 Javascript
基于Vue实现timepicker
Apr 25 Javascript
JavaScript如何实现元素全排列实例代码
May 14 Javascript
vuejs移动端实现div拖拽移动
Jul 25 Javascript
在vue中高德地图引入和轨迹的绘制的实现
Oct 11 Javascript
关于vue里页面的缓存详解
Nov 04 Javascript
BootstrapValidator验证用户名已存在(ajax)
Nov 08 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模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
浅谈node模块与npm包管理工具
2018/01/03 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
深入理解Python中的*重复运算符
2017/10/28 Python
Python中scatter函数参数及用法详解
2017/11/08 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
浅谈Pycharm调用同级目录下的py脚本bug
2018/12/03 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
Python当中的array数组对象实例详解
2019/06/12 Python
pandas 空数据处理方法详解
2019/11/02 Python
基于keras中的回调函数用法说明
2020/06/17 Python
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
中专自荐信
2013/10/13 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript
源码分析Redis中 set 和 sorted set 的使用方法
2022/03/22 Redis
Golang 结构体数据集合
2022/04/22 Golang