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 相关文章推荐
javascript 简单抽屉效果的实现代码
Mar 09 Javascript
一个轻量级的javascript库 pj介绍
Dec 19 Javascript
jquery调用asp.net 页面后台的实现代码
Apr 27 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
Aug 20 Javascript
JavaScript获取网页表单action属性的方法
Apr 02 Javascript
ECMAScript6中Map/WeakMap详解
Jun 12 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
May 21 Javascript
vue2.0开发实践总结之入门篇
Dec 06 Javascript
JavaScript实现图像模糊化的方法实例
Jan 15 Javascript
js登录滑动验证的实现(不滑动无法登陆)
Jan 03 Javascript
基于vue2.0动态组件及render详解
Mar 17 Javascript
使用typescript快速开发一个cli的实现示例
Dec 09 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
Yii2.0多文件上传实例说明
2017/07/24 PHP
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
jquery实现轮播图特效
2020/04/12 jQuery
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
python自动安装pip
2014/04/24 Python
python中查看变量内存地址的方法
2015/05/05 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
浅谈django的render函数的参数问题
2018/10/16 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
Python的条件锁与事件共享详解
2019/09/12 Python
python3使用GUI统计代码量
2019/09/18 Python
python和php哪个更适合写爬虫
2020/06/22 Python
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
进修护士自我鉴定
2013/10/14 职场文书
大二法英学生职业生涯规划范文
2014/02/27 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
小班幼儿评语大全
2014/04/30 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
自考生自我评价
2019/06/21 职场文书
Java字符串逆序方法详情
2022/03/21 Java/Android