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 相关文章推荐
js tab 选项卡
Apr 26 Javascript
js 蒙版进度条(结合图片)
Mar 10 Javascript
原生js实现给指定元素的后面追加内容
Apr 10 Javascript
js 处理数组重复元素示例代码
Dec 27 Javascript
微信JSSDK上传图片
Aug 23 Javascript
属于你的jQuery提示框(Tip)插件
Jan 20 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
Jan 21 Javascript
基于Turn.js 实现翻书效果实例解析
Jun 20 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
Dec 12 Javascript
bootstrap table表格插件使用详解
May 08 Javascript
简单谈谈关于 npm 5.0 的新坑
Jun 08 Javascript
d3.js实现自定义多y轴折线图的示例代码
May 30 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
如何设置mysql允许外网访问
2013/06/04 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
分享php邮件管理器源码
2016/01/06 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
给Python入门者的一些编程建议
2015/06/15 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
2014年健康教育实施方案
2014/02/17 职场文书
厂长岗位职责
2014/02/19 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
现金出纳岗位职责
2014/03/15 职场文书
大学班级文化建设方案
2014/05/06 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
MySQL修炼之联结与集合浅析
2021/10/05 MySQL