Component({ properties: { // 当前高度 height: { type: Number, value: 200 }, // 最小高度 minHeight: { type: Number, value: 100 }, // 最大高度 maxHeight: { type: Number, value: 400 }, // 预设高度点,用于自动吸附 presetHeights: { type: Array, value: [100, 150, 200, 250, 300, 350, 400] }, showHandle: { type: Boolean, value: true } }, data: { isResizing: false, currentStyle: '', currentHeight: 200 }, observers: { 'height': function (val) { // 只有非拖动时才同步外部高度 if (!this.data.isResizing) { this.setData({ currentHeight: val }); } } }, methods: { startResize(e) { const touch = e.touches[0]; this.startY = touch.clientY; this.startHeight = this.data.currentHeight; this.setData({ isResizing: true, currentStyle: 'transition: none;' }); // 触发开始事件 this.triggerEvent('resizestart', { height: this.data.height }); }, onResize(e) { if (!this.data.isResizing) return; const touch = e.touches[0]; const deltaY = touch.clientY - this.startY; let newHeight = this.startHeight + deltaY; // 限制高度范围 newHeight = Math.max(this.properties.minHeight, Math.min(newHeight, this.properties.maxHeight)); this.setData({ currentHeight: newHeight }); // 触发改变事件 this.triggerEvent('resize', { height: newHeight }); }, endResize() { if (!this.data.isResizing) return; const targetHeight = this.calculateTargetHeight(this.data.currentHeight); this.setData({ isResizing: false, currentStyle: 'transition: height 0.3s cubic-bezier(.4,0,.2,1);', currentHeight: targetHeight }); // 触发结束事件 this.triggerEvent('resizeend', { height: targetHeight }); }, calculateTargetHeight(currentHeight) { return this.properties.presetHeights.reduce((prev, curr) => Math.abs(curr - currentHeight) < Math.abs(prev - currentHeight) ? curr : prev ); } } });