很想把滚动条事件跟鼠标滚轮事件放在一起,那就直接写在这一篇了。除了事件以外,对滚动条样式的调整也记在这里吧。

滚动条是浏览器的默认事件,使用overflow:auto/scroll都有可能出现,它的默认事件在各个浏览器大多一样,它的样式在各浏览器都有不同的表现。但是通过js我们可以阻止它的默认事件,使用css也可以在一定程度上更改它的样式。如果你不想要浏览器的滚动条,你可以通过监听鼠标滚轮事件以及使用动画(就像轮播图片那样)自定义事件,推荐js事件应用(带框拖拽、自定义滚动条),但是这里就不做深入了。

(1)滚动条事件

浏览器自定的滚动条有以下特点:

  a.默认事件是元素上鼠标滚轮带动滚动条和界面滚动以及鼠标拖拽滚动条会带动界面滚动。

  b.元素上鼠标滚动时默认禁止冒泡,元素内滚动条事件不会带动父元素及祖先元素的滚动事件。

  c.该元素滚动条滚动条滚动到顶部(底部)后继续往上(往下)滚动的话,会触发滚动父元素的事件(这是默认事件,与冒泡无关)

  在scroll事件对象里面我们要关注的值是触发事件元素的:

    ①scrollTop/scrollLeft:滚动的距离,一开始默认都是0,往下滚动scrollTop增加,往右scrollLeft增加。

    ②scrollHeight/scrollWidth:整个页面内容的大小,包括被隐藏的部分。

    ③clientHeight/clientWidth:视图显示部分的大小

  如果要实现:

    ①判断滚动方向,记录之前的scrollTop,然后触发后进行比较判断

    ②判断是否到达顶部底部,scrollTop为0到达顶部,scrollTop+clientHeight==scrollHeight到达底部

 

            var f1top = document.getElementById('f1').scrollTop;
function topOrBottom(e){
var e = e||event||window.event;
var element = e.target||e.srcElement;
var scrollTop = element.scrollTop;
var scrollHeight = element.scrollHeight;
var clientHeight = element.clientHeight; //上下滚动的时候,scrollTop=0时滚动条在顶部,scrollTop+clientHeight=scrollHeight时滚动条在底部
if(scrollTop==0){
console.log('到了顶部!');
}
else if(scrollTop+clientHeight==scrollHeight){
console.log('到了底部!');
}
//判断滚动方向 var f = scrollTop - f1top;
f1top = scrollTop; if(f>0){
console.log('向下');
}
else if(f<0){
console.log('向上');
}
}
//js
document.getElementById('f1').onscroll=topOrBottom;

那么scroll事件和鼠标滚轮事件WheelEvent有什么关系和区别呢?滚轮事件只是触发onscroll事件的条件之一(另一个是拖动滚动条),滚轮事件是一次滚动鼠标滚轮,而在这一次滚轮之中,会大约每15毫秒触发一次该元素的onscroll事件(如果该元素可以滚动),如果该元素不可以滚动(或者到顶到底了),就会按顺序触发该元素的祖先元素中的可滚动元素。

我关注到滚动条事件的原因就是要禁用掉滚动条滚动到底部继续进行鼠标滚轮滚动会触发父元素滚动事件的默认事件。元素的滚动条事件是绑定在元素滚轮事件上面的默认事件,而在滚动条滚动到底部再进行一次向下滚动鼠标滚轮的操作,就不会再触发该元素的scroll事件,而是按顺序触发父元素的scroll事件,这同样是默认事件,所以阻止冒泡是不可行的,而单纯地阻止默认事件也是不可行的。具体来说,我就是要监听鼠标滚轮事件,当事件触发时出现元素已经到达底部并且这次滚轮方向也是向下(顶部情况相反)时,禁用默认事件。代码如下:

