Spy 滚动侦听
简介
滚动侦听一般用在需要监听进出视窗的元素,比如进入视窗添加动画样式,离开则删除动画样式;或者根据根据元素是否进入视野而触发某些事件。
使用方法
插件运行方式有两种:
- ax*属性:对标签使用
axSpy
属性即可按默认参数运行插件。 - js实例:通过
new axSpy('#ID')
方式创建实例运行。
请使用F12打开控制台查看打印结果。
<article> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg" axSpy="onShown:()=>{console.log('图片1进来了')}"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg" axSpy="onShown:()=>{console.log('图片2进来了')}"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg" axSpy="onShown:()=>{console.log('图片3进来了')}"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg" axSpy="onShown:()=>{console.log('图片4进来了')}"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg" axSpy="onShown:()=>{console.log('图片5进来了')}"> </article>
侦听模式
侦听模式分单个元素和批量元素侦听;如果侦听元素为一个列表,那么使用批量侦听更方便。设置参数spySelector
选择参与侦听的元素即表示批量侦听。
spySelector参数为className、nodeName等可被querySelectorAll识别的节点选择器。
<article axSpy="spySelector:'img',onShown:(dom)=>{console.log(`${dom.src}进来了`)}"> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg"> </article>
动画
通过参数in
设置进入动画,多个动画className以英文逗号或空格分开,例如in:'ax-fadeIn ax-ani'。
通过参数out
设置退出动画,由于out状态元素已经不可见,所以非必要不需要设置out参数了。
如果是批量侦听模式,而每一个侦听元素都需要配置不同的进入动画,那么可对侦听子元素设置spy="in:''"
。
框架内置的进入和退出动画详细请点击这里。
<article> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg" axSpy="in:'ax-fadeIn'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg" axSpy="in:'ax-fadeInUp'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg" axSpy="in:'ax-fadeInLeft'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg" axSpy="in:'ax-fadeInRight'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg" axSpy="in:'ax-scaleIn'"> </article> <div class="ax-break"></div> <article axSpy="spySelector:'img'"> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg" spy="in:'ax-fadeIn'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg" spy="in:'ax-fadeInUp'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg" spy="in:'ax-fadeInLeft'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg" spy="in:'ax-fadeInRight'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg" spy="in:'ax-scaleIn'"> </article> <div class="ax-break"></div> <article axSpy="spySelector:'img',in:'ax-scaleIn'"> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg"> </article>
只显示一次
默认侦听元素只要进入视窗都追加in
的样式,退出视窗会删除in样式并追加out
样式;如果将参数repeat
设为false则只会追加一次in样式并且不再删除in样式和追加out样式。
<article> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg" axSpy="repeat:true,in:'ax-fadeInLeft'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg" axSpy="repeat:false,in:'ax-fadeInRight'"> </article>
改变参照
侦听进入的视窗默认是以整个浏览器窗口或iframe窗口为参照的,如果需要参照物缩小到某个页面元素则可通过自定义parent
参数来实现,parent可以是#id、className、nodeName或节点。
<div axSpy="parent:'#parent',in:'ax-fadeInRight',spySelector:'img'"> <div id="parent" style="height:400px;overflow: auto;"> <article> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg"> </article> </div> </div>
关联元素
如果需要让页面中的其他元素也侦听对象发生联动则可使用rel
参数,rel参数可定义多个关联元素,其支持写法如下:
参数active
是侦听元素进入视窗后给关联元素追加的属性或样式,有两种写法:
- 追加属性,类似[selected],表示想关联元素追加一个selected属性
- 追加样式,如果是字符串格式,多个可用英文逗号或空格分开
侦听元素成功绑定关联元素后,点击关联元素,侦听元素将以父层为参照滚动到顶显示。
<div class="ax-align-center"> <span id="relBtn01" class="ax-btn">显示第三张图片时激活该按钮</span> <span id="relBtn02" class="ax-btn">显示第四张图片时激活该按钮</span> </div> <div axSpy="parent:'#relparent01',in:'ax-fadeInRight',spySelector:'img',active:'ax-primary'"> <div class="ax-break"></div> <div id="relparent01" style="height:400px;overflow: auto;"> <article> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg" spy="rel:'#relBtn01'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg" spy="rel:'#relBtn02'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg"> </article> </div> </div>
使用关联元素还有其他方法
- 批量侦听,对每个侦听元素使用ID属性,页面中的a标签可使用
href="#ID"
进行关联,允许多个a标签关联一个侦听元素。 - 单个侦听,侦听元素直接使用
rel
参数传入关联元素的id(多个用英文逗号或空格分开)或节点(数组)
<div class="ax-align-center"> <span href="#spy01" class="ax-btn">显示第三张图片时激活该按钮</span> <span href="#spy02" class="ax-btn">显示第四张图片时激活该按钮</span> </div> <div axSpy="parent:'#relparent02',spySelector:'img',active:'ax-primary'"> <div class="ax-break"></div> <div id="relparent02" style="height:400px;overflow: auto;"> <article> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg" id="spy01"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg" id="spy02"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg"> </article> </div> </div> <div class="ax-break"></div> <div class="ax-align-center"> <span id="spy03" class="ax-btn">显示第三张图片时激活该按钮</span> <span id="spy04" class="ax-btn">显示第四张图片时激活该按钮</span> </div> <div class="ax-break"></div> <div id="relparent03" style="height:400px;overflow: auto;"> <article> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg" axSpy="parent:'#relparent03',in:'ax-fadeInRight',active:'ax-primary',rel:'#spy03'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg" axSpy="parent:'#relparent03',in:'ax-fadeInRight',active:'ax-primary',rel:'#spy04'"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg"> </article> </div>
添加和取消监听
添加监听方法为add(data,callback)
;取消监听方法为remove(data.callback)
。data参数可取值如下:
- 文本格式,一个选择器或多个选择器,多个选择器用英文逗号或空格分开
- 数组格式,即多个节点数组
callback为回调函数,支持一个参数即当前添加或取消监听的节点数组。
实例内的可用变量有:
- this.items,实例监听元素数组
- this.parentDom,实例父节点
- this.navDom,实例菜单节点
- this.btnDoms,实例菜单关联按钮数组
- this.interact,监听交互对象实例(new IntersectionObserver)
加入监听的元素会自动带上spy
属性,取消监听会删除该属性。其为一个对象,属性说明如下:
- observed,布尔值,true表明已经加入侦听
- in,字符串,进入动画className
- out,字符串,退出动画className
- rel,数组,关联按钮节点数组
- state,字符串,监听元素状态,有show、showing、shown和hidden四种状态
-
<div id="method" style="height:400px;overflow: auto;"> <article> <img src="<?=$local?>dist/images/blank.svg" data-src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="<?=$local?>dist/images/blank.svg" data-src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="<?=$local?>dist/images/blank.svg" data-src="https://src.axui.cn/v2.0/public/images/full03.jpg"> <div class="ax-break"></div> <img src="<?=$local?>dist/images/blank.svg" data-src="https://src.axui.cn/v2.0/public/images/full04.jpg" id="last01"> <div class="ax-break"></div> <img src="<?=$local?>dist/images/blank.svg" data-src="https://src.axui.cn/v2.0/public/images/full05.jpg" id="last02"> </article> </div> <div class="ax-break"></div> <div class="ax-align-center"> <a href="###" class="ax-btn" id="methodRemove">取消最后两张图片监听</a> <a href="###" class="ax-btn" id="methodAdd">添加最后两个图片监听</a> <a href="###" class="ax-btn" id="methodAddAll">全部图片添加监听</a> </div>
-
let methodIns = new axSpy('#method', { in: 'ax-fadeInUp', parent: '#method', spySelector:'img', onBefore: () => { //先阻止 return false; } }), methodAdd = document.querySelector('#methodAdd'), methodAddAll = document.querySelector('#methodAddAll'), methodRemoveAll = document.querySelector('#methodRemoveAll'), methodRemove = document.querySelector('#methodRemove'); methodRemove.onclick = () => { methodIns.remove('#last01,#last02', (doms) => { console.log('取消监听的节点', doms) }); } methodAdd.onclick = () => { methodIns.add('#last01,#last02', (doms) => { console.log('增加监听的节点', doms) }); } methodAddAll.onclick = () => { //this.items是实例中内置变量,即当前加入监听的节点 let items = methodIns.items; methodIns.add(items, (doms) => { console.log('增加监听的节点', doms) }); } methodRemoveAll.onclick = () => { //this.items是实例中内置变量,即当前加入监听的节点 let items = methodIns.items; methodIns.remove(items, (doms) => { console.log('取消监听的节点', doms) }); }
侦听菜单
通过以上实例,制作侦听菜单是顺理成章的。创建侦听菜单步骤如下:
- 1、填写参数
spySelector
。该参数是侦听元素的选择器,通常为className或nodeName - 2、每个侦听元素写上
id
属性 - 3、给联动按钮上写上
href="#id"
,此id即为关联的侦听元素id - 4、(可选)填写
active
参数。该参数为联动按钮激活的属性(写法:[selected])或className(多个用英文逗号或空格分开) - 5、(可选)如果需要指定滚动区域请填写参数
parent
。该参数是侦听元素父容器的选择器,可填#id、className、nodeName或节点 - 6、(可选)如果需要指定导航区域请填写参数
navSelector
。该参数是侦听菜单的节点选择器,值可以是#id、className、nodeName或节点 - 7、(可选)如果需要进入动画请填写参数
in
。该参数可为一个或多个className,多个用英文逗号或空格分开
<div axSpy="parent:'#spys01',spySelector:'img',active:'[active]'"> <div class="ax-align-center"> <span class="ax-lamp-group"><a href="#pic01">图片1</a><a href="#pic02">图片2</a><a href="#pic03">图片3</a><a href="#pic04">图片4</a><a href="#pic05">图片5</a></span> </div> <div class="ax-break"></div> <div style="height:400px;overflow: auto;" id="spys01"> <article> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg" id="pic01"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg" id="pic02"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg" id="pic03"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg" id="pic04"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg" id="pic05"> </article> </div> </div>
如果已经明确侦听元素和菜单结构关系,可使用更简单的方式创建侦听菜单。
- 1、填写参数
spySelector
。该参数是侦听元素的选择器,通常为className或nodeName - 2、填写参数
navSelector
。该参数是侦听菜单的节点选择器,值可以是#id、className、nodeName或节点 - 3、填写参数
btnSelector
。该参数是侦听菜单的子项选择器,通常为className或nodeName - 4、(可选)填写
active
参数。该参数为联动按钮激活的属性(写法:[selected])或className(多个用英文逗号或空格分开) - 5、(可选)如果需要进入动画请填写参数
in
。该参数可为一个或多个className,多个用英文逗号或空格分开
<div axSpy="parent:'#spys02',spySelector:'img',navSelector:'#spyNav',btnSelector:'a',active:'ax-primary'"> <div class="ax-align-center" id="spyNav"> <span class="ax-btn-group"><a href="###" class="ax-btn">图片1</a><a href="###" class="ax-btn">图片2</a><a href="###" class="ax-btn">图片3</a><a href="###" class="ax-btn">图片4</a><a href="###" class="ax-btn">图片5</a></span> </div> <div class="ax-break"></div> <div style="height:400px;overflow: auto;" id="spys02"> <article> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg"> </article> </div> </div>
监听事件
本插件有若干监听方法,以on为关键字,参数中监听格式为:new instance({onShow:function(){}})
;实例后监听格式是:instance.on('show',function(){})
。在参数中监听和实例后监听效果相同。具体事件说明如下:
onShow/show
侦听元素开始出现在视窗中执行(intersectionRatio===0),支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象onShowing/showing
侦听元素正出现在视窗中执行(0 < intersectionRatio < 1),支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象onShown/shown
侦听元素完全出现在视窗中执行(intersectionRatio===1),支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象onIn/in
侦听元素与视窗交互中执行(isIntersecting===true),支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象onOut/out
侦听元素不与视窗交互时执行(isIntersecting===false),支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象onAdd/add
添加侦听元素后执行,支持一个参数即当前加入侦听的节点数组onRemove/remove
取消侦听元素后执行,支持一个参数即当前取消侦听的节点数组
演示实例显示结果使用了console.log方法,请按下F12按键打开开发者工具中的“控制台”查看监听效果。
-
<article id="on"> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg"> </article>
-
let onIns = new axSpy('#on',{ spySelector: 'img' }); onIns.on('shown', (dom) => { console.log(`${dom.src}进来了`); }).on('out', (dom) => { console.log(`${dom.src}离开了`); });
销毁实例
通过使用this.destroy(callback)
方法销毁实例,支持回调函数,回调无参数;销毁后可通过init
初始化重新启用。
-
<button class="ax-btn" id="destroyBtn">销毁</button> <button class="ax-btn" id="initBtn">初始化</button> <div class="ax-break"></div> <article id="destroy"> <img src="https://src.axui.cn/v2.0/public/images/full01.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full02.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full03.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full04.jpg"> <div class="ax-break"></div> <img src="https://src.axui.cn/v2.0/public/images/full05.jpg"> </article>
-
let destroyIns = new axSpy('#destroy', { spySelector: 'img' }), destroyBtn = document.querySelector('#destroy'), initBnt = document.querySelector('#initBtn'); destroyBtn.onclick = () => { destroyIns.destroy(()=>{ alert('销毁了实例'); }); } initBtn.onclick = () => { destroyIns.init(()=>{ alert('初始化了实例'); }); }
参数选项
document.addEventListener("DOMContentLoaded", function() { var demo1 = new axSpy('#ID',{ insName: '',//实例名称,字符串格式;如果填写了实例名称,那么该实例会被添加到实例合集当中,通过axInstance方法可获取本实例,详细请查看:ax-utils-instance.php offset: '0px', //偏离顶部或底部多长距离触发,单位px,如果只有一个值则上下偏移值相同,如果需要单独定义请用英文逗号隔开,比如'-50px,-30px'表示上方偏移50px,下方偏移30px visible: [0, 0.5, 1], //可见区域占比,单位是小数,比如0.5表示目标50%的部分出现在屏幕中则触发,默认在刚显示、显示一半以及完全显示时触发 parent: null,//以什么父节点为参照,可填#id、classname、nodename或节点,默认null表示以整个视窗为参照 distance: 0,//侦听元素使用关联按钮滚动到顶部时距离顶部的高度,数值类型,默认为0即贴合顶部 spySelector: '',//监听子元素的选择器,可以是nodeName或className(能使用querySelectorAll获取) navSelector: '',//菜单节点,可以是#id、nodeName、className或节点 btnSelector: '',//监听菜单子元素的选择器,可以是nodeName或className(能使用querySelectorAll获取) duration: 0,//点击关联按钮页间跳转滚动动画的时间,默认为0即自动计算,可填具体数值,单位ms interval: 500,//防抖间隔时间,默认500ms,因为位移动画的缘故会导致交互+非交互两个状态之间频繁切换,继而导致动画抖动 repeat: true,//是否每次出现在视窗则重复执行in动画,默认true,可选择false只执行一次(out状态不会删除in动画) active: '',//关联按钮激活的属性(写法:[selected])或className(多个用英文逗号或空格分开) in: '',//进入视窗的动画className,多个用英文逗号或空格分开,例如in:'ax-fade ax-ani' out: '',//离开视窗的动画className,多个用英文逗号或空格分开,例如in:'ax-fade ax-ani',通常不填! rel: '',//关联按钮,#id、className、nodeName或节点等,多个用英文逗号或空格分开,可是数组格式,如果是batch模式则不用填 breakpoints: {},//使用断点以适配终端,详情查看ax-utils-other.php页面 onBefore: '',//加载前执行函数,支持一个参数即被监听元素数组,如果该函数直接返回true则按既定程序执行加载,否则需手动添加监听(add方法) onShow: '',//开始进入视窗监听函数,支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象 onShowing: '',//正在进入视窗监听函数,支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象 onShown: '',//完全显示在视窗监听函数,支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象 onIn: '',//进入视窗监听函数(包括show、showing和shown),支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象 onOut: '',//离开视窗监听函数,支持三个参数,即监听节点、节点的关联按钮(数组),监听交互对象 onAdd: '',//新增监听节点监听函数,支持一个参数,即监听新增监听节点数组 onRemove: '',//取消监听节点监听函数,支持一个参数,即监听取消监听节点数组 onInit: '',//回调函数,加载完毕执行,无参数 onDestroy: '',//回调函数,销毁后执行,无参数 }); });