JS模拟简易滚动条效果代码(附demo源码)


Posted in Javascript onApril 05, 2016

本文实例讲述了JS模拟简易滚动条效果的方法。分享给大家供大家参考,具体如下:

使用Js模拟滚动条。简易模式,类似手机上常见的滚动条。

效果如下:

JS模拟简易滚动条效果代码(附demo源码)

Js代码如下:

var scrollMoveObj = null, scrollPageY = 0, scrollY = 0;
var scrollDivList = new Array();
// obj需要添加滚动条的对象 w滚动条宽度 className滚动条样式名称
// obj元素 必须指定高度,并设置overflow:hidden;
// 如要兼容IE6 必须给obj元素 指定 overflow:hidden; 
function jsScroll(obj, w, className)
{
  if(typeof(obj) == 'string')  {
    obj = document.getElementById(obj);
  }
  //当内容未超出现在高度时,不添加滚动条  
  if(!obj || obj.scrollHeight <= obj.clientHeight || obj.clientHeight == 0) {
    return;
  }
  obj.scrollBarWidth = w||6;
  obj.style.overflow = 'hidden';
  obj.scrollBar = document.createElement('div');
  document.body.appendChild(obj.scrollBar);
  obj.scrollBarIndex = document.createElement('div');
  obj.scrollBar.appendChild(obj.scrollBarIndex);
  obj.scrollBar.style.position = 'absolute';
  obj.scrollBarIndex.style.position = 'absolute';
  obj.scrollBar.className = className || '';
  if(!className) {
    obj.scrollBar.style.backgroundColor = '#ddd';
    obj.scrollBarIndex.style.backgroundColor = '#aaa';
  }
  scrollDivList.push(obj);
  scrollResetSize(obj);
  //使用鼠标滚轮滚动
  obj.scrollBar.scrollDiv = obj;
  obj.scrollBarIndex.scrollDiv = obj;
  obj.onmousewheel = scrollMove;
  obj.scrollBar.onmousewheel = scrollMove;
  obj.scrollBarIndex.onmousewheel = scrollMove;
  //拖动滚动条滚动
  obj.scrollBarIndex.onmousedown = function(evt){
    evt = evt || event;
    scrollPageY = evt.clientY;
    scrollY = this.scrollDiv.scrollTop;
    isScrollMove = true;
    document.body.onselectstart = function(){return false};
    scrollMoveObj = this.scrollDiv;
    if(this.scrollDiv.scrollBar.className == '') {
      this.scrollDiv.scrollBarIndex.style.backgroundColor = '#888';
    }
    return false;
  }
}
//当页面大小发生变化时,重新计算滚动条位置
window.onresize = function(){
  for(var i=0; i<scrollDivList.length; i++) {
    scrollResetSize(scrollDivList[i]);
  }
}
//计算滚动条位置
function scrollResetSize(o) {
  if(o.scrollHeight <= o.clientHeight) {
    o.scrollTop = 0;
    o.scrollBar.style.display = 'none';
  } else {
    o.scrollBar.style.display = 'block';
  }
  var x=0, y=0;
  var p = o;
  while(p) {
    x += p.offsetLeft;
    y += p.offsetTop;
    p = p.offsetParent;
  }
  var borderTop = parseInt(o.style.borderTopWidth||0);
  var borderBottom = parseInt(o.style.borderBottomWidth||0);
  o.scrollBar.style.width = o.scrollBarWidth + 'px';
  o.scrollBar.style.height = o.clientHeight + 'px';
  o.scrollBar.style.top = y + borderTop + 'px';
  o.scrollBar.style.left = x + o.offsetWidth - o.scrollBarWidth + 'px';
  o.scrollBarIndex.style.width = o.scrollBarWidth + 'px';
  var h = o.clientHeight - (o.scrollHeight - o.clientHeight);
  //当滚动条滑块最小20个像素
  if(h < 20) {
    h = 20;
  }
  o.scrollBarHeight = h;
  o.scrollBarIndex.style.height = h + 'px';
  o.scrollBarIndex.style.left = '0px';
  setScrollPosition(o);
}
function setScrollPosition(o) {
  o.scrollBarIndex.style.top = (o.clientHeight - o.scrollBarHeight) * o.scrollTop / (o.scrollHeight - o.clientHeight) + 'px';
}
document.documentElement.onmousemove = function(evt){
  if(!scrollMoveObj)return;
  evt = evt || event;
  var per = (scrollMoveObj.scrollHeight - scrollMoveObj.clientHeight) / (scrollMoveObj.clientHeight - scrollMoveObj.scrollBarHeight)
  scrollMoveObj.scrollTop = scrollY - (scrollPageY - evt.clientY) * per;
  setScrollPosition(scrollMoveObj);
}
document.documentElement.onmouseup = function(evt){
  if(!scrollMoveObj)return;
  if(scrollMoveObj.scrollBar.className == '') {
    scrollMoveObj.scrollBarIndex.style.backgroundColor = '#aaa';
  }
  scrollMoveObj = null;
  document.body.onselectstart = function(){return true};
}
// 鼠标滚轮滚动
function scrollMove(evt){
  var div = this.scrollDiv || this;
  if(div.scrollHeight <= div.clientHeight) return true;
  evt = evt || event;
  var step = 20;
  if(evt.wheelDelta < 0) {
    if(div.scrollTop >= (div.scrollHeight - div.clientHeight)) return true;
    div.scrollTop += step;
  } else {
    if(div.scrollTop == 0) return true;
    div.scrollTop -= step;
  }
  setScrollPosition(div);
  return false;
}

完整实例代码点击此处本站下载。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
May 14 Javascript
JavaScript 更严格的相等 [译]
Sep 20 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
Jan 26 Javascript
javascript跨域的4种方法和原理详解
Apr 08 Javascript
jQuery 插件开发指南
Nov 14 Javascript
javascript实现密码强度显示
Mar 18 Javascript
jquery网页日历显示控件calendar3.1使用详解
Nov 24 Javascript
Angular 4.x中表单Reactive Forms详解
Apr 25 Javascript
Angular 作用域scope的具体使用
Dec 11 Javascript
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 jQuery
EasyUI 数据表格datagrid列自适应内容宽度的实现
Jul 18 Javascript
koa2的中间件功能及应用示例
Mar 05 Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 #Javascript
javascript HTML5 canvas实现打砖块游戏
Jun 18 #Javascript
jQuery EasyUI中DataGird动态生成列的方法
Apr 05 #Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 #Javascript
JS简单编号生成器实现方法(附demo源码下载)
Apr 05 #Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
Apr 05 #Javascript
JavaScript图像延迟加载库Echo.js
Apr 05 #Javascript
You might like
php防攻击代码升级版
2010/12/29 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
Zend Framework使用Zend_Loader组件动态加载文件和类用法详解
2016/12/09 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
python基于SMTP协议发送邮件
2019/05/31 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
大家检讨书5000字
2014/02/03 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
春节晚会开场白
2015/05/29 职场文书
预备党员考察意见范文
2015/06/01 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书