/*阻止鼠标滚动事件联动*/
function StopP(e){
e = e||window.event; if (e.stopPropagation) { //取消冒泡
e.stopPropagation();
} else{
e.cancelBubble = true;
};
var scrollup = false;
/*判断鼠标滚动方向*/
if (e.wheelDelta) { //判断浏览器IE,谷歌滑轮事件
if (e.wheelDelta > 0) { //当滑轮向上滚动时
scrollup = true;
}
  } else if (e.detail) { //Firefox滑轮事件
if (e.detail> 0) { //当滑轮向上滚动时
scrollup = true; }
} var ele=e.target||e.srcElement;
var eleheight = ele.clientHeight;//视图高度
var conheight = ele.scrollHeight;//内容高度
var scrtop = ele.scrollTop;//滚动条离顶部距离
var c = 0; /*阻止滚动条到达顶部、底部时带动body的滚动*/
if(scrollup==true&&scrtop==0){
c = 1;
}
if(scrollup==false&&(scrtop+eleheight>=conheight)){
c = 1;
}
if(c==1){
if (e.preventDefault) {//取消默认行为
e.preventDefault();
} else{
e.returnValue = false;
};
} }

(2)  滚动条自定义样式

默认滚动条不符合要求,需要自定义或者隐藏滚动条。按常规方法来说谷歌和ie都提供了在css中更改滚动条样式的方法,但是限制都很大,而且都不怎么兼容。火狐则没有提供方法,但是可以使用插件。下面是一段谷歌,ie修改css的代码,引用自(https://blog.csdn.net/zh_rey/article/details/72473284)

/*滚动条样式*/
.myscroll::-webkit-scrollbar{/*滚动条整体部分,其中的属性有width,height,background,border等(就和一个块级元素一样)(位置1)*/
width:10px;
height:10px;
}
.myscroll::-webkit-scrollbar-button{/*滚动条两端的按钮,可以用display:none让其不显示,也可以添加背景图片,颜色改变显示效果(位置2)*/
background:#74D334;
}
.myscroll::-webkit-scrollbar-track{/*外层轨道,可以用display:none让其不显示,也可以添加背景图片,颜色改变显示效果(位置3)*/
background:#FF66D5;
}
.myscroll::-webkit-scrollbar-track-piece{/*内层轨道,滚动条中间部分(位置4)*/
background:#FF66D5;
}
.myscroll::-webkit-scrollbar-thumb{/*滚动条里面可以拖动的那部分(位置5)*/
background:#FFA711;
border-radius:4px;
}
.myscroll::-webkit-scrollbar-corner {/*边角(位置6)*/
background:#82AFFF;
}
.myscroll::-webkit-scrollbar-resizer {/*定义右下角拖动块的样式(位置7)*/
background:#FF0BEE;
}
.myscroll{
scrollbar-arrow-color: #f4ae21; /**//*三角箭头的颜色*/
scrollbar-face-color: #333; /**//*立体滚动条的颜色*/
scrollbar-3dlight-color: #666; /**//*立体滚动条亮边的颜色*/
scrollbar-highlight-color: #666; /**//*滚动条空白部分的颜色*/
scrollbar-shadow-color: #999; /**//*立体滚动条阴影的颜色*/
scrollbar-darkshadow-color: #666; /**//*立体滚动条强阴影的颜色*/
scrollbar-track-color: #666; /**//*立体滚动条背景颜色*/
scrollbar-base-color:#f8f8f8; /**//*滚动条的基本颜色*/
}

我还看到了一个方法,能做到隐藏滚动条,配合js就可以自定义滚动样式了。那就是在有滚动条的元素'#c1'外层套一个div,设置宽度是'#c1'不包括滚动条的宽度并设置overflow:hidden。这样的话界面中就不会看到滚动条(即使它其实还在),你也可以自己设置新滚动条的样式,然后绑定事件来设置滚动。

参考:

https://www.cnblogs.com/liuyanxia/p/8675752.html

Javascript和jquery事件--滚动条事件和自定义滚动条事件样式的更多相关文章

  1. day52—JavaScript拖拽事件的应用(自定义滚动条)

    转行学开发,代码100天——2018-05-07 前面的记录里展示了JavaScript中鼠标拖拽功能,今天利用拖拽功能实现另一个应用场景——自定义滚动条(作为控制器)的用法. 常通过自定义滚动条控制 ...

  2. dispatchEvent 自定义触发事件,常用于自定义鼠标事件或点击事件

    自定义事件的触发又是不可避免的,由于浏览器兼容性问题,我们要分开说了,针对标准浏览器和IE6/7等考古浏览器. 1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEve ...

  3. WPF自学入门(四)WPF路由事件之自定义路由事件

    在上一遍博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件.接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建吧. 创建自定义路由事件分为3个步骤: 1.声明并注册 ...

  4. jQuery Validate 表单验证插件----自定义校验结果样式

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...

  5. javascript 学习之自定义滚动条加滚轮事件

    要自己写一个自定义滚动条加上滚轮事件,之前的没有滚轮事件不完整,今天整理了一个. 1.滚轮事件是不兼容的,firefox中是必需要用事件绑定的添加,用的DOMMouseScroll,当滚动鼠标的时候, ...

  6. 【Python全栈-JavaScript】jQuery事件

    jQuery事件 一.页面载入 当DOM载入就绪可以查询及操纵时绑定一个要执行的函数. 这是事件模块中最重要的一个函数,因为它可以极大地提高web应用程序的响应速度. 简单地说,这个方法纯粹是对向 w ...

  7. jQuery 学习笔记(5)(事件绑定与解绑、事件冒泡与事件默认行为、事件的自动触发、自定义事件、事件命名空间、事件委托、移入移出事件)

    1.事件绑定: .eventName(fn) //编码效率略高,但部分事件jQuery没有实现 .on(eventName, fn) //编码效率略低,所有事件均可以添加 注意点:可以同时添加多个相同 ...

  8. Javascript和jquery事件--事件冒泡和事件捕获

    jQuery 是一个 JavaScript 库,jQuery 极大地简化了 JavaScript 编程,在有关jq的描述中,jq是兼容现有的主流浏览器,比如谷歌.火狐,safari等(当然是指较新的版 ...

  9. Javascript和jquery事件--鼠标事件的小结

    1.鼠标事件的主要事件应该是mouseup, mousedown, mousewheel, mousemove, mouseover, moveout. <1>其中mouseup和mous ...

随机推荐

  1. cogs 1396. wwww

    1396. wwww ☆   输入文件:wwww.in   输出文件:wwww.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 对于一个递归函数w(a,b,c) 如果 ...

  2. .Net中常用的几种ActionResult

    1.ViewResult 表示一个视图结果,它根据视图模板产生应答内容.对应得Controller方法为View. 2.PartialViewResult 表示一个部分视图结果,与ViewResult ...

  3. c++笔试题:不使用第三个变量来交换俩个变量的数值

    题目:将a 与 b的值互换. 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下:      int a,b;      a; b:      int t;      t ...

  4. C#使用一般处理程序(ashx)中session

    .ashx中引用 session必须 using System.Web.SessionState ,继承IReadOnlySessionState/IRequiresSessionState IRea ...

  5. EF搭建数据库

    http://blog.csdn.net/mss359681091/article/details/52135867http://blog.csdn.net/x_craft/article/detai ...

  6. PCA and Whitening on natural images

    Step 0: Prepare data Step 0a: Load data The starter code contains code to load a set of natural imag ...

  7. python stomp activemq客户端

    #coding=utf-8import timeimport sysimport stomp class MyListener(object): def on_error(self, headers, ...

  8. c# 多态的美丽(虚方法、抽象、接口实现)

    面向对象3大特性:封装.继承.多态. 面向对象2大原则: 1)里氏替换原则:子类可以给父类,父类不能赋给子类. 2)开放封闭原则: 封装变化,降低耦合.(对扩展开放,对修改封闭) ********** ...

  9. 【习题 8-3 UVA - 12545】Bits Equalizer

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果1的个数第一个串比第2个串多. 那么就无解. 否则. 找几个位置去凑1 优先找'?'然后才是0的位置 剩余的全都用swap操作就 ...

  10. D. Dreamoon and Sets(Codeforces Round #272)

    D. Dreamoon and Sets time limit per test 1 second memory limit per test 256 megabytes input standard ...