1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
| 这里进行思路分析,对照着代码分析 : 1. 首先获取到大盒子,在获取到其子元素,也就是视口 2.这里介绍一个方法,可以获取到元素宽度的一个方法document.documentElement.clientWidth; 3. 设置一个变量,相当于轮播图的索引, 4. 滑动的距离设置为全局变量 首先必须触发滑动事件 , 这里就得计算出当前的位置,因为要使用该参数来进行判断,当图片可以拖动了,但是问题出现了,当我下一次点击了时候,又回到了起始位置,所以咱们得使用之前位置加上当前滑动的距离,才可以避免这个问题,接下来使用左滑与右划事件,这里不做太多介绍,因为没有什么技术难度... 当左滑与右划实现之后,新的问题出现了,也就是动画队列,当我快速的滑动的时候,图片不会流畅的被拖动,所以需要清除动画,故为 scrollContainer.style.transition = 'none';
<script type="text/javascript"> var container = document.querySelector('.container'); var scrollContainer = container.children[0]; var sw = document.documentElement.clientWidth; var index = 0; var distance = 0;
swipe(container, { swipeLeft: function() { if (Math.abs(distance) > sw / 2) { if (index < 3) { index++; } }
scrollContainer.style.transition = 'transform .6s';
scrollContainer.style.transform = 'translateX(' + -index * sw + 'px)'; }, swipeRight: function() { if (Math.abs(distance) > sw / 2) { if (index > 0) { index--; } }
scrollContainer.style.transition = 'transform .6s';
scrollContainer.style.transform = 'translateX(' + -index * sw + 'px)'; }, drag: function(e) { distance = e.touches[0].pageX - e.info.startX; var current = -index * sw + distance; scrollContainer.style.transition = 'none';
scrollContainer.style.transform = 'translateX(' + current + 'px)'; } });
function swipe(el, options) {
var startX = 0; var startY = 0; var moveX = 0; var moveY = 0; var disX = 0; var disY = 0;
var isMove = false;
var defaults = { swipeLeft: function() {}, swipeRight: function() {}, swipeDown: function() {}, swipeUp: function() {}, drag: function() {} }
Object.assign(defaults, options);
el.addEventListener('touchstart', function(e) { startX = e.touches[0].pageX; startY = e.touches[0].pageY; disX = startX - el.offsetLeft; disY = startY - el.offsetTop; });
el.addEventListener('touchmove', function(e) { moveX = e.touches[0].pageX; moveY = e.touches[0].pageY; isMove = true;
e.info = { startX: startX, startY: startY, disX: disX, disY: disY }
defaults.drag.call(el, e);
});
el.addEventListener('touchend', function(e) { if (isMove) { var absX = Math.abs(moveX - startX); var absY = Math.abs(moveY - startY);
if (absX > absY) {
if (moveX - startX > 0) { defaults.swipeRight.call(el, e);
} else { defaults.swipeLeft.call(el, e); }
} else {
if (moveY - startY > 0) { defaults.swipeDown.call(el, e);
} else { defaults.swipeUp.call(el, e); } }
} isMove = false;
}); } </script>
|