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 定时器调用传递参数的方法
Nov 12 Javascript
JavaScript类和继承 prototype属性
Sep 03 Javascript
20个最新的jQuery插件
Jan 13 Javascript
Node.js开发之访问Redis数据库教程
Jan 14 Javascript
javascript实现按回车键切换焦点
Feb 09 Javascript
jquery判断类型是不是number类型的实例代码
Oct 07 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
设置jquery UI 控件的大小方法
Dec 12 Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 Javascript
在vue项目中使用md5加密的方法
Sep 14 Javascript
微信公众平台 发送模板消息(Java接口开发)
Apr 17 Javascript
分享一个vue实现的记事本功能案例
Apr 11 Vue.js
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下载远程文件类(支持断点续传)
2008/11/14 PHP
PHP 反向排序和随机排序代码
2010/06/30 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
YII框架中搜索分页jQuery写法详解
2016/12/19 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
Python算法之栈(stack)的实现
2014/08/18 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
python获取array中指定元素的示例
2019/11/26 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
大学生就业自荐书
2014/06/16 职场文书
领导参观欢迎词
2015/01/26 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
公司慰问信范文
2015/03/23 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis