滚动侦听一般用在需要监听进出视窗的元素,比如进入视窗添加动画样式,离开则删除动画样式;或者根据根据元素是否进入视野而触发某些事件。
插件运行方式有两种:
axSpy属性即可按默认参数运行插件。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是侦听元素进入视窗后给关联元素追加的属性或样式,有两种写法:
侦听元素成功绑定关联元素后,点击关联元素,侦听元素将以父层为参照滚动到顶显示。
<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>
使用关联元素还有其他方法
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为回调函数,支持一个参数即当前添加或取消监听的节点数组。
实例内的可用变量有:
加入监听的元素会自动带上spy属性,取消监听会删除该属性。其为一个对象,属性说明如下:
<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)
});
}
通过以上实例,制作侦听菜单是顺理成章的。创建侦听菜单步骤如下:
spySelector。该参数是侦听元素的选择器,通常为className或nodeNameid属性href="#id",此id即为关联的侦听元素idactive参数。该参数为联动按钮激活的属性(写法:[selected])或className(多个用英文逗号或空格分开)parent。该参数是侦听元素父容器的选择器,可填#id、className、nodeName或节点navSelector。该参数是侦听菜单的节点选择器,值可以是#id、className、nodeName或节点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>
如果已经明确侦听元素和菜单结构关系,可使用更简单的方式创建侦听菜单。
spySelector。该参数是侦听元素的选择器,通常为className或nodeNamenavSelector。该参数是侦听菜单的节点选择器,值可以是#id、className、nodeName或节点btnSelector。该参数是侦听菜单的子项选择器,通常为className或nodeNameactive参数。该参数为联动按钮激活的属性(写法:[selected])或className(多个用英文逗号或空格分开)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: '',//回调函数,销毁后执行,无参数
});
});