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

滚动条是浏览器的默认事件,使用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. 利用"SQL"语句自动生成序号的两种方式

    1.首先,我们来介绍第一种方式: ◆查询的SQL语句如下: select row_number() over (order by name) as rowid, sysobjects.[name] f ...

  2. Android照片墙完整版,完美结合 内存方案 LruCache 和 硬盘方案 DiskLruCache

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/34093441 在上一篇文章当中,我们学习了DiskLruCache的概念和基本用法 ...

  3. ElasticSearch指南

    ElasticSearch快速指南 ElasticSearch是基于Apache Lucene的分布式搜索引擎, 提供面向文档的搜索服务. 安装ElasticSearch 文档 创建文档 访问文档 更 ...

  4. HTTP基础知识整理

    http请求由三部分组成,分别是:请求行.消息报头.请求正文 HTTP(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接 ...

  5. CSS3的属性选择器

    CSS3中新增了许多选择器,今天零度给大家说说CSS3的属性选择器. 与CSS2相比,CSS3新增了3种属性选择器:[attr^=value].[attr$=value].[attr*=value]: ...

  6. 网站平台的favicon.ico的logo

        <link rel="shortcut icon" href="http://www.uuop.com/icotemp/2017061703035984/f ...

  7. 获取session中存储的所有值的方法

    记录一个获取系统中session存储的对象都有哪些的方法 HttpSession session = request.getSession(); for ( Enumeration e = sessi ...

  8. JAVA使用YUI压缩CSS/JS

    前言 JS/CSS文件压缩我们经常会用到,可以在网上找在线压缩或者本地直接使用,我这里使用的是yahoo开源组件YUI Compressor.首先介绍一下YUI Compressor,它是一个用来压缩 ...

  9. python2 pip安装包等出现各种编码错误UnicodeDecodeError: 'ascii'(/或者utf-8) codec can't decode byte 0xd2...

    1.问题描述: python2环境,pip安装包时报错UnicodeDecodeError: 'ascii'(/或者utf-8) codec can't decode byte 0xd2... 类似如 ...

  10. makeMtk- user 版本编译

    有时候我们需要在我们的手机上编译user 版本,先说一下user 跟eng版本的区别 user:这个版本是没有root权限的,当你adb shell进入后,linux下显示的是$,不可以push ap ...