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 相关文章推荐
jquery通过select列表选择框对表格数据进行过滤示例
May 07 Javascript
jQuery中ajax的load()方法用法实例
Dec 26 Javascript
JavaScript函数使用的基本教程
Jun 04 Javascript
tuzhu_req.js 实现仿百度图片首页效果
Aug 11 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
利用vue.js插入dom节点的方法
Mar 15 Javascript
JavaScript中清空数组的三种方式
Mar 22 Javascript
JS实现针对给定时间的倒计时功能示例
Apr 11 Javascript
React Native使用fetch实现图片上传的示例代码
Mar 07 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
基于Web Audio API实现音频可视化效果
Jun 12 Javascript
微信小程序绘制半圆(弧形)进度条
Nov 18 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
让PHP COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
ThinkPHP之getField详解
2014/06/20 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
Jquery遍历checkbox获取选中项value值的方法
2014/02/13 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
js 颜色选择插件
2017/01/23 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
物业客服专员岗位职责
2015/04/07 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript