我有这个水平旋转木马组件,我想让它适用于鼠标和滑动事件。 一切都运行正常,除了一点:在触摸设备中,如果用户试图垂直滑动以滚动整个页面,我不希望旋转木马水平滚动。
我在做什么,
这不起作用,我所做的一切都正确响应,但浏览器没有拿起并滚动页面。我希望我能正确地解释自己,所以你们可以帮助我......我没有在线的例子,因为这是一个秘密"我公司的项目...
由于
答案 0 :(得分:3)
我试图和你做同样的事情(是吗?)。关键是检查touchmove
当前触摸和最后一次触摸是否垂直于水平。如果触摸更多地从左到右或从右到左,则阻止事件的默认,否则忽略它。这是我最后写的。希望它适合你!
var gestures = function() {
var self = this,
coords = {
startX: null,
startY: null,
endX: null,
endY: null
};
self.$el.on('touchstart', function(e) {
coords.startX = e.originalEvent.targetTouches[0].clientX;
coords.startY = e.originalEvent.targetTouches[0].clientY;
coords.endX = coords.startX;
coords.endY = coords.startY;
});
self.$el.on('touchmove', function(e) {
var newX = e.originalEvent.targetTouches[0].clientX,
newY = e.originalEvent.targetTouches[0].clientY,
absX = Math.abs(coords.endX - newX),
absY = Math.abs(coords.endY - newY);
// If we've moved more Y than X, we're scrolling vertically
if (absX < absY) {
return;
}
// Prevents the page from scrolling left/right
e.preventDefault();
coords.endX = newX;
coords.endY = newY;
});
self.$el.on('touchend', function(e) {
var swipe = {},
deltaX = coords.startX - coords.endX,
deltaY = coords.startY - coords.endY,
absX = Math.abs(deltaX),
absY = Math.abs(deltaY);
swipe.distance = (absX > absY) ? absX : absY;
swipe.direction = (absX < absY) ?
(deltaY < 0 ? 'down' : 'up') :
(deltaX < 0 ? 'right' : 'left');
// console.log(swipe.direction + ' ' + swipe.distance + 'px');
// If we have a swipe of > 50px, let's use it!
if (swipe.distance > 50) {
if (swipe.direction === 'left') {
self.advance();
} else if (swipe.direction === 'right') {
self.retreat();
}
}
});
};
this
是我的滑块对象,$el
是容器元素。