123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /**
- * 此为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
- };
|