javascript封装自定义滚动条方法,可自定义四个边框滚动条
还是根据我的个人习惯封装了一个方法 setScroll({ box :父盒子DOM对象, content : 内容盒子DOM对象, scrollall : 滚动条大盒子DOM对象, scroll : 滚动条DOM对象, direction: 垂直滚动条还是水平滚动条 }) 该方法传入一个object,前四个属性必选,最后一个可选,‘vertical’ || ‘’level" ,默认vertical. html结构 最大盒子>(内容盒子+(滚动条盒子>滚动条)) 样式自己编写即可。 下来是js源码
| 0 | var setScroll = function(obj){ |
| 1 | |
| 2 | //初始化参数 |
| 3 | var box = obj.box, |
| 4 | content = obj.content, |
| 5 | scrollall = obj.scrollall, |
| 6 | scroll = obj.scroll; |
| 7 | direction = obj.direction || 'vertical'; |
| 8 | |
| 9 | //全局变量记录 |
| 10 | var startPosition, |
| 11 | scrTop = 0, |
| 12 | currentTop = 0; |
| 13 | |
| 14 | //初始化配置参数 |
| 15 | var getwh,wh,dier,tl,page; |
| 16 | |
| 17 | if(direction == 'vertical'){ |
| 18 | getwh = 'offsetHeight'; |
| 19 | wh = 'height'; |
| 20 | dier = 'top'; |
| 21 | tl = 'offsetTop'; |
| 22 | page = 'pageY'; |
| 23 | }else{ |
| 24 | getwh = 'offsetWidth'; |
| 25 | wh = 'width'; |
| 26 | dier = 'left'; |
| 27 | tl = 'offsetLeft'; |
| 28 | page = 'pageX'; |
| 29 | } |
| 30 | |
| 31 | var boxHeight = box[getwh], |
| 32 | contentHeight = content[getwh]; |
| 33 | |
| 34 | |
| 35 | |
| 36 | //初始化样式 |
| 37 | |
| 38 | scroll.style[wh] = (boxHeight / contentHeight * boxHeight) + 'px'; |
| 39 | |
| 40 | |
| 41 | var mousein = function (event){ |
| 42 | |
| 43 | event = event || window.event; |
| 44 | |
| 45 | var scrTop = event[page] - box[tl] - startPosition; |
| 46 | |
| 47 | window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); |
| 48 | |
| 49 | scrTop = scrTop < 0 ? 0 : scrTop; |
| 50 | scrTop = scrTop > boxHeight - scroll[getwh] ? boxHeight - scroll[getwh] : scrTop; |
| 51 | |
| 52 | currentTop = -scrTop / boxHeight * contentHeight; |
| 53 | |
| 54 | scroll.style[dier] = scrTop + 'px'; |
| 55 | |
| 56 | content.style[dier] = currentTop + 'px'; |
| 57 | |
| 58 | } |
| 59 | |
| 60 | |
| 61 | //鼠标按下,开始拖动 |
| 62 | scroll.addEventListener('mousedown',function(event){ |
| 63 | |
| 64 | event = event || window.event; |
| 65 | |
| 66 | //记录当前鼠标点击位置距离父盒子顶部的距离 |
| 67 | startPosition = event.offsetY; |
| 68 | |
| 69 | document.addEventListener('mousemove',mousein); |
| 70 | |
| 71 | }) |
| 72 | |
| 73 | |
| 74 | document.addEventListener('mouseup',function(){ |
| 75 | |
| 76 | document.removeEventListener('mousemove',mousein,false); |
| 77 | |
| 78 | }) |
| 79 | |
| 80 | box.addEventListener('mousewheel',boxscroll); |
| 81 | |
| 82 | box.addEventListener('DOMMouseScroll',boxscroll,false); |
| 83 | |
| 84 | function boxscroll(event){ |
| 85 | |
| 86 | event = event || window.event; |
| 87 | |
| 88 | if(event.wheelDelta){ |
| 89 | |
| 90 | if(-event.wheelDelta / 120 > 0){ |
| 91 | |
| 92 | scrTop = scroll[tl] + -event.wheelDelta / 120 + 4; |
| 93 | |
| 94 | }else{ |
| 95 | |
| 96 | scrTop = scroll[tl] + -event.wheelDelta / 120 - 4; |
| 97 | |
| 98 | } |
| 99 | |
| 100 | }else{ |
| 101 | |
| 102 | if(event.detail / 3 > 0){ |
| 103 | |
| 104 | scrTop = scroll[tl] + event.detail / 3 + 4; |
| 105 | |
| 106 | }else{ |
| 107 | |
| 108 | scrTop = scroll[tl] + event.detail / 3 - 4; |
| 109 | |
| 110 | } |
| 111 | |
| 112 | } |
| 113 | |
| 114 | currentTop = -scrTop / boxHeight * contentHeight; |
| 115 | |
| 116 | scrTop = scrTop < 0 ? 0 : scrTop; |
| 117 | scrTop = scrTop > boxHeight - scroll[getwh] ? boxHeight - scroll[getwh] : scrTop; |
| 118 | |
| 119 | currentTop = currentTop > 0 ? 0 : currentTop; |
| 120 | currentTop = currentTop < -(contentHeight - boxHeight) ? -(contentHeight - boxHeight) : currentTop; |
| 121 | |
| 122 | |
| 123 | scroll.style[dier] = scrTop + 'px'; |
| 124 | |
| 125 | content.style[dier] = currentTop + 'px'; |
| 126 | event.preventDefault(); |
| 127 | }}; |
在线运行地址可以查看源码分析 scrollJS下载地址
javascript封装自定义滚动条方法,可自定义四个边框滚动条的更多相关文章
- 牛客网Java刷题知识点之字符流缓冲区、BufferedWriter、BufferedReader、BufferedReader-readLine方法原理、自定义MyBufferedReader-read方法、自定义MyBufferedReader-readLine方法
不多说,直接上干货! 把提高效率的动作,封装成一个对象.即把缓冲区封装成一个对象. 就是在一个类里封装一个数组,能对流锁操作数据进行缓存. 什么是字符流缓冲区? 善于使用字符流缓冲区,减轻负担,提高下 ...
- Javascript和jquery事件--滚动条事件和自定义滚动条事件样式
很想把滚动条事件跟鼠标滚轮事件放在一起,那就直接写在这一篇了.除了事件以外,对滚动条样式的调整也记在这里吧. 滚动条是浏览器的默认事件,使用overflow:auto/scroll都有可能出现,它的默 ...
- Jquery自定义扩展方法(二)--HTML日历控件
一.概述 研究了上节的Jquery自定义扩展方法,自己一直想做用jquery写一个小的插件,工作中也用到了用JQuery的日历插件,自己琢磨着去造个轮子--HTML5手机网页日历控件,废话不多说,先看 ...
- Jquery自定义扩展方法(一)
jquery是一款流行的JS框架,自定义JS方法,封装到Jquery中,调用起来也挺方便的,怎么写Jquery扩展方法那,网上翻阅了一部分代码,其实也挺简单的: 方式一: (jQuery.fn.set ...
- jqery validate、validate自定义验证方法 + jaery form Demo
校验规则 required:true 必输字段 remote:"check.php" 使用ajax方法调用check.php验证输入值 email:true 必须输入正确格式 ...
- OC中实例变量可见度、setter、getter方法和自定义初始化方法
在对类和对象有一定了解之后,我们进一步探讨实例变量的可见度等相关知识 实例变量的可见度分为三种情况:public(共有),protected(受保护的,默认),private(私有的),具体的不同和特 ...
- Android 自定义View修炼-实现自定义圆形、圆角和椭圆ImageView(使用Xfermode图形渲染方法)
一:简介: 在上一篇<Android实现圆形.圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)>博文中,采用BitmapShader方法实现自定义的圆形.圆角等自定 ...
- Spring Security验证流程剖析及自定义验证方法
Spring Security的本质 Spring Security本质上是一连串的Filter, 然后又以一个独立的Filter的形式插入到Filter Chain里,其名为FilterChainP ...
- Unity中自定义扩展方法
问题背景 在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题, Transfrom tran: ,pos_y=,pos_z=; tran.position=new Vect ...
随机推荐
- 04737_C++程序设计_第3章_函数和函数模板
例3.1 传对象不会改变原来对象数据成员值的例子. #define _SCL_SECURE_NO_WARNINGS #include <iostream> #include <str ...
- UINavigationController技巧<一>——修改返回按钮的标题
UINavigationController 一般push到另一界面后,返回按钮标题便是上一页面的title,但是对于push的第一页或者是上一页面没有title的,返回按钮标题便是默认back,如图 ...
- JavaScript的一些小用法
1.if问题: var a="this test"; if (a == "this test") //这样写的时候执行不下去了,不知为什么. 修改: var a ...
- asp.net中自定义验证控件
在windows2003中,可能iis版本太底,不支持TextBox的类型设为Number类型,所以会报错,所以去掉后直接用验证控件来控制必须输入数字好了. <asp:RegularExpres ...
- .net的页面在大并发下偶尔出现503错误
我们开发了一个回调页面,由一个工具负责调用,由于压力非常大,回调页面通过6台服务器负载均衡的: 最近业务系统又再次扩容,回调页面压力成倍增加,在高峰时间段偶尔出现了503错误. 拿到这个问题首先对系统 ...
- CRM odata方法如何使用$top
odata方法 $top $top1 取1个 ¥top100取100个,放在$select前,中间用&符号隔开. 例如: var activeserviceReq = "/xrmse ...
- 引用jquery框架后出错
问题描述:当引用了jquery框架后,页面的js不能正常工作. 后面我的解决办法:是因为在引用 jquery的框架时的代码为 <script type="text/javascript ...
- 剑指offer第五题
输入一个链表,从尾到头打印链表每个节点的值. 但是 根据往常的经验 如果if里面有return了 就不要写else了 import java.util.ArrayList; import java ...
- sqlplus查看服务名
查看服务名: show parameter service 查看实例名: select * from v$instance; 查看数据库名: select name from v$database; ...
- hibernate总结四
HIbernate-查询语句 Hibernate Query Language (HQL) 是一个面向对象的查询语言,与Sql相似, 相对于sql对表和列的操作, HQL是对持久对象和他们的属性进行操 ...