要自己写一个自定义滚动条加上滚轮事件,之前的没有滚轮事件不完整,今天整理了一个。

1.滚轮事件是不兼容的,firefox中是必需要用事件绑定的添加,用的DOMMouseScroll,当滚动鼠标的时候,只要鼠标滚动的方法就行了,而这通过检测datail的正负号就可以确定

2.其他的用mousewheel(Ie是onmousewheel),通过检测wheelDelta

 <!doctype html>
<html>
<head>
<title>拖拽-加滚轮</title>
<style>
.main{ width: 300px; height: 400px; background: #ccc; margin: 10px auto;overflow: hidden;}
.main-content{width: 300px; position: relative; height: 400px; overflow: hidden;}
.main-content-c{width: 280px; background: #0F9932; position: absolute; top: 0;}
.target{width: 20px; background: #eee;height: 400px; position: absolute; top: 0;right: 0;}
.bar{width: 20px;min-height: 10px; background: #333;border-radius: 10px; position: absolute; top: 0;}
</style>
<script>
window.onload= function(){
var oContent = document.getElementById("content");
var oTxt = getByClass(oContent,"main-content-c")[0];
var oTarg = getByClass(oContent,"target")[0];
var oBar = getByClass(oContent,"bar")[0]; oBar.style.height = oTarg.offsetHeight*(oContent.offsetHeight/oTxt.offsetHeight)+'px'; oBar.onmousedown = function(ev){
var oEvent = ev || event;
var disY = oEvent.clientY - oBar.offsetTop;
document.onmousemove = function(ev){
var oEvent = ev || event;
var t = oEvent.clientY - disY;
setPos(t);
}
document.onmouseup = function(){
document.onmousemove = null;
document.onmouseup = null; oBar.releaseCapture && oBar.releaseCapture();
}
oBar.setCapture && oBar.setCapture();
oEvent.preventDefault && oEvent.preventDefault();
return false;
}
function setPos(t){
if(t<0){
t =0;
}else if(t>oTarg.offsetHeight-oBar.offsetHeight){
t = oTarg.offsetHeight-oBar.offsetHeight;
}
oBar.style.top = t+'px'; var scale = t/(oTarg.offsetHeight-oBar.offsetHeight);
oTxt.style.top = -scale*(oTxt.offsetHeight-oContent.offsetHeight)+'px'; } addMouseWheel(oContent,function(down){
var t = oBar.offsetTop;
if(down){
t +=10;
}else{
t -=10;
}
setPos(t);
}); } function getByClass(oParent,sClass){
if(oParent.getElementsByClassName){
return oParent.getElementsByClassName(sClass);
}
var aEle = oParent.getElementsByTagName("*");
var aRes = [];
var reg = new RegExp('\\b'+sClass+'\\b');
for(var i=0;i<aEle.length;i++){
if(reg.test(aEle[i].className)){
aRes.push(aEle[i]);
}
}
return aEle;
}
function addMouseWheel(obj,fn){
function fnWhell(ev){
var oEvent = ev || event;
var bDown = false; bDown = oEvent.wheelDelta ? oEvent.wheelDelta<0 : oEvent.detail>0; fn && fn(bDown,oEvent);
oEvent.preventDefault && oEvent.preventDefault();
return false;
}
if(window.navigator.userAgent.toLowerCase().indexOf("firefox")!=-1){
obj.addEventListener("DOMMouseScroll",fnWhell,false);
}else{
addEvent(obj,'mousewheel',fnWhell);
}
}
function addEvent(obj,sEv,fn){
if(obj.addEventListener){
obj.addEventListener(sEv,fn,false);
}else{
obj.attachEvent('on'+sEv,fn);
}
}
</script>
</head>
<body>
<div class="main">
<div class="main-content" id="content">
<div class="main-content-c">
正当我伸伸懒腰,打算上个厕所的时候,突然想到一件事情:如果模块越来越多,那么多文件都要分开加载?那岂不严重影响性能!?(啥,你不知道为啥?)
要压缩合并JavaScript呀!于是,我强忍住那股液体,开始用YUICompressor来压缩,并手动合并了两个文件。
这里就不展示结果了,因为很蛋疼,完全对不住我刚才忍住液体的勇气!结果当然是,失败。
为什么会失败呢?自己想了想,同时打开压缩后的代码一看,才发现原因:
压缩后之后,require变量变成了a变量。SeaJS是通过require字面来判断模块之间的依赖关系的,所以,require变量不能被简化。 嗯,SeaJS已经替我们想到了这个问题,于是我们就采用SeaJS提供的方式来合并压缩吧(当然你也可以自己用别的方式压缩)。
SeaJS在2.0之前,是采用SPM作为压缩合并工具的,到了2.0,改为Grunt.js,SPM变为包管理工具,类似NPM(不知道NPM?Google一下吧) 自动化不仅是科技带给社会的便利,也是Grunt带给前端的瑞士军刀。使用Grunt,可以很方便的定制各种任务,如压缩、合并等。使用Grunt之前,需要安装node环境和grunt工具,Google一下,十分钟后回来。
…… Grunt最核心的就两个部分,package.json、Gruntfile.js。 a. package.json
Grunt把一个项目/目录视为一个npm模块,package.json就是用来描述这个模块的信息,包括name、version、author等等。
这里强调一下,Grunt既然将该目录视为一个模块,那么该模块当然可以依赖其他模块。
我们看本示例的:
正当我伸伸懒腰,打算上个厕所的时候,突然想到一件事情:如果模块越来越多,那么多文件都要分开加载?那岂不严重影响性能!?(啥,你不知道为啥?)
要压缩合并JavaScript呀!于是,我强忍住那股液体,开始用YUICompressor来压缩,并手动合并了两个文件。
这里就不展示结果了,因为很蛋疼,完全对不住我刚才忍住液体的勇气!结果当然是,失败。
为什么会失败呢?自己想了想,同时打开压缩后的代码一看,才发现原因:
压缩后之后,require变量变成了a变量。SeaJS是通过require字面来判断模块之间的依赖关系的,所以,require变量不能被简化。 嗯,SeaJS已经替我们想到了这个问题,于是我们就采用SeaJS提供的方式来合并压缩吧(当然你也可以自己用别的方式压缩)。
SeaJS在2.0之前,是采用SPM作为压缩合并工具的,到了2.0,改为Grunt.js,SPM变为包管理工具,类似NPM(不知道NPM?Google一下吧) 自动化不仅是科技带给社会的便利,也是Grunt带给前端的瑞士军刀。使用Grunt,可以很方便的定制各种任务,如压缩、合并等。使用Grunt之前,需要安装node环境和grunt工具,Google一下,十分钟后回来。
…… Grunt最核心的就两个部分,package.json、Gruntfile.js。 a. package.json
Grunt把一个项目/目录视为一个npm模块,package.json就是用来描述这个模块的信息,包括name、version、author等等。
这里强调一下,Grunt既然将该目录视为一个模块,那么该模块当然可以依赖其他模块。
我们看本示例的:
</div>
<div class="target">
<div class="bar"></div>
</div>
</div>
</div>
</body>
</html>

javascript 学习之自定义滚动条加滚轮事件的更多相关文章

  1. JavaScript学习笔记- 自定义滚动条插件

    此滚动条仅支持竖向(Y轴) 一.Css /*这里是让用户鼠标在里面不能选中文字,避免拖动的时候出错*/ body { -moz-user-select: none; /*火狐*/ -webkit-us ...

  2. JavaScript学习笔记-自定义滚动条

    这是一个基本实现思路,如果有新手和我一样没什么事,喜欢瞎研究话,可以参考下. 一.Html <div class="scroll_con"> <div class ...

  3. JavaScript学习日志(六):事件

    这篇随笔,深恶痛绝,敲到快结束的时候,凌晨00:19,突然闪退,也不知道是Mac的原因还是chrome的原因,重新打开的时候,以为自动保存有效果,心想没关系,结果他么的只保存了四分之一,WTF?!!! ...

  4. js 页面无滚动条添加滚轮事件

    当页面无滚动条时,滑动滚轮时window.onscroll事件不会相应,此时应该去添加滚轮事件 var MouseWheelHandler=function(e){ e.preventDefault( ...

  5. JAVAscript学习笔记 js句柄监听事件 第四节 (原创) 参考js使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. javascript学习之带滚动条的图片

    之前找了好久没有找到,就自已动手写了一个: <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  7. JavaScript学习笔记-自定义集合类

    //集合类Set( ES6标准才有的类,目前兼容性较差)//自定义集合类:extend = function (o,p){ //定义一个复制对象属性的类函数 for(var x in p){ o[x] ...

  8. javascript学习笔记(七):事件详解

    HTML事件处理 <!DOCTYPE html> <html> <head lang="en"> <meta chaset="U ...

  9. web前端学习(四)JavaScript学习笔记部分(5)-- 事件流详解

    1.JS事件详解-事件流 1.1.事件流 1.事件流: 描述的是在页面中接受事件的顺序 2.事件冒泡: 由最具体的元素接收,然后逐级上传播至最不具体的节点(文档) 3.事件捕获: 最不具体的节点先接收 ...

随机推荐

  1. Alpha总结

    一.预期计划 1.时间:11月7日--11月17日 2.小组分工 角色:程序员.美工.文档.测试 这个阶段以编码为主,每个组员参与编码,同时各自根据自己擅长的方面主要负责一个部分. 项目编码工作分工: ...

  2. LwIP移植和使用

    LwIP移植和使用 本手册基于lwip-1.4.x编写,本人没有移植过1.4.0之前的版本,更早的版本或许有差别.如果看官发现问题欢迎联系<QQ: 937431539  email: 93743 ...

  3. Ubuntu 登录锐捷 网卡被禁用 网口灯不亮解决

    cd rjsupplicantchmod +x rjsupplicant.sh sudo ./rjsupplicant.sh -u username-p password -d 1 sudo serv ...

  4. [转]Struts2工作原理

    Struts2请求响应流程: 在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller.ActionProxy.ActionMapping.Co ...

  5. spring mvc redis消息队列

    通常情况下,为了提高系统开发的灵活性和可维护度,我们会采用消息队列队系统进行解耦.下面是一个采用spring redis实现的消息队列实例,但此实例会由于网络延迟和阻塞等情况导致消息处理的延时,因而不 ...

  6. hbase集群的启动,注意几个问题

    1.hbase的改的会影响器他的组件的使用, 故而, 在修改 hadoop的任何组件后, 一定要记得其它的组件也能受到影响, 一下是我在将hadoop的集群改了之后 , 再次运行hbase的时候, 就 ...

  7. Python爬虫Scrapy框架入门(0)

    想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题 ...

  8. python selenium中使用ddt进行数据驱动测试

  9. 使用脚本自动配置matlab安装libsvm和随机森林工具箱

    前言 支持向量机(SVM)和随机森林 都是用于分类的机器学习算法. 这里我需要对网上的工具箱在matlab中进行配置. 效果演示: 1.双击运行“自动配置.bat” 2.matlab会自动启动,手动配 ...

  10. [LeetCode] Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...