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实例教程(19) 使用HoTMetal(4)
Dec 23 Javascript
关于JavaScript的with 语句的使用方法
May 09 Javascript
Node.js和PHP根据ip获取地理位置的方法
Mar 14 Javascript
jQuery新的事件绑定机制on()示例应用
Jul 18 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
Jun 07 Javascript
详解React Native网络请求fetch简单封装
Aug 10 Javascript
Angularjs单选框相关的示例代码
Aug 17 Javascript
微信小程序使用image组件显示图片的方法【附源码下载】
Dec 08 Javascript
vue使用axios时关于this的指向问题详解
Dec 22 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 Javascript
Layui弹出层 加载 做编辑页面的方法
Sep 16 Javascript
如何实现iframe父子传参通信
Feb 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
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
php数组的一些常见操作汇总
2011/07/17 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
php实现对象克隆的方法
2015/06/20 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
python将.ppm格式图片转换成.jpg格式文件的方法
2018/10/27 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
Python中包的用法及安装
2020/02/11 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
冰淇淋店创业计划书范文
2013/12/27 职场文书
简历的自我评价
2014/02/03 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
校园文化标语
2014/06/18 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
网络管理员岗位职责
2015/02/12 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书