185 lines
4.8 KiB
XML
185 lines
4.8 KiB
XML
/**
|
|
* 轮播触屏脚本
|
|
*/
|
|
// 轮播容器ID
|
|
var containerId = '#swiperContainer';
|
|
// 移动阈值
|
|
var moveThreshold = 0.3;
|
|
// 轮播方向
|
|
var DIRECTION = {
|
|
// 水平
|
|
HOR: 'horizontal',
|
|
// 垂直
|
|
VER: 'vertical',
|
|
};
|
|
|
|
function updateMoveInfo(state, event) {
|
|
var touchPoint = event.touches[0];
|
|
state.moveX = touchPoint.clientX - state.startX;
|
|
state.moveY = touchPoint.clientY - state.startY;
|
|
}
|
|
|
|
function moveContainer(state, reset) {
|
|
if (state.direction === DIRECTION.HOR) {
|
|
var offset = reset ? state.offsetX : state.offsetX + state.moveX;
|
|
// console.log(DIRECTION.HOR, state.moveX);
|
|
if (offset > 0) {
|
|
offset = Math.min(state.width * moveThreshold, offset);
|
|
} else {
|
|
offset = Math.max(-state.width * (state.total - (1 - moveThreshold)), offset);
|
|
}
|
|
setOffset(state, offset, 0, !reset);
|
|
} else {
|
|
var offset = reset ? state.offsetY : state.offsetY + state.moveY;
|
|
// console.log(DIRECTION.VER, state.moveY);
|
|
if (offset > 0) {
|
|
offset = Math.min(state.height * moveThreshold, offset);
|
|
} else {
|
|
offset = Math.max(-state.height * (state.total - (1 - moveThreshold)), offset);
|
|
}
|
|
setOffset(state, 0, offset, !reset);
|
|
}
|
|
}
|
|
|
|
function setOffset(state, offsetX, offsetY, disAni) {
|
|
var transform = 'translate3d(' + (offsetX || 0) + 'px, ' + (offsetY || 0) + 'px, 0)';
|
|
var styles = {
|
|
// '-webkit-transform': transform,
|
|
transform: transform,
|
|
};
|
|
if (disAni) {
|
|
styles['transition'] = 'none';
|
|
}
|
|
state.container.setStyle(styles);
|
|
}
|
|
|
|
function initContainer(ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.container = state.container || ownerInstance.selectComponent(containerId);
|
|
}
|
|
|
|
function startDrag(event, ownerInstance) {
|
|
initContainer(ownerInstance);
|
|
var state = ownerInstance.getState();
|
|
var touchPoint = event.touches[0];
|
|
state.moveX = 0;
|
|
state.moveY = 0;
|
|
state.startX = touchPoint.clientX;
|
|
state.startY = touchPoint.clientY;
|
|
ownerInstance.callMethod('pause');
|
|
}
|
|
|
|
function onDrag(event, ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.dragging = true;
|
|
updateMoveInfo(state, event);
|
|
moveContainer(state);
|
|
}
|
|
|
|
function endDrag(event, ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.dragging = false;
|
|
ownerInstance.callMethod('replay');
|
|
var pageDir = '';
|
|
if (state.direction === DIRECTION.HOR) {
|
|
pageDir = getPageDir(state.moveX, state.width);
|
|
} else {
|
|
pageDir = getPageDir(state.moveY, state.height);
|
|
}
|
|
if (pageDir) {
|
|
ownerInstance.callMethod(pageDir, { source: 'touch' });
|
|
return;
|
|
}
|
|
// 重置
|
|
moveContainer(state, true);
|
|
}
|
|
/**
|
|
* 返回分页操作的方向
|
|
* @param move 移动距离
|
|
* @param size 容器尺寸
|
|
* @returns
|
|
*/
|
|
function getPageDir(move, size) {
|
|
if (move > 0) {
|
|
// 右滑超过阈值
|
|
if (move > size * moveThreshold) {
|
|
return 'prev';
|
|
}
|
|
} else {
|
|
// 左滑超过阈值
|
|
if (-move > size * moveThreshold) {
|
|
return 'next';
|
|
}
|
|
}
|
|
}
|
|
|
|
function changeOffsetByDirection(direction, newVal, ownerInstance) {
|
|
initContainer(ownerInstance);
|
|
var state = ownerInstance.getState();
|
|
if (state.direction !== direction) return;
|
|
var needInit = !state.inited && state.currentInited;
|
|
if (direction === DIRECTION.HOR) {
|
|
setOffset(state, state.offsetX, 0, needInit);
|
|
} else {
|
|
setOffset(state, 0, state.offsetY, needInit);
|
|
}
|
|
|
|
if (needInit) {
|
|
state.inited = true;
|
|
ownerInstance.callMethod('inited');
|
|
}
|
|
}
|
|
|
|
function changeOffsetX(newVal, oldVal, ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.offsetX = newVal;
|
|
changeOffsetByDirection(DIRECTION.HOR, newVal, ownerInstance);
|
|
}
|
|
|
|
function changeOffsetY(newVal, oldVal, ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.offsetY = newVal;
|
|
changeOffsetByDirection(DIRECTION.VER, newVal, ownerInstance);
|
|
}
|
|
function changeWidth(newVal, oldVal, ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.width = newVal;
|
|
}
|
|
|
|
function changeHeight(newVal, oldVal, ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.height = newVal;
|
|
}
|
|
|
|
function changeDirection(newVal, oldVal, ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.direction = newVal;
|
|
if (oldVal && newVal !== oldVal) {
|
|
state.inited = false;
|
|
changeOffsetByDirection(newVal, state.offsetY, ownerInstance);
|
|
}
|
|
}
|
|
|
|
function changeTotal(newVal, oldVal, ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.total = newVal;
|
|
}
|
|
|
|
function changeCurrentInited(newVal, oldVal, ownerInstance) {
|
|
var state = ownerInstance.getState();
|
|
state.currentInited = newVal;
|
|
}
|
|
|
|
module.exports = {
|
|
startDrag: startDrag,
|
|
onDrag: onDrag,
|
|
endDrag: endDrag,
|
|
changeOffsetX: changeOffsetX,
|
|
changeOffsetY: changeOffsetY,
|
|
changeWidth: changeWidth,
|
|
changeHeight: changeHeight,
|
|
changeDirection: changeDirection,
|
|
changeTotal: changeTotal,
|
|
changeCurrentInited: changeCurrentInited,
|
|
};
|