217 lines
6.8 KiB
JavaScript
217 lines
6.8 KiB
JavaScript
/**
|
||
* 此为sjs模块,专门为支付宝小程序设计
|
||
* sjs语法与wxs基本相同,但有一些细微差别
|
||
*/
|
||
|
||
// 开始触摸
|
||
function touchstart(event, ownerInstance) {
|
||
// 获取触发事件的组件实例
|
||
var instance = event.instance;
|
||
// 获取组件状态
|
||
var state = instance.getState();
|
||
if (state.disabled) return;
|
||
|
||
var touches = event.touches;
|
||
// 如果是多指触控,不允许操作
|
||
if (touches && touches.length > 1) return;
|
||
|
||
// 标识当前为滑动中状态
|
||
state.moving = true;
|
||
// 记录触摸开始点的坐标
|
||
state.startX = touches[0].pageX;
|
||
state.startY = touches[0].pageY;
|
||
|
||
ownerInstance.callMethod('closeOther');
|
||
}
|
||
|
||
// 触摸滑动
|
||
function touchmove(event, ownerInstance) {
|
||
var instance = event.instance;
|
||
var state = instance.getState();
|
||
if (state.disabled || !state.moving) return;
|
||
|
||
var touches = event.touches;
|
||
var pageX = touches[0].pageX;
|
||
var pageY = touches[0].pageY;
|
||
var moveX = pageX - state.startX;
|
||
var moveY = pageY - state.startY;
|
||
var buttonsWidth = state.buttonsWidth;
|
||
|
||
// 移动的X轴距离大于Y轴距离时,禁止页面滚动
|
||
if (Math.abs(moveX) > Math.abs(moveY) || Math.abs(moveX) > state.threshold) {
|
||
// 支付宝小程序阻止事件传播
|
||
if (event.preventDefault) {
|
||
event.preventDefault();
|
||
}
|
||
if (event.stopPropagation) {
|
||
event.stopPropagation();
|
||
}
|
||
}
|
||
|
||
// 如果Y轴移动距离大于X轴,认为是上下滑动
|
||
if (Math.abs(moveX) < Math.abs(moveY)) return;
|
||
|
||
// 限制滑动范围
|
||
if (state.status === 'open') {
|
||
// 开启状态下向左滑动需要忽略
|
||
if (moveX < 0) moveX = 0;
|
||
// 最大移动距离为按钮总宽度
|
||
if (moveX > buttonsWidth) moveX = buttonsWidth;
|
||
// 移动收起菜单
|
||
moveSwipeAction(-buttonsWidth + moveX, instance, ownerInstance);
|
||
} else {
|
||
// 关闭状态下右滑需要忽略
|
||
if (moveX > 0) moveX = 0;
|
||
// 限制最大滑动距离
|
||
if (Math.abs(moveX) > buttonsWidth) moveX = -buttonsWidth;
|
||
// 移动显示菜单
|
||
moveSwipeAction(moveX, instance, ownerInstance);
|
||
}
|
||
}
|
||
|
||
// 触摸结束
|
||
function touchend(event, ownerInstance) {
|
||
var instance = event.instance;
|
||
var state = instance.getState();
|
||
if (!state.moving || state.disabled) return;
|
||
|
||
var touches = event.changedTouches ? event.changedTouches[0] : {};
|
||
var pageX = touches.pageX;
|
||
var moveX = pageX - state.startX;
|
||
|
||
if (state.status === 'open') {
|
||
// 展开状态下继续左滑无需操作
|
||
if (moveX < 0) return;
|
||
// 点击内容区域收起菜单
|
||
if (moveX === 0) {
|
||
return closeSwipeAction(instance, ownerInstance);
|
||
}
|
||
// 根据滑动距离决定是否关闭
|
||
if (Math.abs(moveX) < state.threshold) {
|
||
openSwipeAction(instance, ownerInstance);
|
||
} else {
|
||
closeSwipeAction(instance, ownerInstance);
|
||
}
|
||
} else {
|
||
// 关闭状态下右滑无需操作
|
||
if (moveX > 0) return;
|
||
// 根据滑动距离决定是否打开
|
||
if (Math.abs(moveX) < state.threshold) {
|
||
closeSwipeAction(instance, ownerInstance);
|
||
} else {
|
||
openSwipeAction(instance, ownerInstance);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取过渡时间
|
||
function getDuration(value) {
|
||
if (value.toString().indexOf('s') >= 0) return value;
|
||
return value > 30 ? value + 'ms' : value + 's';
|
||
}
|
||
|
||
// 移动滑动选择器内容区域
|
||
function moveSwipeAction(moveX, instance, ownerInstance) {
|
||
var state = instance.getState();
|
||
// 支付宝小程序获取按钮实例
|
||
var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button');
|
||
|
||
// 设置内容部分的偏移
|
||
instance.requestAnimationFrame(function() {
|
||
instance.setStyle({
|
||
transition: 'none',
|
||
transform: 'translateX(' + moveX + 'px)',
|
||
'-webkit-transform': 'translateX(' + moveX + 'px)'
|
||
});
|
||
});
|
||
}
|
||
|
||
// 展开滑动菜单
|
||
function openSwipeAction(instance, ownerInstance) {
|
||
var state = instance.getState();
|
||
var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button');
|
||
var duration = getDuration(state.duration);
|
||
var buttonsWidth = -state.buttonsWidth;
|
||
|
||
instance.requestAnimationFrame(function() {
|
||
instance.setStyle({
|
||
transition: 'transform ' + duration,
|
||
transform: 'translateX(' + buttonsWidth + 'px)',
|
||
'-webkit-transform': 'translateX(' + buttonsWidth + 'px)'
|
||
});
|
||
});
|
||
setStatus('open', instance, ownerInstance);
|
||
}
|
||
|
||
// 设置菜单状态
|
||
function setStatus(status, instance, ownerInstance) {
|
||
var state = instance.getState();
|
||
state.status = status;
|
||
ownerInstance.callMethod('setState', status);
|
||
}
|
||
|
||
// 收起滑动菜单
|
||
function closeSwipeAction(instance, ownerInstance) {
|
||
var state = instance.getState();
|
||
var buttons = ownerInstance.selectAllComponents('.u-swipe-action-item__right__button');
|
||
var len = buttons.length;
|
||
var duration = getDuration(state.duration);
|
||
|
||
instance.requestAnimationFrame(function() {
|
||
// 设置菜单主体内容
|
||
instance.setStyle({
|
||
transition: 'transform ' + duration,
|
||
transform: 'translateX(0px)',
|
||
'-webkit-transform': 'translateX(0px)'
|
||
});
|
||
// 设置按钮为收起状态
|
||
for (var i = len - 1; i >= 0; i--) {
|
||
buttons[i].setStyle({
|
||
transition: 'transform ' + duration,
|
||
transform: 'translateX(0px)',
|
||
'-webkit-transform': 'translateX(0px)'
|
||
});
|
||
}
|
||
});
|
||
setStatus('close', instance, ownerInstance);
|
||
}
|
||
|
||
// status状态变化处理
|
||
function statusChange(newValue, oldValue, ownerInstance, instance) {
|
||
var state = instance.getState();
|
||
if (state.disabled) return;
|
||
|
||
if (newValue === 'close' && state.status === 'open') {
|
||
closeSwipeAction(instance, ownerInstance);
|
||
} else if (newValue === 'open' && state.status === 'close') {
|
||
openSwipeAction(instance, ownerInstance);
|
||
}
|
||
}
|
||
|
||
// 菜单尺寸变化处理
|
||
function sizeChange(newValue, oldValue, ownerInstance, instance) {
|
||
var state = instance.getState();
|
||
state.disabled = newValue.disabled;
|
||
state.duration = newValue.duration;
|
||
state.show = newValue.show;
|
||
state.threshold = newValue.threshold;
|
||
state.buttons = newValue.buttons;
|
||
|
||
if (state.buttons) {
|
||
var len = state.buttons.length;
|
||
var buttonsWidth = 0;
|
||
var buttons = newValue.buttons;
|
||
for (var i = 0; i < len; i++) {
|
||
buttonsWidth += buttons[i].width;
|
||
}
|
||
state.buttonsWidth = buttonsWidth;
|
||
}
|
||
}
|
||
|
||
export default {
|
||
touchstart,
|
||
touchmove,
|
||
touchend,
|
||
statusChange,
|
||
sizeChange
|
||
}; |