@tarojs/components
Version:
175 lines (170 loc) • 6.03 kB
JavaScript
import { proxyCustomElement, HTMLElement, h, Host } from '@stencil/core/internal/client';
import { i as isElement } from './index3.js';
const areaCss = "taro-movable-area-core{width:10px;height:10px;display:block;position:relative}";
const MovableArea = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
constructor() {
super();
this.__registerHost();
/** 子元素集合 */
this.views = [];
/** 手势缩放 */
this.scaleLength = 0;
this.viewsChanged = () => {
this.views = [];
const elements = this.element.querySelectorAll('taro-movable-view-core');
Array.from(elements).forEach((element) => {
this.views.push(element);
});
this.updateArea();
};
this.handleTouchStart = (e) => {
const touches = e.touches;
if (!touches || touches.length <= 1) {
return;
}
const gap = {
width: touches[1].pageX - touches[0].pageX,
height: touches[1].pageY - touches[0].pageY
};
this.scaleLength = Math.sqrt(gap.width * gap.width + gap.height * gap.height);
if (this.scaleArea) {
return;
}
const find = (target, views) => {
const loop = (e, t) => {
if (!(e = e.parentNode)) {
return false;
}
return (!isElement(e) || e !== document.body) && (e === t || e === t.element || e.element === t || loop(e, t));
};
for (let i = 0; i < views.length; i++) {
const view = views[i];
if (target === view["element"] || loop(target, view)) {
return view;
}
}
};
const touch1 = find(touches[0].target, this.views);
const touch2 = find(touches[1].target, this.views);
this.scaleTarget = touch1 && touch1 === touch2 ? touch1 : undefined;
};
this.handleTouchMove = (e) => {
const touches = e.touches;
if (!touches || touches.length <= 1) {
return;
}
e.preventDefault();
const gap = {
width: touches[1].pageX - touches[0].pageX,
height: touches[1].pageY - touches[0].pageY
};
if (this.scaleLength > 0) {
this.updateScale(Math.sqrt(gap.width * gap.width + gap.height * gap.height) / this.scaleLength);
}
};
this.handleTouchEnd = (e) => {
var _a, _b;
if ((e.touches && e.touches.length) || !e.changedTouches) {
return;
}
this.scaleLength = 0;
if (this.scaleArea) {
this.views.forEach((element) => {
var _a;
(_a = element["endScale"]) === null || _a === void 0 ? void 0 : _a.call(element);
});
}
else {
(_b = (_a = this.scaleTarget) === null || _a === void 0 ? void 0 : _a["endScale"]) === null || _b === void 0 ? void 0 : _b.call(_a);
}
this.scaleTarget = undefined;
};
this.updateScale = (scale) => {
var _a, _b;
if (!scale || scale === 1) {
return;
}
if (this.scaleArea) {
this.views.forEach((element) => {
var _a;
(_a = element["setScale"]) === null || _a === void 0 ? void 0 : _a.call(element, scale);
});
}
else {
(_b = (_a = this.scaleTarget) === null || _a === void 0 ? void 0 : _a["setScale"]) === null || _b === void 0 ? void 0 : _b.call(_a, scale);
}
};
this.updateArea = () => {
const computedStyle = window.getComputedStyle(this.element);
const clientRect = this.element.getBoundingClientRect();
const horizontal = ["Left", "Right"].map((e) => {
return parseFloat(computedStyle["border" + e + "Width"]) + parseFloat(computedStyle["padding" + e]);
});
const vertical = ["Top", "Bottom"].map((e) => {
return parseFloat(computedStyle["border" + e + "Width"]) + parseFloat(computedStyle["padding" + e]);
});
this.views.forEach((element) => {
var _a;
(_a = element["setParent"]) === null || _a === void 0 ? void 0 : _a.call(element, {
element: this.element,
area: {
height: clientRect.height - vertical[0] - vertical[1],
width: clientRect.width - horizontal[0] - horizontal[1]
}
});
});
};
this.scaleArea = undefined;
}
connectedCallback() {
this.observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
var _a, _b;
if (mutation.attributeName === "class" || mutation.attributeName === "style") {
const offsetWidth = this.element.offsetWidth;
const offsetHeight = this.element.offsetHeight;
if (offsetWidth !== ((_a = this.offset) === null || _a === void 0 ? void 0 : _a.width) || offsetHeight !== ((_b = this.offset) === null || _b === void 0 ? void 0 : _b.height)) {
this.updateArea();
}
this.offset = {
width: offsetWidth,
height: offsetHeight
};
}
});
});
this.observer.observe(this.element, {
attributes: true
});
}
disconnectedCallback() {
var _a;
(_a = this.observer) === null || _a === void 0 ? void 0 : _a.disconnect();
}
componentDidLoad() {
this.viewsChanged();
}
render() {
return (h(Host, { onTouchStart: this.handleTouchStart, onTouchMove: this.handleTouchMove, onTouchEnd: this.handleTouchEnd }));
}
get element() { return this; }
static get style() { return areaCss; }
}, [0, "taro-movable-area-core", {
"scaleArea": [4, "scale-area"]
}]);
function defineCustomElement$1() {
if (typeof customElements === "undefined") {
return;
}
const components = ["taro-movable-area-core"];
components.forEach(tagName => { switch (tagName) {
case "taro-movable-area-core":
if (!customElements.get(tagName)) {
customElements.define(tagName, MovableArea);
}
break;
} });
}
const TaroMovableAreaCore = MovableArea;
const defineCustomElement = defineCustomElement$1;
export { TaroMovableAreaCore, defineCustomElement };