转载文章 -- 难搞的滚动事件(滚动默认,scrollTop)
关于取消默认事件
现今的 chrome 浏览器,为了实现丝滑顺畅地滑动,活动时间直接执行而不再检测默认事件,这使得无法用 e.preventDafult() 来阻止默认事件。
现在需要添加 {passive: false} 配置
$(document).addEventListener( 'scroll', fun, {passive: false} ) 把事件被动监听设置为 false 之后,就可以正常阻止默认事件了。
关于 scrollTop
为了手动地使页面平滑滚动到某个高度,需要使用 $.animate({scrollTop: val}) 。由于不同浏览器间的差异,绑定 scrollTop 的 DOM 元素是不一样的,比如
chrome 下最外层元素为 html ,活动事件需要绑定在这上面。
而 edge 及移动端的 html 就没有高度,需要绑定在 body 节点上,才能实现滚动。
为了解决这个差异,我们需要把 animate 同时绑定在两个节点上。 $('html, body').animate()
关于获取位置
$().position() ———— 基于父元素,从自身的外边框为点。
$().offset() ———— 基于父元素,从自身内容为点。
$(window).height().width() ———— 获取窗口宽高。
记录一个底部上划继续加载的方法
因为使用的是监听 touchstar 和 touchend 方法,所以该方法只适用于移动端。
$("body").on("touchstart", getTouchS = e => {
//记录页面当前滚动和开始Y坐标,以供比较
startScroll = $(window).scrollTop()
moveStartY = e.originalEvent.changedTouches[0].pageY;
});
$("body").on("touchend", getTouchE = e => {
//这里判断是否有必要执行,没有必要则直接跳出
if (needToDo?) return false
//若有必要,则获取当前事件发生的状态值
let endScroll = $(window).scrollTop(),
ifBottom = $('body').outerHeight() - $(window).scrollTop() - $(window).height()
//页面不再滚动 或者 leadblock位置超出范围
if (startScroll == endScroll || ifBottom <= 0) {//滑动后没有滚动
moveEndY = e.originalEvent.changedTouches[0].pageY,
Y = moveEndY - moveStartY;
if ( Y < -60 ) { //至少上滑60个单位
//这里执行加载或之类的操作
//*****
//解绑事件
$("body").off("touchstart", getTouchS)
$("body").off("touchend", getTouchE)
}
}
});
主要的思路就是监听“触摸开始”和“触摸结束”两个事件,分别获取事件当前的触摸点坐标和文档滚动的值,进行对比判断“触摸是否有滑动”以及“文档是否有滚动(到底)”,来执行需要的方法。下面说说几个注意点:
- 有必要的话,可以对事件监听添加阻止默认事件,需要在 on() 的第三个参数传入 false 。
- 执行触摸结束监听时,优先判断是否需要执行,以节约性能。
- 为了避免微信 iOS端底部导航栏的问题(显隐不定,出现时会减少视窗高度), $(window).height() 必须实时获取而不是用全局变量。
- 同样为了节省性能,当执行完毕后使用 off() 对事件进行解绑,当需要传入函数名参数,所以绑定是不能使用匿名函数。
判定兼容后的阻止默认事件
var e=e||window.event;
e.stopPropagation();//阻止事件的传播(包括捕获也包括冒泡)
// 兼容处理
if (e.stopPropagation) {
e.stopPropagation();
}else{
// IE浏览器
e.cancelBubble=true;
}
作者:Primers
链接:https://www.jianshu.com/p/e8d68a9bba54
来源:简书
转载文章 -- 难搞的滚动事件(滚动默认,scrollTop)的更多相关文章
- Vue 爬坑之路(七)—— 监听滚动事件 实现动态锚点
前几天做项目的时候,需要实现一个动态锚点的效果 如果是传统项目,这个效果就非常简单.但是放到 Vue 中,就有两大难题: 1. 在没有 jQuery 的 animate() 方法的情况下,如何实现平滑 ...
- taro 滚动事件
taro 滚动事件 taro scroll bug ScrollView https://nervjs.github.io/taro/docs/components/viewContainer/scr ...
- js鼠标滑轮滚动事件绑定(兼容主流浏览器)
/** Event handler for mouse wheel event. *鼠标滚动事件 */ var wheel = function(event) { var delta = 0; if ...
- 鼠标滚动事件兼容性 wheel、onwheel
wheelEvent = "onwheel" in document.createElement("div") ? "wheel" : // ...
- JavaScript----分层导航 滚动事件
分层导航 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- js网页滚动条滚动事件实例分析
本文实例讲述了js网页滚动条滚动事件用法.分享给大家供大家参考.具体分析如下: 在做js返回顶部的效果时,要监听网页滚动条滚动事件,这个事件就是:window.onscroll.当onscroll事件 ...
- JS鼠标滚动事件
-----------------------------//鼠标滚动事件以下是JS临听鼠标滚动事件 并且还考虑到了各浏览器的兼容----------------------------------- ...
- Jquery-Mobile滚动事件
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> < ...
- javascript滚动栏响应鼠标滑轮的实现上下滚动事件
实现鼠标滚动滚轮事件: <script type="text/javascript"><pre name="code" class=" ...
随机推荐
- three.js 源代码凝视(十五)Math/Plane.js
商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 - 本博客专注于 敏捷开发 ...
- Serial attached SCSI
http://en.wikipedia.org/wiki/Serial_attached_SCSI Serial attached SCSI From Wikipedia, the free ency ...
- Axure Base 09 带遮罩层的弹出框
示例原型下载:小楼Axure原创元件-带遮罩层的弹出框 实现目标: 1. 点击按钮弹出带遮罩层的对话框: 2. 页面上下左右滚动时,弹出的对话框水平和垂直始终居中. 实现步骤如下: 1. 拖入 ...
- stm8 停机模式与外部中断唤醒中一个小问题
做了一个简单的项目,电路板使用电池供电,需要系统在待机时低功耗.而对外接口只有4个按键,也就是唤醒必须要通过这四个按键. 系统功能就不介绍了,只给出进入低功耗的代码和退出低功耗的代码. 使用芯片为st ...
- navcat for mysql 连接远程数据库 教程
1.首先进入数据库: mysql -uroot -p 2.然后打开数据库设置远程连接权限: mysql>GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%'ID ...
- 数据结构之 图论---基于邻接矩阵的广度优先搜索遍历(输出bfs遍历序列)
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...
- 最小生成树,并查集的思想 nyoj1239
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...
- CodeForces985F:Isomorphic Strings (字符串&hash)
题意:取出字符串Str里的两个串S,T,问对应位置的的字符在否有一一映射关系. hash:对于每个字符s=‘a’-‘z’,我们任意找一个i,满足Si==s,(代码里用lower_bound在区间找到最 ...
- Filter的基本配置
1.<dispatcher></dispatcher>节点:指定过滤器所拦截的servlet容器调用资源的方式,有REQUEST,INCLUDE,FORWARD,ERROR,默 ...
- public void与public static void区别
我们换个简单易懂的说法,这两句的区别就在于,能不能直接用类名访问. 很好理解的不是吗? 假如,我有一个类,如下图所示: 接下来先实例化一个对象,ca,你会发现它不仅可以访问普通的方法,也可以访问静态的 ...