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 题型问答有答案参考
Feb 17 Javascript
ext 列表页面关于多行查询的办法
Mar 25 Javascript
jQuery find和children方法使用
Jan 31 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
Aug 22 Javascript
JS获取随机数函数可自定义最小值最大值
May 08 Javascript
Node.js 实现简单的接口服务器的实例代码
May 23 Javascript
Angularjs上传文件组件flowjs功能
Aug 07 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
微信小程序实现的一键复制功能示例
Apr 24 Javascript
一文了解Vue中的nextTick
May 06 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
May 07 Javascript
使用jquery实现轮播图效果
Jan 02 jQuery
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网站的几个实用要点
2014/12/30 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
php创建图像具体步骤
2017/03/13 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
Python六大开源框架对比
2015/10/19 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
python后端接收前端回传的文件方法
2019/01/02 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
小学教育毕业生自荐信
2013/11/18 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
六月份红领巾广播稿
2014/02/03 职场文书
2014年转正工作总结
2014/11/08 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL
Go语言怎么使用变长参数函数
2022/07/15 Golang