Scroll 滚动反弹
简介
在移动端拖拽反弹是标配效果,这种效果比较符合人的操作体验,减少多余的提示和注解;比如到顶再滑动则滑出空白表示没有更多;到底再滑则异步加载更多内容。
由于PC端用鼠标事件可代替了手指触摸事件,另外再加上滚动事件,拖拽滚动的良好的操作体验自然被投射到传统的PC站点。拖拽反弹多见于见于日期选择,加载更多内容组件。
功能特点
本框架的拖拽反弹插件axScroll支持多种特性,满足一般场景需求。
- 支持水平和垂直方向滚动
- 支持移动端触摸和PC端鼠标操作(包括滚轮)
- 支持多种监听方式
- 支持自定义上拉和下拉监听
- 支持以快速甩动方式滑动
使用方法
插件运行方式有两种:
- ax*属性:对ax-scroll标签使用
axScroll
属性即可按默认参数运行插件。 - js实例:通过
new axScroll('#ID')
方式创建实例运行。
注意不要对ax-scroll外容器使用box-sizing:border-box属性,否则边框width和padding值都将作为内外容器差值计算依据。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" axScroll> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <div class="demo-wrapper" id="scroll01"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll01');
-
.demo-wrapper { border: 1px solid #ebebeb; } .demo-wrapper[axis='y'] { height: 300px; } .demo-wrapper li { justify-content: center; align-items: center; box-sizing: border-box; text-align: center; } .demo-wrapper li:nth-child(even) { background-color: antiquewhite; } .demo-wrapper li:nth-child(odd) { background-color: lightpink; } .demo-wrapper[axis='x'] li { display: inline-flex; flex: auto; height: 200px; width: 200px; line-height: 200px; } .demo-wrapper[axis='y'] li { display: flex; height: 50px; line-height: 50px; } .demo-wrapper[axis='y'] li>.ax-scroll { flex: auto; } .demo-wrapper .demo-start, .demo-wrapper .demo-end { background-color: rgba(255, 255, 255, .5); width: 100%; text-align: center; transition: all 200ms ease; position: absolute; left: 0; } .demo-wrapper .demo-start { top: -2.8rem; } .demo-wrapper .demo-end { bottom: -2.8rem; } .demo-wrapper .demo-start[show] { top: 0; } .demo-wrapper .demo-end[show] { bottom: 0; } .demo-wrapper[display='grid'][axis='x'] ul { display: inline-flex; width: 2000px; height: 400px; flex-wrap: wrap; flex-direction: column; } .demo-wrapper[display='grid'][axis='y'] li { width: 25%; height: 10rem; }
坐标轴
插件默认垂直滚动,通过axis
参数改变滚动方向,默认为“y”,可填“x”。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll02"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll02',{ axis:'x' });
-
<同上>
显示滚动条
将barShow
参数设为true即激活,但是默认是不显示状态,当鼠标悬浮在外容器上才显示。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll01"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <div class="demo-wrapper" id="scroll02"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll14'); new axScroll('#scroll15',{ axis:'x' });
-
<同上>
修改结构
内容器使用了MutationObserver
监听,即内容器节点发生变化时会自动异步更新内外容器的尺寸和滚动条尺寸。如果需要手动更新内外容器关系请使用updateDiff
方法或response
方法。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll22"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <button class="ax-btn" id="replace01">替换为11条内容</button> <button class="ax-btn" id="replace02">替换为3条内容</button>
-
let replaceIns = new axScroll('#scroll22',{ barShow: true, }), replaceBtn01 = document.querySelector('#replace01'), replaceBtn02 = document.querySelector('#replace02'); replaceBtn01.onclick = () => { replaceIns.wrapperDom.innerHTML = `
- 新元素1
- 新元素2
- 新元素3
- 新元素4
- 新元素5
- 新元素6
- 新元素7
- 新元素8
- 新元素9
- 新元素10
- 新元素11 `; } replaceBtn02.onclick = () => { replaceIns.wrapperDom.innerHTML = `
- 新元素1
- 新元素2 `; }
-
<同上>
网格布局
通过css设置可创建弹性网格布局,需要设定内容器的宽值和高值(能被子元素宽高值整除)。制作轮播图插件常用到。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll01"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <div class="demo-wrapper" id="scroll02"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll12', { axis: 'x' }); new axScroll('#scroll13');
-
<同上>
未绑定事件
通过设置unbound
参数可设置内容器中禁止触发滚动的元素,在unbound元素内将禁止触发滚动或漂移,而按普通鼠标事件执行,比如划选;该参数是一个对象,属性如下:
- selector:节点选择器,通常为.className或nodeName等节点选择器,也可以是一个节点或节点数组
- attr:未绑定事件的元素追加属性,默认为“unbound”
- 子元素1
- 子元素2
- 子元素3
- 子元素4(未绑定事件元素,可划选)
- 子元素5
- 子元素6
- 子元素7
- 子元素8(未绑定事件元素,可划选)
- 子元素9
- 子元素10
- 子元素11(未绑定事件元素,可划选)
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16(未绑定事件元素,可划选)
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll18"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll18',{ unbound:{selector:'.no',} });
-
<同上>
初始化
确通过参数transInit
设置初始滚动距离,该参数默认为0,支持三种格式:
- 1、数字,通常为负整数,如果有paddingStart参数,那么该参数可为一个小于paddingStart的正整数。
- 2、子元素物理节点
- 3、#id等字符串选择器,结果与2相同
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll03"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll03', { transInit: -290, }); new axScroll('#scroll21', { transInit: '#init03', });
-
<同上>
反弹边界
反弹边界默认是头尾,可修改paddingStart
和paddingEnd
参数改变反弹边界。paddingStart表示内容器距离头部的距离,默认为0即齐平,可自定义一个正整数;paddingEnd表示内容器距离尾部的距离,默认为0即齐平,可自定义一个正整数。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll11"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll11',{ paddingStart:100, paddingEnd:100, });
-
<同上>
嵌套
支持父子容器嵌套使用。最好给父层使用定宽+溢出隐藏。
- 子元素1
- 子元素2
- 子元素3
-
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll11"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scrollP'); new axScroll('#scrollC', { axis: 'x', }); new axScroll('#scrollC2');
-
<同上>
完成后监听
回弹有“完成”的概念,当到头或到底了,如果继续拖拽会拖出空白,拖出的空白到达一定宽度就被定义为“完成”。本插件参数completedTHR
表示拖出的空白宽度值,默认为50,也就是当空白宽度大于等于50px的时候使用onCompleted/completed
可监听到。
用户可在completed
监听中完成数据刷新或追加数据的操作。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll04"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll04',{ onCompleted:()=>{ console.log('空白宽度达到50px了') } });
-
<同上>
拖出空白监听
理解了“完成”概念,便容易理解“超出”概念,只要头尾拖出空白便可用onExceed/exceed
监听到,支持参数percent
(两位小数),该值等于:空白宽度/completedTHR
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll05"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll05',{ onExceed:(percent)=>{ console.log('超出比例:',percent); } });
-
<同上>
归位监听
拖拽操作后归位,到头使用onToStart/toStart
t监听,到尾使用onToEnd/toEnd
监听。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll06"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll06',{ onToStart: () => { console.log('到头了!'); }, onToEnd: () => { console.log('到尾了!'); } });
-
<同上>
偏移监听
当内容器不管通过什么方式促使其发生translate偏移时,通过translated
监听都可观察到,该监听方法支持一个参数即当前的偏移值。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll16"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll16',{ onTranslated: (value) => { console.log('发生了偏移:',value); } });
-
<同上>
过程监听
移动端拖拽操作有'touchstart'、'touchmove'和'touchend'操作,PC端有'mousedown'、'mousemove'、'mouseup'操作,那么自然就有按下开始、拖动和松开操作,我们通过onStart/start
、onMove/move
和onEnd/end
来监听。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll07"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll07',{ onStart: (arg) => { console.log('按下,上次translate值:',arg); }, onMove: (arg) => { console.log('移动,当前translate值:',arg); }, onEnd: (arg) => { console.log('松开,当前translate值:',arg); } });
-
<同上>
漂移
当用户在内容器上按下手指/鼠标左键,并快速甩开将产生内容器漂移效果,甩的越快滑动的距离则越远。漂移效果受参数drift
控制,其为一个对象,属性如下:
- mode:漂移模式,支持多种写法,详细如下:
- free:默认free模式,即滚动多远将有插件自行计算,视觉感受是:甩动(按下到抬起)越迅速、甩动(按下到抬起)距离越远则滚得越远
- neighbor:将滚动到鼠标(手指)按下的节点的下一个节点
- snap:将滚动到下一个可吸附节点,前提是开启了吸附功能(snap.enable:true)
- 0~1:添加大于0并小于等于1的小数,将滚动到外容器尺寸的比例位置。
- 大于1的整数:填写大于1的整数,将滚动到指定距离的位置
- timeTHR:产生漂移的间隔时间阈值,也就是手指按下到松开的时间,默认300,也就是说按下到松开的时间小于300ms是产生漂移的必要条件之一。该参数值越大表现为滚动距离越远。
- distTHR:产生漂移的间隔距离阈值,也就是手指按下到松开的滚动方向距离,默认20,也就是说按下到松开的滚动方向距离大于20px是产生漂移的必要条件之二。此参数是为了避免快速点击导致漂移。该参数值越小表现为越灵敏,轻碰一下就能产生漂移。
- coef:free模式下的漂移系数,值越大滚动距离越远,默认为2,请填一个正整数
free模式,自动计算滑行距离
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
neighbor模式,(鼠标或手指抬起时)漂移到下个兄弟节点
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
snap模式,漂移到下一个可吸附元素
- 子元素1
- 子元素2(不可吸附)
- 子元素3
- 子元素4(不可吸附)
- 子元素5
- 子元素6
- 子元素7(不可吸附)
- 子元素8
- 子元素9
- 子元素10
- 子元素11(不可吸附)
- 子元素12
- 子元素13
- 子元素14
- 子元素5(不可吸附)
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
比例模式,漂移外容器尺寸某比例
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
值模式,漂移指定距离
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<h5>free模式,自动计算滑行距离</h5> <div class="demo-wrapper" id="scroll08"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <h5>neighbor模式,(鼠标或手指抬起时)漂移到下个兄弟节点</h5> <div class="demo-wrapper" id="scroll08-n"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <h5>snap模式,漂移到下一个可吸附元素</h5> <div class="demo-wrapper" id="scroll08-a"> <ul> <li>子元素1</li> <li class="unsnaped">子元素2(不可吸附)</li> <li>子元素3</li> <li class="unsnaped">子元素4(不可吸附)</li> <li>子元素5</li> <li>子元素6</li> <li class="unsnaped">子元素7(不可吸附)</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li class="unsnaped">子元素11(不可吸附)</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li class="unsnaped">子元素5(不可吸附)</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <h5>比例模式,漂移外容器尺寸某比例</h5> <div class="demo-wrapper" id="scroll08-b"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <h5>值模式,漂移指定距离</h5> <div class="demo-wrapper" id="scroll08-z"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll08',{ drift: { //滚动距离变得很远 timeTHR: 500, //变得很灵敏 distTHR: 4, } }); new axScroll('#scroll08-n',{ drift: { mode: 'neighbor' } }); new axScroll('#scroll08-a',{ snap: { enable: true, unsnaped: '.unsnaped' }, drift: { mode: 'snap' } }); new axScroll('#scroll08-b',{ drift: { mode: 0.5 } }); new axScroll('#scroll08-z',{ drift: { mode: 200, } });
-
<同上>
滚轮操作
参数distMouse
可设置滚轮操作结果,该参数可设置的值如下:
- 值为0:默认滚动距离,即外容器尺寸1/4
- 大于0小于等于1的值:即滚动外容器尺寸等比例的距离,为1表示滚轮拨一下将滚过整个外容器距离。
- 大于1的正整数:即具体的滚动距离。
- neighbor:滚动到下一个兄弟节点(鼠标悬浮节点的兄弟节点),自动判断方向
- snap:滚动到下一个可吸附的兄弟节点,需与snap.enable:true配合使用
neighbor模式,滚动到鼠标悬浮节点的下个兄弟节点
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
snap模式,滚动到下一个可吸附元素
- 子元素1
- 子元素2(不可吸附)
- 子元素3
- 子元素4(不可吸附)
- 子元素5
- 子元素6
- 子元素7(不可吸附)
- 子元素8
- 子元素9
- 子元素10
- 子元素11(不可吸附)
- 子元素12
- 子元素13
- 子元素14
- 子元素5(不可吸附)
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
比例模式,滚动外容器尺寸某比例
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
值模式,滚动指定距离
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<h5>neighbor模式,滚动到鼠标悬浮节点的下个兄弟节点</h5> <div class="demo-wrapper" id="scroll30-n"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <h5>snap模式,滚动到下一个可吸附元素</h5> <div class="demo-wrapper" id="scroll30-a"> <ul> <li>子元素1</li> <li class="unsnaped">子元素2(不可吸附)</li> <li>子元素3</li> <li class="unsnaped">子元素4(不可吸附)</li> <li>子元素5</li> <li>子元素6</li> <li class="unsnaped">子元素7(不可吸附)</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li class="unsnaped">子元素11(不可吸附)</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li class="unsnaped">子元素5(不可吸附)</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <h5>比例模式,滚动外容器尺寸某比例</h5> <div class="demo-wrapper" id="scroll30-b"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <h5>值模式,滚动指定距离</h5> <div class="demo-wrapper" id="scroll30-z"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll30-n',{ distMouse: 'neighbor', }); new axScroll('#scroll30-a',{ snap: { enable: true, unsnaped: '.unsnaped' }, distMouse: 'snap', }); new axScroll('#scroll30-b',{ distMouse: 0.5, }); new axScroll('#scroll30-z',{ distMouse:200, });
-
<同上>
阻止回弹
当拖出空白时可阻止回弹以便于进行某些操作。onBeforeToStart
参数可阻止回弹头部,onBeforeToEnd
参数可阻止回弹尾部,均支持参数persent(两位小数),如果返回true则直接回弹,如果不是则需要手动回弹。
内置方法this.toStart()
方法可回弹头部;this.toEnd()
可回弹尾部。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll09"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll09',{ onBeforeToStart: function (percent) { console.log('完成了', percent); new axMessage({ content:'完成了,2秒后回弹!' }).show(); setTimeout(()=>{ this.toStart(); },2000) }, onBeforeToEnd: function (percent) { console.log('完成了', percent); new axMessage({ content:'完成了,立即回弹!' }).show(); return true; }, });
-
<同上>
变量和操作方法
本插件有系列内部成员变量和内部操作方法,用户根据这些变量和方法可以自由操作实例,据此可方便与其他组件进行交互。请按下F12按键打开浏览器控制台来观摩以下实例。
内部成员变量如下:
this.targetDom
:外容器节点this.wrapperDom
:内容器节点this.transInit
:内容器初始偏移值this.transLast
:内容器上一次偏移值this.transNow
:内容器当前偏移值this.difference
:外容器和内容器尺寸差值this.distJitter
:抖动距离(按下->移动->松开的距离)this.targetDomSize
:外容器尺寸值(高度或宽度值)this.wrapperDomSize
:内容器尺寸值(高度或宽度值)this.snaped
:当前被吸附的子元素(节点)this.snapeds
:可被吸附的子元素(节点数组)this.unsnapeds
:不可被吸附的子元素(节点数组)this.unbounds
:未绑定事件的子元素(节点数组),这些节点未绑定鼠标和触摸事件,可复制内容this.destroyed
:销毁状态,true/false
内部操作方法如下:
getTranslateValue()
:获得当前内容器的偏移值,无参数updateDiff()
:更新外容器和内容器的尺寸值和滚动条尺寸值,无参数,当向内容器插入节点并需要同步执行其他操作需要使用该方法response()
:该方法在updateDiff方法基础上加上了自动回弹头部或尾部的功能locateTo(value,snap=true,callback)
:定位到某个位置,无动画效果,支持三个参数:- value:内容器偏移值,必填项,可为具体数值也可为子元素#id或子元素节点(取子元素的offset值的负值作为偏移值)
- snap:跳转后是否自动吸附(前提需要设定参数snap值),选填项,,默认true
- callback:回调函数,跳转后执行(异步),选填项,支持两个参数即传入的原始值和偏移距离
scrollTo(value, duration,callback)
:滚动到某个偏移值,有动画效果,支持两个参数,参数说明如下:- value:内容器偏移值,必填项,可为具体数值也可为子元素#id或子元素节点(取子元素的offset值的负值作为偏移值)
- duration:滚动持续时间,选填项,如果不指定插件将自动计算动画时间
- callback:回调函数,动画完成后执行(异步),选填项,支持两个参数即传入的原始值和偏移距离
setsnaped(options)
:设置吸附到某个元素(前提是snap.enable:true),该方法与scrollTo相比既会触发滚动也会触发吸附监听,参数为一个对象,属性说明如下:- force:是否强制触发吸附监听,默认等同于snap.force,即false,插件默认:如果target元素已经是吸附状态将不会发生任何事情,使用force:true之后会再次触发吸附监听
- target:将要被吸附的元素,可以是#id等节点选择器或者元素节点
- duration:被吸附的元素发生滚动时的持续时间,为空则由插件自动计算
- callback:被吸附的元素滚动完成时的回调函数
toStart(duration)
:回弹头部,支持一个参数即动画持续时间,默认等于options.durationtoEnd(duration)
:回弹尾部,支持一个参数即动画持续时间,默认等于options.durationadd(data, options)
:给内容器添加子元素,支持两个参数,详细见下方示例。remove(placement = 'end', callback)
:给内容器删除子元素,支持两个参数,详细见下方示例。addTranslate(value)
:给内容器追加偏移量,value即为新增加的偏移量(正整数),当往内容器头部追加节点时有用updateContent(data, callback)
:更新容器内容,支持两个参数,calback回调无参数,其中data支持以下格式:- #id等节点选择器:将从页面找到对应的节点,将其HTML文本写入内容器
- 纯文本:直接作为文本写入内容器
- 节点:整体append到内容器
- 节点数组:所有节点依次append到内容器
- 节点碎片:所有节点依次append到内容器
init(callback)
:初始化实例,支持回调函数,回调无参数,请在销毁之后才使用该方法,否则不需要使用该方法destroy(callback)
:销毁实例,支持回调函数,回调无参数
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll10"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li id="child12">子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li id="child20">子元素20</li> </ul> <div class="demo-start"><u>正在加载...</u><i></i></div> <div class="demo-end"><u>正在加载...</u><i></i></div> </div> <div class="ax-break"></div> <button class="ax-btn" id="toEnd">到尾</button> <button class="ax-btn" id="toStart">到头</button> <button class="ax-btn" id="to500">平滑滚到-500px</button> <button class="ax-btn" id="to12">平滑滚到子元素12</button> <button class="ax-btn" id="to20">平滑滚到子元素20</button> <button class="ax-btn" id="to300">直接定位到-300px</button>
-
let me = new axScroll('#scroll10',{ onBeforeToEnd: function (percent) { if (percent >= 1) { let item = axAddElem('li', '', '尾部新增子元素' + percent); this.wrapperDom.appendChild(item); //尾部追加子元素不会导致translate偏移量改变 } return true; }, onBeforeToStart: function (percent) { if (percent >= 1) { let item = axAddElem('li', '', '头部新增子元素' + percent); this.wrapperDom.insertAdjacentElement('afterbegin', item); let size = item.getBoundingClientRect().height; //头部追加子元素会导致translate偏移量改变,所以需要传入新增加的size(高度) this.addTranslate(size); } return true; } }), toStart = document.querySelector('#toStart'), toEnd = document.querySelector('#toEnd'), to500 = document.querySelector('#to500'), to300 = document.querySelector('#to300'), to12 = document.querySelector('#to12'), to20 = document.querySelector('#to20'), loadingStart = me.targetDom.querySelector('.demo-start'), iStart = loadingStart.querySelector('i'), uStart = loadingStart.querySelector('u'), loadingEnd = me.targetDom.querySelector('.demo-end'), iEnd = loadingEnd.querySelector('i'), uEnd = loadingEnd.querySelector('u'); toStart.onclick = () => { me.toStart(); } toEnd.onclick = () => { me.toEnd(); } to500.onclick = () => { me.scrollTo(-500); } to300.onclick = () => { me.locateTo(-300); } to12.onclick = () => { me.scrollTo('#child12'); } to20.onclick = () => { me.scrollTo('#child20'); } me.on('exceed', (percent, placement) => { if (placement === 'start') { loadingStart.setAttribute('show', ''); if (percent >= 1) { uStart.innerHTML = '拖拽完成!松开可追加子节点!'; iStart.innerHTML = ''; } else { iStart.innerHTML = percent; } } else if (placement === 'end') { loadingEnd.setAttribute('show', ''); if (percent >= 1) { uEnd.innerHTML = '拖拽完成!松开可追加子节点!'; iEnd.innerHTML = ''; } else { iEnd.innerHTML = percent; } } }).on('toStart', () => { loadingStart.removeAttribute('show'); uStart.innerHTML = '正在加载...'; }).on('toEnd', () => { loadingEnd.removeAttribute('show'); uEnd.innerHTML = '正在加载...'; });
-
<同上>
添加子元素
对内容器添加子元素会改变内容器的尺寸继而改变内容器偏移值,此时需要修复内容器和外容器的关系。对内容器添加子元素的方法有两种:
- this.add(data,options):使用内置方法增加子元素,支持两个参数:参数data可为fragment、节点数组或一个节点对象。
- data:添加的子元素对象,必填项,可为fragment、节点数组或一个节点对象。
- options:操作参数,支持三个属性:
- options.placement:添加位置,默认end即内容器末尾,可选值如下:
- start:字符串,在头部添加子元素。
- end:字符串,在尾部添加子元素。
- 数字:例如2则表示在第三个子元素后面追加新子元素,第一个子元素索引为0。
- #id/.classname/nodename:选择器字符串,从内容器中找到该选择器的子元素并在该节点后面新增新节点。
- 节点:在该节点后面追加新子元素。
- options.fixed:头部新增子元素后是否修复内容器偏移值以使保持当前位置不变,默认为true,可填false即新增内容后回弹头部。
- options.callback:回调函数,支持两个参数即新添加的节点数组和目标节点。
- 手动添加:使用appendChild或insertAdjacentElement方法插入子元素,插件将自动异步更新内外容器关系;头部添加子元素会导致偏移跳跃,如果需要保持不滚动需要使用this.addTranslate(size)方法手动追加偏移量。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll17"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li id="pos">子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <button class="ax-btn" id="startAdd">头部追加子元素保持不动</button> <button class="ax-btn" id="startAddTo">头部追加子元素回弹</button> <button class="ax-btn" id="endAdd">尾部追加子元素</button> <button class="ax-btn" id="endAddTo">尾部追加子元素回弹</button> <button class="ax-btn" id="startAddManual">头部手动添加子元素</button> <button class="ax-btn" id="endAddManual">尾部手动添加子元素</button> <button class="ax-btn" id="indexAdd">在第三个子节点后添加子元素</button> <button class="ax-btn" id="idAdd">在指定子节点后添加子元素</button>
-
let addIns = new axScroll('#scroll17', { barShow: true, }), startAdd = document.querySelector('#startAdd'), startAddTo = document.querySelector('#startAddTo'), endAdd = document.querySelector('#endAdd'), endAddTo = document.querySelector('#endAddTo'), startAddManual = document.querySelector('#startAddManual'), endAddManual = document.querySelector('#endAddManual'), indexAdd = document.querySelector('#indexAdd'), idAdd = document.querySelector('#idAdd'); startAdd.onclick = () => { let time = new Date().valueOf(), doms = [axAddElem('li', '', `头部新元素01-${time}`), axAddElem('li', '', `头部新元素02-${time}`)]; addIns.add(doms, { placement: 'start', fixed: true }) } startAddTo.onclick = () => { let time = new Date().valueOf(), doms = [axAddElem('li', '', `头部新元素03-${time}`), axAddElem('li', '', `头部新元素04-${time}`)]; addIns.add(doms, { placement: 'start', fixed: false }) } endAdd.onclick = () => { let time = new Date().valueOf(), doms = [axAddElem('li', '', `尾部新元素01-${time}`), axAddElem('li', '', `尾部新元素02-${time}`)]; addIns.add(doms, { placement: 'end', fixed: true }) } endAddTo.onclick = () => { let time = new Date().valueOf(), doms = [axAddElem('li', '', `尾部新元素03-${time}`), axAddElem('li', '', `尾部新元素03-${time}`)]; addIns.add(doms, { placement: 'end', fixed: false }) } startAddManual.onclick = () => { let item = axAddElem('li', '', '头部新增子元素'); addIns.wrapperDom.insertAdjacentElement('afterbegin', item); let size = item.getBoundingClientRect().height; //头部追加子元素会导致translate偏移量改变,所以需要传入新增加的size(高度) addIns.addTranslate(size); } endAddManual.onclick = () => { let item = axAddElem('li', '', '尾部新增子元素'); addIns.wrapperDom.insertAdjacentElement('beforeend', item); addIns.updateDiff(); addIns.toEnd(); } indexAdd.onclick = () => { let time = new Date().valueOf(), doms = [axAddElem('li', '', `index=2后新元素01-${time}`), axAddElem('li', '', `index=2后新元素02-${time}`)]; addIns.add(doms, { placement: 2 }) } idAdd.onclick = () => { let time = new Date().valueOf(), doms = [axAddElem('li', '', `#id后新元素01-${time}`), axAddElem('li', '', `#id后新元素02-${time}`)]; addIns.add(doms, { placement: '#pos' }) }
-
<同上>
删除子元素
使用remove
方法删除子元素,一次删除一个。该方法支持两个参数:
- start:字符串,删除第一个子元素。
- end:字符串,删除最右一个子元素。
- 数字:删除该索引值的子元素。
- #id/.classname/nodename:选择器字符串,从内容器中找到该选择器的子元素并删除。
- 节点:删除该节点。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll117"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li id="pos2">子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <button class="ax-btn" id="startRemove">删除第一个</button> <button class="ax-btn" id="endRemove">删除最后一个</button> <button class="ax-btn" id="indexRemove">删除第三个</button> <button class="ax-btn" id="idRemove">删除指定节点</button>
-
let removeIns = new axScroll('#scroll117', { barShow: true, }), startRemove = document.querySelector('#startRemove'), endRemove = document.querySelector('#endRemove'), indexRemove = document.querySelector('#indexRemove'), idRemove = document.querySelector('#idRemove'); startRemove.onclick = () => { removeIns.remove('start') } endRemove.onclick = () => { removeIns.remove('end') } indexRemove.onclick = () => { removeIns.remove(2) } idRemove.onclick = () => { removeIns.remove('#pos2') }
-
<同上>
吸附和不可吸附
内容器的子元素默认无规则运动,当启用snap.enable:true
参数后将子元素自动吸附在起始线上。如果没有填写paddingStart参数,吸附起始线则是头部;如果填写了paddingStart参数,那么起始线是距离头部paddingStart值的位置。
参数snap.snaped
可指明将被自动吸附的元素,如果未指明将以内容器的第一级子元素作为可吸附元素。
内置变量this.snapeds
可获得当前的可被吸附的子元素节点(数组);内置变量this.snaped
可获得当前的被吸附的子元素节点。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll19"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <div class="demo-wrapper" id="scroll20"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll19',{ snap:{enable:true}, onEnd: function () { console.log(this.snaped); } }); new axScroll('#scroll20',{ paddingStart:100, snap:{enable:true}, onEnd: function () { console.log(this.snaped); } });
-
<同上>
参数snap.offset
可设定距离起始线的偏移距离,为一个正整数值,默认为0即不启用该参数,始终寻找最近的一个可吸附节点进行吸附。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll25"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll25',{ snap: { enable: true, //距离起始线前后20px才吸附 offset:20, }, });
-
<同上>
通过snap.unsnaped
参数可设置禁止吸附的子元素,该参数是类似#id、.className、nodeName等节点选择器,也可是节点或节点数组。
如果已经设置了参数snap.snaped
,那么将以snap.snaped参数为准,snap.unsnaped参数将无效。
- 子元素1
- 子元素2
- 子元素3(不可被吸附)
- 子元素4(不可被吸附)
- 子元素5(不可被吸附)
- 子元素6
- 子元素7
- 子元素8
- 子元素9(不可被吸附)
- 子元素10(不可被吸附)
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll24"> <ul> <li>子元素1</li> <li>子元素2</li> <li class="unsnaped">子元素3(不可被吸附)</li> <li class="unsnaped">子元素4(不可被吸附)</li> <li class="unsnaped">子元素5(不可被吸附)</li> <li >子元素6</li> <li>子元素7</li> <li>子元素8</li> <li class="unsnaped">子元素9(不可被吸附)</li> <li class="unsnaped">子元素10(不可被吸附)</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div>
-
new axScroll('#scroll24',{ snap:{ enable:true, unsnaped:'.unsnaped' }, });
-
<同上>
更新内容
使用updateContent
方法可项内容器重新填入节点。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="scroll23"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div id="content" style="display: none;"> <li>唐朝</li> <li>宋朝</li> <li>元朝</li> <li>明朝</li> <li>清朝</li> <li>民国</li> <li>共和国</li> </div> <div class="ax-break"></div> <button class="ax-btn" id="contentBtn">更新内容</button>
-
let contentIns = new axScroll('#scroll23',{ barShow: true, }), contentBtn = document.querySelector('#contentBtn'); contentBtn.onclick = () => { contentIns.updateContent('#content'); }
-
<同上>
销毁实例
通过使用this.destroy(callback)
方法销毁实例,支持回调函数,回调无参数;销毁后可通过init
初始化重新启用。
- 子元素1
- 子元素2
- 子元素3
- 子元素4
- 子元素5
- 子元素6
- 子元素7
- 子元素8
- 子元素9
- 子元素10
- 子元素11
- 子元素12
- 子元素13
- 子元素14
- 子元素15
- 子元素16
- 子元素17
- 子元素18
- 子元素19
- 子元素20
-
<div class="demo-wrapper" id="destroy"> <ul> <li>子元素1</li> <li>子元素2</li> <li>子元素3</li> <li>子元素4</li> <li>子元素5</li> <li>子元素6</li> <li>子元素7</li> <li>子元素8</li> <li>子元素9</li> <li>子元素10</li> <li>子元素11</li> <li>子元素12</li> <li>子元素13</li> <li>子元素14</li> <li>子元素15</li> <li>子元素16</li> <li>子元素17</li> <li>子元素18</li> <li>子元素19</li> <li>子元素20</li> </ul> </div> <div class="ax-break"></div> <button class="ax-btn" id="destroyBtn">销毁</button> <button class="ax-btn" id="initBtn">初始化</button>
-
let destroyIns = new axScroll('#destroy'), destroyBtn = document.querySelector('#destroyBtn'), initBtn = document.querySelector('#initBtn'); destroyBtn.onclick = () => { destroyIns.destroy(()=>{ alert('实例销毁了'); }); } initBtn.onclick = () => { destroyIns.init(()=>{ alert('实例初始化了'); }); }
-
<同上>
参数选项
document.addEventListener("DOMContentLoaded", function() { var demo1 = new axScroll({ wrapper: '',//内滚动容器,可填#id、.className、nodeName或节点 axis: 'y',//滚动方向,默认横轴滚动(水平滚动),可选择'y' snap: { enable: false,//是否吸附子元素,默认为false即不吸附,可设定true自动吸附,吸附会触发吸附监听 force: false,//即使是当前节点已经是吸附元素了是否还强制再次吸附(目的是触发吸附监听),默认false,可选择true offset: 0,//偏差值,默认为0即表示不使用该参数,如果需要元素必须在起始线附近才吸附则可设置该参数,请填写一个正整数 snapped: '',//可吸附的子元素,通常为.className或nodeName等节点选择器,也可以是一个节点或节点数组,这些元素将可吸附 unsnapped: '',//可跳过的子元素,通常为.className或nodeName等节点选择器,也可以是一个节点或节点数组,这些元素将不可吸附;如果一个元素即是snapped又是unsnapped,那么会被定义为unsnapped }, unbound: { attr: 'unbound',//未绑定事件的元素被设置的属性,默认unbound selector: '',//未绑定事件元素,通常为.className或nodeName等节点选择器,也可以是一个节点或节点数组,未绑定事件元素不可拖拽滚动,可复制文本 }, dampingRatio: 0.5,//拖拽出空白区域时的阻尼系数,直观表现为拖拽比较迟滞 transInit: 0,//初始滚动距离,默认为0,支持整数、节点和#id等字符串 toInitMode: 'scroll',//初始化时滚动模式,默认scroll即平滑滚动到初始位置,可选择locate直接跳到初始位置(无动画) duration: 300,//执行动画基础时间,单位ms distMouse: 0,//鼠标滚动距离,默认为外容器1/4,,如果是一个<=1的值,那么将按外容器尺寸的百分比滚动 //默认为0即外容器1/4 //可填大于1的整数值(PC中滚动一次是60px) //可填大于0小于等于1的小树值,那么将按外容器尺寸的百分比滚动 //填'snap',则滚动到下一个可吸附节点 //填'neighbor',则滚动到下一个兄弟节点 completedTHR: 50,//拖出首尾空白多长表示完成,单位px drift: { enable: true,//是否开启漂移模式,默认true开启,可选择false不开启 mode: 'free',//漂移模式, //默认free模式即产生漂移后是否自动计算距离, //填neighbor模式即滚动鼠标(手指)按下的节点的下一个兄弟节点, //填snap模式即滚动到下一个可吸附节点, //填一个小于等于1的小数,滚动距离为外容器尺寸*该参数 //填一个大于1的具体数值,滚动距离即为该参数 timeTHR: 300,//产生甩动漂移的时间阈值,小于该值会有漂移效果(与drift.distTHR配合),单位ms distTHR: 20,//产生甩动漂移的抖动阈值,小于该值则不漂移(与drift.timeTHR配合),单位px,避免垂直(相对)方向滑动也漂移 coef: 2,//free模式下的漂移系数,值越大滚动距离越远,默认为2,请填一个正整数 }, paddingStart: 0,//头部反弹边界距离,是正整数,默认为0即与头部贴合 paddingEnd: 0,//尾部反弹边界距离,是正整数,默认为0即与尾部贴合 mouseINR: 300,//鼠标滚轮节流间隔延时,避免频繁触发操作导致发生某些未知错误,默认为300,可设置一个正整数,单位ms startINR: 300,//开始触发节流间隔延时,避免频繁触发操作导致发生某些未知错误,默认为300,可设置一个正整数,单位ms barShow: false,//是否显示虚拟滚动条,默认false不显示,可选择true insertable: true,//动画运行中是否可以再插入执行拖拽和滚轮事件,默认true允许,可选择false禁止,false的表现为动画完成后才可进行下一次拖拽或滚轮事件 breakpoints: {},//使用断点以适配终端,详情查看ax-utils-other.php页面 onBeforeToStart: '',//头部拖出空白达到completedTHR准备回弹时回调,同步代码返回true将自动回弹,否则需要手动回弹,支持参数percent,两位小数值 onBeforeToEnd: '',//尾部拖出空白达到completedTHR准备回弹时回调,同步代码返回true将自动回弹,否则需要手动回弹,支持参数percent,两位小数值 onInit: '',//回调函数,加载完毕执行,无参数 onAdd: '',//回调函数,添加新节点后执行,支持一个参数即新添加的子节点数组 onRemove: '',//回调函数,删除节点后执行,支持一个参数即刚删除的子节点 onCompleted: '',//回调函数,拖出空白长度大于等于completedTHR时执行,支持一个参数placement,即拖拽位置,为start或end onExceed: '',//回调函数,拖到头或尾,直至出现空白区域时执行,支持两个参数:percent和placement,percent是一个小数即:空白长度/completedTHR,支持参数percent,两位小数值;placement为start或end onStart: '',//回调函数,手指/鼠标按下执行,支持一个参数transValue即内容器上一次偏移值 onMove: '',//回调函数,手指/鼠标拖动过程执行,支持一个参数transValue即内容器当前偏移值 onEnd: '',//回调函数,松开手指/鼠标后执行,支持一个参数transValue即内容器当前偏移值 onToStart: '',//回调函数,回弹头部后执行,无参数 onToEnd: '',//回调函数,回弹尾部后执行,无参数 onTranslated: '',//回调函数,内容器发生translate偏移时执行,支持一个参数transValue即内容器当前偏移值 onRefactored: '',//回调函数,内容器发生节点变化(删除或添加子元素)时执行,无参数 onSnap: '',//回调函数,开始吸附执行,支持一个参数即当前被吸附子元素 onSnapped: '',//回调函数,完成吸附后执行,支持一个参数即当前被吸附子元素 onUpdateContent: '',//回调函数,更新内容后执行,无参数 onResized: '',//回调函数,外容器尺寸变化后执行,支持两个参数即rect值和容器节点(target或wrapper) onMouse: '',//回调函数,滚轮操作后执行,支持一个参数即目标translate值 onScrolled: '',//回调函数,完成一次滚动后执行,支持两个参数即原始值(节点)和目标translate值 onLocated: '',//回调函数,完成一次跳转后执行,支持两个参数即原始值(节点)和目标translate值 onClick: '',//回调函数,快速触摸或点击后执行,支持一个参数即点击目标对象节点 onDestroy: '',//回调函数,销毁后执行,无参数 }); });