@ohkit/draggable-box 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/index.es.js +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.modern.mjs +1 -1
- package/dist/index.modern.mjs.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/types/index.d.ts +7 -13
- package/dist/types/type.d.ts +5 -0
- package/dist/types/utils.d.ts +25 -4
- package/package.json +3 -3
- package/src/index.tsx +146 -118
- package/src/type.ts +5 -0
- package/src/utils.ts +64 -23
package/dist/index.modern.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import t from"react";import{prefixClassname as e,classNames as i}from"@ohkit/prefix-classname";import{findParent as s,addEventListener as o,addClass as r}from"@ohkit/dom-helper";function a(){return a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var s in i)({}).hasOwnProperty.call(i,s)&&(t[s]=i[s])}return t},a.apply(null,arguments)}const h=["top-left","top-right","bottom-left","bottom-right"],
|
|
1
|
+
import t from"react";import{prefixClassname as e,classNames as i}from"@ohkit/prefix-classname";import{findParent as s,addEventListener as o,addClass as r}from"@ohkit/dom-helper";function a(){return a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var i=arguments[e];for(var s in i)({}).hasOwnProperty.call(i,s)&&(t[s]=i[s])}return t},a.apply(null,arguments)}function h(t,e){const i=window.getComputedStyle(t),s=i.getPropertyValue("position"),o=i.getPropertyValue("transform"),r=i.getPropertyValue("filter"),a=i.getPropertyValue("perspective"),h=i.getPropertyValue("contain"),n=i.getPropertyValue("will-change");return e&&"static"!==s||"none"!==o||"none"!==r||"none"!==a||h.includes("paint")||h.includes("layout")||h.includes("strict")||n.includes("transform")||n.includes("perspective")||n.includes("filter")}function n(t,e,i){return Math.min(Math.max(t,e),i)}const d=["top-left","top-right","bottom-left","bottom-right"],l=e("ohkit-draggable-box__");class p extends t.Component{constructor(t){super(t),this.prePositionMode=void 0,this.preDraggerRef=null,this.container=null,this.draggerRef=null,this.isDragging=!1,this.axisX=void 0,this.axisY=void 0,this.dX=0,this.dY=0,this.startTop=0,this.startLeft=0,this.cachedScaleX=1,this.cachedScaleY=1,this.__moveDisposer=void 0,this.__clickDisposer=void 0,this.__bodyClassDisposer=void 0,this.__upDisposer=void 0,this.__resizeDisposer=void 0,this.__preventScrollDisposer=void 0,this.dragAreaRef=null,this.enableDrag=(t=!1)=>{var e,i;this.reportStartPosition(),null==(e=this.__moveDisposer)||e.call(this),this.__moveDisposer=o(t&&this.draggerRef?this.draggerRef:document,t?"touchmove":"mousemove",e=>{e.stopPropagation(),t&&e.preventDefault(),this.__clickDisposer||Math.sqrt(Math.pow(this.dX,2)+Math.pow(this.dY,2))>(this.props.showDragAreaOverMoveDistanse||5)&&(this.__clickDisposer=o(document,"click",t=>{t.stopPropagation()},!0),this.__bodyClassDisposer=r([document.body,this.draggerRef],l("moving"))||void 0,this.props.showDragArea&&this.dragAreaRef&&this.showDragArea()),this.dragging(e)},{passive:!t}),null==(i=this.__upDisposer)||i.call(this),this.__upDisposer=o(document,"mouseup",()=>{this.endDrag()},!0)},this.startDrag=t=>{2!==t.nativeEvent.button&&(this.axisX=t.nativeEvent.pageX,this.axisY=t.nativeEvent.pageY,this.props.disabled||this.enableDrag())},this.dragging=t=>{this.isDragging=!0;const{lockAxis:e}=this.props,{minX:i,maxX:s,minY:o,maxY:r}=this.dragPositionBoundaries,a=this.cachedScaleY;let h,n;if(t instanceof TouchEvent){const e=t.touches[0];if(!e)return;h=e.pageX,n=e.pageY}else h=t.pageX,n=t.pageY;this.dX=(h-(this.axisX||0))/this.cachedScaleX,this.dY=(n-(this.axisY||0))/a;let d=this.dX,l=this.dY;"x"===e?l=0:"y"===e&&(d=0);const p=this.startLeft+d,g=this.startTop+l;"y"!==e&&(p<i?d=i-this.startLeft:p>s&&(d=s-this.startLeft)),"x"!==e&&(g<o?l=o-this.startTop:g>r&&(l=r-this.startTop)),this.draggerRef&&(this.draggerRef.style.transform=`translate(${d}px, ${l}px)`)},this.startTouchDrag=t=>{const e=t.touches[0];e&&(this.axisX=e.pageX,this.axisY=e.pageY,this.props.disabled||this.enableDrag(!0))},this.endDrag=()=>{this.isDragging&&(this.calcPosition(),this.draggerRef&&(this.draggerRef.style.transform=""),this.props.showDragArea&&this.hideDragArea()),this.__moveDisposer&&(this.__moveDisposer(),this.__moveDisposer=void 0),this.__clickDisposer&&requestAnimationFrame(()=>{this.__clickDisposer&&(this.__clickDisposer(),this.__clickDisposer=void 0)}),this.__upDisposer&&(this.__upDisposer(),this.__upDisposer=void 0),this.__bodyClassDisposer&&(this.__bodyClassDisposer(),this.__bodyClassDisposer=void 0),this.isDragging=!1},this.showDragArea=()=>{if(!this.props.showDragArea||!this.dragAreaRef)return;const{lockAxis:t}=this.props,{minX:e,maxX:i,minY:s,maxY:o}=this.dragPositionBoundaries,r=this.dragBoxSize;this.dragAreaRef.style.border="1px dashed var(--ohkit-color-primary, #1890ff)",this.dragAreaRef.style.backgroundColor="rgba(173, 216, 230, 0.2)","x"===t?(this.dragAreaRef.style.width=`${i-e+r.width}px`,this.dragAreaRef.style.height="2px",this.dragAreaRef.style.left=`${e}px`,this.dragAreaRef.style.top=`${this.startTop+r.height/2}px`):"y"===t?(this.dragAreaRef.style.width="2px",this.dragAreaRef.style.height=`${o-s+r.height}px`,this.dragAreaRef.style.left=`${this.startLeft+r.width/2}px`,this.dragAreaRef.style.top=`${s}px`):(this.dragAreaRef.style.width=`${i-e+r.width}px`,this.dragAreaRef.style.height=`${o-s+r.height}px`,this.dragAreaRef.style.left=`${e}px`,this.dragAreaRef.style.top=`${s}px`),this.dragAreaRef.style.display="block"},this.hideDragArea=()=>{this.dragAreaRef&&(this.dragAreaRef.style.display="none")},this.calcPosition=()=>{const{lockAxis:t}=this.props,{minX:e,maxX:i,minY:s,maxY:o}=this.dragPositionBoundaries,{height:r,width:a}=this.getContainerRect();let h=this.startTop,d=this.startLeft;"y"!==t&&(d+=this.dX),"x"!==t&&(h+=this.dY);const l=n(h,s,o),p=n(d,e,i),g=r-l-this.dragBoxSize.height,c=a-p-this.dragBoxSize.width;l===this.state.top&&p===this.state.left&&this.state.bottom===g&&this.state.right===c||this.setState({top:l,left:p,bottom:g,right:c}),this.startTop=l,this.startLeft=p,this.dX=this.dY=0};const{placement:e="bottom-right",offsetY:i=20,offsetX:s=20}=t,[a,h]=e.split("-");this.state={top:"top"===a?i:void 0,bottom:"bottom"===a?i:void 0,left:"left"===h?s:void 0,right:"right"===h?s:void 0}}getContainer(t=!0){const{positionMode:e="fixed"}=this.props;var i;return this.container&&t&&this.prePositionMode===e&&this.preDraggerRef===this.draggerRef||(this.prePositionMode=e,this.preDraggerRef=this.draggerRef,this.container="fixed"===e?(i=this.draggerRef)?s(i,t=>h(t,!1),{excludeOwn:!0}):document.documentElement:function(t){return t?s(t,t=>h(t,!0),{excludeOwn:!0}):document.body}(this.draggerRef)),this.container}getContainerRect(){const t=this.getContainer(!1);if(!t)return{width:window.innerWidth,height:window.innerHeight,left:0,top:0,scrollLeft:0,scrollTop:0,scrollerScrollLeft:0,scrollerScrollTop:0,borderLeftWidth:0,borderTopWidth:0};const e=t.getBoundingClientRect(),i=window.getComputedStyle(t),s=parseFloat(i.borderLeftWidth)||0,o=parseFloat(i.borderTopWidth)||0,r=parseFloat(i.borderRightWidth)||0,a=parseFloat(i.borderBottomWidth)||0;return{width:e.width/this.cachedScaleX-s-r-(t.offsetWidth-t.clientWidth-s-r),height:e.height/this.cachedScaleY-o-a-(t.offsetHeight-t.clientHeight-o-a),left:e.left/this.cachedScaleX,top:e.top/this.cachedScaleY,scrollLeft:t.scrollLeft,scrollTop:t.scrollTop,borderLeftWidth:s,borderTopWidth:o}}get dragBoxSize(){let t=0,e=0;return this.draggerRef&&(t=this.draggerRef.offsetWidth,e=this.draggerRef.offsetHeight),{height:e,width:t}}get dragPositionBoundaries(){const{boundsX:t,boundsY:e,placement:i="bottom-right"}=this.props,s=this.dragBoxSize,{width:o,height:r}=this.getContainerRect(),[a,h]=i.split("-"),d={minX:0,maxX:Math.max(o-s.width,0),minY:0,maxY:Math.max(r-s.height,0)};let{minX:l,maxX:p,minY:g,maxY:c}=d;if(t){const[e,i]=t;"left"===h?(void 0!==e&&(l=Math.max(l,e)),void 0!==i&&(p=Math.min(p,i))):void 0!==e&&void 0!==i?(l=Math.max(l,o-i-s.width),p=Math.min(p,o-e-s.width)):void 0!==e?p=Math.min(p,o-e-s.width):void 0!==i&&(l=Math.max(l,o-i-s.width))}if(e){const[t,i]=e;"top"===a?(void 0!==t&&(g=Math.max(g,t)),void 0!==i&&(c=Math.min(c,i))):void 0!==t&&void 0!==i?(g=Math.max(g,r-i-s.height),c=Math.min(c,r-t-s.height)):void 0!==t?c=Math.min(c,r-t-s.height):void 0!==i&&(g=Math.max(g,r-i-s.height))}return l=n(l,d.minX,d.maxX),p=n(p,l,d.maxX),g=n(g,d.minY,d.maxY),c=n(c,g,d.maxY),{minX:l,maxX:p,minY:g,maxY:c}}get curPositionKey(){let{placement:t}=this.props;return t&&d.includes(t)||(t="bottom-right"),t.split("-")}get position(){const[t,e]=this.curPositionKey,i={};return void 0!==this.state[t]&&(i[t]=`${this.state[t]}px`),void 0!==this.state[e]&&(i[e]=`${this.state[e]}px`),i}reportStartPosition(){if(this.draggerRef){const{scaleX:t,scaleY:e}=function(t){if(!t)return{scaleX:1,scaleY:1};const e=t.getBoundingClientRect();let i=1,s=1;const o=1e4;return i=t.offsetWidth>0?Math.round(e.width/t.offsetWidth*o)/o:1,s=t.offsetHeight>0?Math.round(e.height/t.offsetHeight*o)/o:1,{scaleX:i,scaleY:s}}(this.getContainer());this.cachedScaleX=t,this.cachedScaleY=e;const{top:i,left:s}=this.draggerRef.getBoundingClientRect(),o=this.getContainerRect();this.startTop=i/e-o.top+o.scrollTop-o.borderTopWidth,this.startLeft=s/e-o.left+o.scrollLeft-o.borderLeftWidth}}componentDidMount(){this.reportStartPosition(),this.calcPosition(),this.__resizeDisposer=o(window,"resize",()=>{this.calcPosition()}),"undefined"!=typeof window&&("ontouchstart"in window||navigator.maxTouchPoints>0)&&this.draggerRef&&(this.__preventScrollDisposer=o(this.draggerRef,"touchmove",t=>{t.preventDefault()}))}componentWillUnmount(){var t,e,i,s,o,r;null==(t=this.__resizeDisposer)||t.call(this),null==(e=this.__bodyClassDisposer)||e.call(this),null==(i=this.__moveDisposer)||i.call(this),null==(s=this.__clickDisposer)||s.call(this),null==(o=this.__upDisposer)||o.call(this),null==(r=this.__preventScrollDisposer)||r.call(this)}render(){const{className:e,zIndex:s,children:o,showDragArea:r,positionMode:h="fixed"}=this.props,{startDrag:n,startTouchDrag:d,endDrag:p}=this,g=a({zIndex:s},this.position,{position:h});/*#__PURE__*/return t.createElement(Fragment,null,r&&/*#__PURE__*/t.createElement("div",{className:l("drag-area"),ref:t=>{this.dragAreaRef=t},style:{display:"none",position:h,backgroundColor:"rgba(173, 216, 230, 0.2)",border:"1px dashed var(--ohkit-color-primary, #1890ff)",pointerEvents:"none",zIndex:(s||9999)-1,boxSizing:"border-box",borderRadius:"none"!==this.props.lockAxis?"2px":"0"}}),/*#__PURE__*/t.createElement("div",{className:i(l("container"),e),style:g,ref:t=>{this.draggerRef=t},onMouseDownCapture:n,onMouseUpCapture:p,onTouchStartCapture:d,onTouchEndCapture:p},o))}}p.defaultProps={zIndex:9999,offsetX:20,offsetY:20,placement:"bottom-right",disabled:!1,lockAxis:"none",showDragArea:!1,showDragAreaOverMoveDistanse:5,positionMode:"fixed"};export{p as DraggableBox,l as c,p as default};
|
|
2
2
|
//# sourceMappingURL=index.modern.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.modern.mjs","sources":["../src/constants.ts","../src/index.tsx","../src/utils.ts"],"sourcesContent":["\nexport const ValidPlacement = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n","import React from 'react';\nimport {\n prefixClassname as p,\n classNames as cx,\n} from \"@ohkit/prefix-classname\";\nimport {addEventListener, addClass} from '@ohkit/dom-helper';\nimport {findFixedPositionParent, findAbsolutePositionParent, getScaleRatio} from './utils';\nimport {ValidPlacement} from './constants';\nimport {DraggableBoxProps, DraggableBoxState} from './type';\n\nimport './style.scss';\n\nexport const c = p(\"ohkit-draggable-box__\");\nexport class DraggableBox extends React.Component<DraggableBoxProps, DraggableBoxState> {\n static defaultProps: Partial<DraggableBoxProps> = {\n zIndex: 9999,\n offsetX: 20,\n offsetY: 20,\n placement: 'bottom-right',\n disabled: false,\n lockAxis: 'none',\n showDragArea: false,\n positionMode: 'fixed',\n };\n\n constructor(props: DraggableBoxProps) {\n super(props);\n \n const { placement = 'bottom-right', offsetY = 20, offsetX = 20 } = props;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n // 简化状态初始化\n this.state = {\n top: placementY === 'top' ? offsetY : undefined,\n bottom: placementY === 'bottom' ? offsetY : undefined,\n left: placementX === 'left' ? offsetX : undefined,\n right: placementX === 'right' ? offsetX : undefined,\n };\n }\n\n getOtherYKey(yKey: 'top' | 'bottom') {\n return yKey === 'top' ? 'bottom' : 'top';\n }\n\n getOtherXKey(xKey: 'left' | 'right') {\n return xKey === 'left' ? 'right' : 'left';\n }\n\n // TODO:\n updatePosition(yKey: 'top' | 'bottom', xKey: 'left' | 'right') {\n const oYKey = this.getOtherYKey(yKey);\n const oXKey = this.getOtherXKey(xKey);\n this.setState({\n [oYKey]: this.dragPositionRang.height - (this.state[yKey] || 0),\n [oXKey]: this.dragPositionRang.width - (this.state[xKey] || 0),\n });\n }\n /**\n * 获取定位容器\n * 根据 positionMode 返回对应的定位父元素\n */\n private getContainer(): HTMLElement {\n const { positionMode = 'fixed' } = this.props;\n return positionMode === 'fixed' \n ? findFixedPositionParent(this.draggerRef) \n : findAbsolutePositionParent(this.draggerRef);\n }\n\n /**\n * 获取容器的尺寸和位置信息\n */\n private getContainerRect() {\n const { positionMode = 'fixed' } = this.props;\n const isFixed = positionMode === 'fixed';\n const container = this.getContainer();\n const containerRect = container.getBoundingClientRect();\n const rootScrollingElement = window.document.scrollingElement || window.document.body;\n const isRoot = container === window.document.body || container === window.document.documentElement;\n return {\n width: containerRect.width,\n height: containerRect.height,\n left: isFixed && isRoot ? Math.max(containerRect.left, 0) : containerRect.left + rootScrollingElement.scrollLeft,\n top: isFixed && isRoot ? Math.max(containerRect.top, 0) : containerRect.top + rootScrollingElement.scrollTop,\n scrollLeft: isFixed && isRoot ? 0 : container.scrollLeft, // container.scrollLeft,\n scrollTop: isFixed && isRoot ? 0 : container.scrollTop, // container.scrollTop\n scrollerScrollLeft: isFixed && isRoot ? 0 : rootScrollingElement.scrollLeft,\n scrollerScrollTop: isFixed && isRoot ? 0 : rootScrollingElement.scrollTop\n };\n }\n\n get windowSize() {\n const container = this.getContainer();\n const { clientWidth, clientHeight } = container;\n return {\n height: clientHeight,\n width: clientWidth\n };\n }\n\n get dragBoxSize() {\n let width = 0;\n let height = 0;\n if (this.draggerRef) {\n width = this.draggerRef.offsetWidth;\n height = this.draggerRef.offsetHeight;\n }\n return {\n height,\n width\n };\n }\n\n get dragPositionBoundaries() {\n const { boundsX, boundsY, placement = 'bottom-right' } = this.props;\n const dragSize = this.dragBoxSize;\n const windowSize = this.windowSize;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n // 初始化边界\n let minX = 0;\n let maxX = windowSize.width - dragSize.width;\n let minY = 0;\n let maxY = windowSize.height - dragSize.height;\n\n // 处理X轴边界\n if (boundsX) {\n const [minBound, maxBound] = boundsX;\n \n if (placementX === 'left') {\n // 左边位置:boundsX=[左边最小距离, 左边最大距离]\n if (minBound !== undefined) minX = Math.max(minX, minBound);\n if (maxBound !== undefined) maxX = Math.min(maxX, maxBound);\n } else {\n // 右边位置:boundsX=[右边最小距离, 右边最大距离]\n // 直接使用边界值作为right的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minX = Math.max(minX, windowSize.width - maxBound - dragSize.width);\n maxX = Math.min(maxX, windowSize.width - minBound - dragSize.width);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxX = Math.min(maxX, windowSize.width - minBound - dragSize.width);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minX = Math.max(minX, windowSize.width - maxBound - dragSize.width);\n }\n \n // 确保最小边界不大于最大边界\n if (minX > maxX) {\n [minX, maxX] = [maxX, minX];\n }\n }\n }\n\n // 处理Y轴边界\n if (boundsY) {\n const [minBound, maxBound] = boundsY;\n \n if (placementY === 'top') {\n // 顶部位置:boundsY=[顶边最小距离, 顶边最大距离]\n if (minBound !== undefined) minY = Math.max(minY, minBound);\n if (maxBound !== undefined) maxY = Math.min(maxY, maxBound);\n } else {\n // 底部位置:boundsY=[底边最小距离, 底边最大距离]\n // 直接使用边界值作为bottom的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minY = Math.max(minY, windowSize.height - maxBound - dragSize.height);\n maxY = Math.min(maxY, windowSize.height - minBound - dragSize.height);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxY = Math.min(maxY, windowSize.height - minBound - dragSize.height);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minY = Math.max(minY, windowSize.height - maxBound - dragSize.height);\n }\n \n // 确保最小边界不大于最大边界\n if (minY > maxY) {\n [minY, maxY] = [maxY, minY];\n }\n }\n }\n\n return { minX, maxX, minY, maxY };\n }\n \n // 保持向后兼容\n get dragPositionRang() {\n const { maxX, maxY } = this.dragPositionBoundaries;\n return { width: maxX, height: maxY };\n }\n\n get curPositionKey() {\n let {placement} = this.props;\n if (!placement || !ValidPlacement.includes(placement)) {\n placement = 'bottom-right';\n }\n return placement.split('-') as ['top' | 'bottom', 'left' | 'right']; // [y, x]\n }\n\n get position() {\n const [y, x] = this.curPositionKey;\n const positionStyles: Record<string, string> = {};\n \n // 确保位置值存在且是有效的数字\n if (this.state[y] !== undefined) {\n positionStyles[y] = `${this.state[y]}px`;\n }\n if (this.state[x] !== undefined) {\n positionStyles[x] = `${this.state[x]}px`;\n }\n \n return positionStyles;\n }\n\n draggerRef: HTMLDivElement | null = null;\n\n isDragging = false;\n\n axisX?: number;\n axisY?: number;\n dX = 0;\n dY = 0;\n startTop = 0;\n startLeft = 0;\n\n // 缓存缩放比例,避免在 dragging 中频繁计算\n cachedScaleX = 1;\n cachedScaleY = 1;\n\n __moveDisposer?: () => void;\n __clickDisposer?: () => void;\n __bodyClassDisposer?: () => void;\n __upDisposer?: () => void;\n __resizeDisposer?: () => void;\n\n dragAreaRef: HTMLDivElement | null = null;\n\n reportStartPosition() {\n if (this.draggerRef) {\n const { top, left } = this.draggerRef.getBoundingClientRect();\n const containerRect = this.getContainerRect();\n // console.log(containerRect, 'containerRect');\n \n // 获取缩放比例\n const { scaleX, scaleY } = getScaleRatio(this.draggerRef);\n this.cachedScaleX = scaleX;\n this.cachedScaleY = scaleY;\n \n // 计算相对于容器的位置,并除以缩放比例得到未缩放的坐标\n this.startTop = (top - containerRect.top + containerRect.scrollerScrollTop) / scaleY + containerRect.scrollTop;\n this.startLeft = (left - containerRect.left + containerRect.scrollerScrollLeft) / scaleX + containerRect.scrollLeft;\n }\n }\n\n enableDrag = () => {\n this.reportStartPosition();\n this.__moveDisposer?.();\n this.__moveDisposer = addEventListener(document, 'mousemove', (evt) => {\n // INFO: 移动过程中禁止click事件\n if (!this.__clickDisposer) {\n const moveDistanse = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2));\n // INFO: 移动超过5px?? 确保用户有真实的移动意愿,而不是手抖~~\n if (moveDistanse > 5) {\n this.__clickDisposer = addEventListener(\n document,\n 'click',\n (evt) => {\n evt.stopPropagation();\n },\n true\n );\n this.__bodyClassDisposer = addClass([document.body, this.draggerRef], c('moving')) || undefined;\n \n // 显示拖拽区域\n if (this.props.showDragArea && this.dragAreaRef) {\n this.showDragArea();\n }\n }\n }\n this.dragging(evt);\n }, true);\n\n this.__upDisposer?.();\n this.__upDisposer = addEventListener(\n document,\n 'mouseup',\n (evt) => {\n this.endDrag();\n evt.stopPropagation();\n evt.preventDefault();\n },\n true\n );\n };\n\n startDrag = (evt: React.MouseEvent<HTMLDivElement>) => {\n // 判断鼠标非右击才继续执行\n if (evt.nativeEvent.button === 2) {\n return;\n }\n this.axisX = evt.nativeEvent.pageX;\n this.axisY = evt.nativeEvent.pageY;\n if (!this.props.disabled) {\n this.enableDrag();\n }\n };\n\n dragging = (evt: MouseEvent) => {\n this.isDragging = true;\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n \n // 使用缓存的缩放比例,避免频繁计算\n const scaleX = this.cachedScaleX;\n const scaleY = this.cachedScaleY;\n \n // 计算原始偏移量(需要除以缩放比例)\n this.dX = (evt.pageX - (this.axisX || 0)) / scaleX;\n this.dY = (evt.pageY - (this.axisY || 0)) / scaleY;\n \n // 应用方向锁定并计算变换值\n let translateX = this.dX;\n let translateY = this.dY;\n \n if (lockAxis === 'x') {\n translateY = 0; // 锁定Y方向\n } else if (lockAxis === 'y') {\n translateX = 0; // 锁定X方向\n }\n \n // 应用边界条件到允许移动的方向\n const potentialLeft = this.startLeft + translateX;\n const potentialTop = this.startTop + translateY;\n \n // X轴边界条件(在允许X轴移动时应用)\n if (lockAxis !== 'y') {\n if (potentialLeft < minX) {\n translateX = minX - this.startLeft;\n } else if (potentialLeft > maxX) {\n translateX = maxX - this.startLeft;\n }\n }\n \n // Y轴边界条件(在允许Y轴移动时应用)\n if (lockAxis !== 'x') {\n if (potentialTop < minY) {\n translateY = minY - this.startTop;\n } else if (potentialTop > maxY) {\n translateY = maxY - this.startTop;\n }\n }\n \n if (this.draggerRef) {\n this.draggerRef.style.transform = `translate(${translateX}px, ${translateY}px)`;\n }\n evt.stopPropagation();\n };\n\n endDrag = () => {\n if (this.isDragging) {\n this.calcPosition();\n if (this.draggerRef) {\n this.draggerRef.style.transform = '';\n }\n \n // 隐藏拖拽区域\n if (this.props.showDragArea) {\n this.hideDragArea();\n }\n }\n\n this.__moveDisposer?.();\n this.__moveDisposer = undefined;\n if (this.__clickDisposer) {\n requestAnimationFrame(() => {\n if (this.__clickDisposer) {\n this.__clickDisposer();\n this.__clickDisposer = undefined;\n }\n });\n }\n this.__upDisposer?.();\n this.__upDisposer = undefined;\n this.__bodyClassDisposer?.();\n this.__bodyClassDisposer = undefined;\n\n this.isDragging = false;\n };\n\n showDragArea = () => {\n if (!this.props.showDragArea || !this.dragAreaRef) return;\n \n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const dragSize = this.dragBoxSize;\n \n // 重置样式\n this.dragAreaRef.style.border = '1px dashed var(--ohkit-color-primary, #1890ff)';\n this.dragAreaRef.style.backgroundColor = 'rgba(173, 216, 230, 0.2)'; // 淡透蓝色\n \n if (lockAxis === 'x') {\n // 锁定Y方向,显示为水平虚线区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = '2px'; // 更细的虚线高度\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${this.startTop + dragSize.height / 2}px`;\n this.dragAreaRef.style.border = 'none';\n this.dragAreaRef.style.backgroundColor = 'transparent'; // 透明背景\n this.dragAreaRef.style.backgroundImage = 'linear-gradient(to right, var(--ohkit-color-primary, #1890ff) 50%, transparent 50%)';\n this.dragAreaRef.style.backgroundSize = '4px 2px'; // 虚线模式\n } else if (lockAxis === 'y') {\n // 锁定X方向,显示为垂直虚线区域\n this.dragAreaRef.style.width = '2px'; // 更细的虚线宽度\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${this.startLeft + dragSize.width / 2}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n this.dragAreaRef.style.border = 'none';\n this.dragAreaRef.style.backgroundColor = 'transparent'; // 透明背景\n this.dragAreaRef.style.backgroundImage = 'linear-gradient(to bottom, var(--ohkit-color-primary, #1890ff) 50%, transparent 50%)';\n this.dragAreaRef.style.backgroundSize = '2px 4px'; // 虚线模式\n } else {\n // 自由拖拽,显示完整区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n }\n \n this.dragAreaRef.style.display = 'block';\n };\n\n hideDragArea = () => {\n if (this.dragAreaRef) {\n this.dragAreaRef.style.display = 'none';\n }\n };\n calcPosition = () => {\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const containerSize = this.windowSize;\n \n // 计算新的位置\n let newTop = this.startTop;\n let newLeft = this.startLeft;\n \n if (lockAxis !== 'y') {\n newLeft += this.dX;\n }\n if (lockAxis !== 'x') {\n newTop += this.dY;\n }\n \n // 应用边界限制\n const realTop = Math.min(Math.max(minY, newTop), maxY);\n const realLeft = Math.min(Math.max(minX, newLeft), maxX);\n const realBottom = containerSize.height - realTop - this.dragBoxSize.height;\n const realRight = containerSize.width - realLeft - this.dragBoxSize.width;\n if (realTop !== this.state.top || realLeft !== this.state.left || this.state.bottom !== realBottom || this.state.right !== realRight) {\n // console.log(minY, maxY, this.startTop, this.dY, newTop, realTop, 'calcPosition y');\n // console.log(minX, maxX, this.startLeft, this.dX, newLeft, realLeft, 'calcPosition x');\n this.setState({\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight\n });\n }\n this.startTop = realTop;\n this.startLeft = realLeft;\n this.dX = this.dY = 0;\n };\n\n\n componentDidMount() {\n // 检查初始位置是否在边界范围内,如果不在则修正\n this.reportStartPosition();\n this.calcPosition();\n \n this.__resizeDisposer = addEventListener(window, 'resize', () => {\n this.calcPosition();\n });\n }\n\n componentWillUnmount() {\n this.__resizeDisposer?.();\n this.__bodyClassDisposer?.();\n this.__moveDisposer?.();\n this.__clickDisposer?.();\n this.__upDisposer?.();\n }\n\n render() {\n const { className, zIndex, children, showDragArea, positionMode = 'fixed' } = this.props;\n const { startDrag, endDrag } = this;\n const stl = {\n zIndex,\n ...this.position,\n position: positionMode\n };\n return (\n <>\n {showDragArea && (\n <div\n className={c('drag-area')}\n ref={(r) => {\n this.dragAreaRef = r;\n }}\n style={{\n display: 'none',\n position: positionMode,\n backgroundColor: 'rgba(173, 216, 230, 0.2)', // 淡透蓝色\n border: '1px dashed var(--ohkit-color-primary, #1890ff)',\n pointerEvents: 'none',\n zIndex: (zIndex || 9999) - 1,\n boxSizing: 'border-box',\n borderRadius: this.props.lockAxis !== 'none' ? '2px' : '0',\n }}\n />\n )}\n <div\n className={cx(c('container'), className)}\n style={stl}\n ref={(r) => {\n this.draggerRef = r;\n }}\n onMouseDown={startDrag}\n onMouseUp={endDrag}\n >\n {children}\n </div>\n </>\n );\n }\n}\n\nexport default DraggableBox;","import {findParent} from '@ohkit/dom-helper';\n\n/**\n * 查找影响 fixed 定位的父元素\n * 当父元素有 transform/filter/perspective 等属性时,fixed 定位会相对于该父元素\n */\nexport function findFixedPositionParent(dom?: HTMLElement | null): HTMLElement {\n if (!dom) {\n return document.documentElement;\n }\n const fixedPositionParent = findParent(dom, (parent) => {\n const style = window.getComputedStyle(parent);\n const transform = style.getPropertyValue('transform');\n const filter = style.getPropertyValue('filter');\n const perspective = style.getPropertyValue('perspective');\n \n // 检查是否有影响 fixed 定位的属性\n if (transform !== 'none' || filter !== 'none' || perspective !== 'none') {\n return true;\n }\n }, {excludeOwn: true}) || document.documentElement; // 没有找到,返回 window(通过 document.documentElement)\n return fixedPositionParent;\n}\n\n/**\n * 查找 absolute 定位的父元素\n * 查找最近的 position 不为 static 的元素\n */\nexport function findAbsolutePositionParent(dom?: HTMLElement | null): HTMLElement {\n if (!dom) {\n return document.body;\n }\n return findParent(dom, (parent) => {\n const style = window.getComputedStyle(parent);\n const position = style.getPropertyValue('position');\n if (position !== 'static') {\n return true;\n }\n }, {excludeOwn: true}) || document.body;\n}\n\n/**\n * 获取容器的缩放比例\n * 通过比较元素的实际尺寸和 getBoundingClientRect 返回的尺寸来计算缩放比例\n */\nexport function getScaleRatio(dom?: HTMLElement | null): { scaleX: number; scaleY: number } {\n if (!dom) {\n return { scaleX: 1, scaleY: 1 };\n }\n // 通过比较 offsetWidth 和 getBoundingClientRect().width 来获取缩放比例\n const rect = dom.getBoundingClientRect();\n // 扩大10倍进行计算,避免浮点数精度问题\n const scaleX = dom.offsetWidth > 0 ? Math.round(rect.width / dom.offsetWidth * 10) / 10 : 1;\n const scaleY = dom.offsetHeight > 0 ? Math.round(rect.height / dom.offsetHeight * 10) / 10 : 1;\n // console.log('scaleX', scaleX, 'scaleY', scaleY);\n return { scaleX, scaleY };\n}\n"],"names":["ValidPlacement","c","p","DraggableBox","React","Component","constructor","props","super","this","draggerRef","isDragging","axisX","axisY","dX","dY","startTop","startLeft","cachedScaleX","cachedScaleY","__moveDisposer","__clickDisposer","__bodyClassDisposer","__upDisposer","__resizeDisposer","dragAreaRef","enableDrag","_this$__moveDisposer","_this$__upDisposer","reportStartPosition","call","addEventListener","document","evt","Math","sqrt","pow","stopPropagation","addClass","body","undefined","showDragArea","dragging","endDrag","preventDefault","startDrag","nativeEvent","button","pageX","pageY","disabled","lockAxis","minX","maxX","minY","maxY","dragPositionBoundaries","scaleY","translateX","translateY","potentialLeft","potentialTop","style","transform","_this$__moveDisposer2","_this$__upDisposer2","_this$__bodyClassDisp","calcPosition","hideDragArea","requestAnimationFrame","dragSize","dragBoxSize","border","backgroundColor","width","height","left","top","backgroundImage","backgroundSize","display","containerSize","windowSize","newTop","newLeft","realTop","min","max","realLeft","realBottom","realRight","state","bottom","right","setState","placement","offsetY","offsetX","placementY","placementX","split","getOtherYKey","yKey","getOtherXKey","xKey","updatePosition","oYKey","oXKey","dragPositionRang","getContainer","positionMode","dom","findParent","parent","window","getComputedStyle","getPropertyValue","filter","perspective","excludeOwn","documentElement","findAbsolutePositionParent","getContainerRect","isFixed","container","containerRect","getBoundingClientRect","rootScrollingElement","scrollingElement","isRoot","scrollLeft","scrollTop","scrollerScrollLeft","scrollerScrollTop","clientWidth","clientHeight","offsetWidth","offsetHeight","boundsX","boundsY","minBound","maxBound","curPositionKey","includes","position","y","x","positionStyles","scaleX","rect","round","getScaleRatio","componentDidMount","componentWillUnmount","_this$__resizeDispose","_this$__bodyClassDisp2","_this$__moveDisposer3","_this$__clickDisposer","_this$__upDisposer3","render","className","zIndex","children","stl","_extends","createElement","Fragment","ref","r","pointerEvents","boxSizing","borderRadius","cx","onMouseDown","onMouseUp","defaultProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.modern.mjs","sources":["../src/utils.ts","../src/constants.ts","../src/index.tsx"],"sourcesContent":["import {findParent} from '@ohkit/dom-helper';\n\n/**\n * 检查元素是否创建了新的定位上下文(包含块)\n * @param element 要检查的元素\n * @param includePosition 是否检查position属性(absolute/relative/fixed)\n */\nexport function isPositioningContextCreator(element: HTMLElement, includePosition: boolean): boolean {\n const style = window.getComputedStyle(element);\n const position = style.getPropertyValue('position');\n const transform = style.getPropertyValue('transform');\n const filter = style.getPropertyValue('filter');\n const perspective = style.getPropertyValue('perspective');\n const contain = style.getPropertyValue('contain');\n const willChange = style.getPropertyValue('will-change');\n \n return (includePosition && position !== 'static') || \n transform !== 'none' || \n filter !== 'none' || \n perspective !== 'none' ||\n contain.includes('paint') ||\n contain.includes('layout') ||\n contain.includes('strict') ||\n willChange.includes('transform') ||\n willChange.includes('perspective') ||\n willChange.includes('filter');\n}\n\n/**\n * 查找影响 fixed 定位的父元素\n * 当父元素有 transform/filter/perspective/contain/will-change 等属性时,fixed 定位会相对于该父元素\n */\nexport function findFixedPositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.documentElement;\n }\n const fixedPositionParent = findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, false);\n }, {excludeOwn: true}); // 没有找到,返回 window(通过 document.documentElement)\n return fixedPositionParent;\n}\n\n/**\n * 查找 absolute 定位的父元素\n * 查找最近的包含块创建者,包含所有可能影响absolute定位的属性\n */\nexport function findAbsolutePositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.body;\n }\n return findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, true);\n }, {excludeOwn: true});\n}\n\n/**\n * 获取容器的缩放比例\n * 通过比较元素的实际尺寸和 getBoundingClientRect 返回的尺寸来计算缩放比例\n */\nexport function getScaleRatio(dom?: HTMLElement | null): { scaleX: number; scaleY: number } {\n if (!dom) {\n return { scaleX: 1, scaleY: 1 };\n }\n // 通过比较 offsetWidth 和 getBoundingClientRect().width 来获取缩放比例\n const rect = dom.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n // 扩大{magnification}倍进行计算, 相当于保留小数点后4位\n const magnification = 10000;\n scaleX = dom.offsetWidth > 0 ? Math.round(rect.width / dom.offsetWidth * magnification) / magnification : 1;\n scaleY = dom.offsetHeight > 0 ? Math.round(rect.height / dom.offsetHeight * magnification) / magnification : 1;\n // console.log('rect.width dom.offsetWidth', rect.width, dom.offsetWidth);\n // console.log('rect.height dom.offsetHeight', rect.height, dom.offsetHeight);\n // console.log('scaleX', scaleX, 'scaleY', scaleY);\n return { scaleX, scaleY };\n}\n\n/**\n * 限制数值在指定范围内\n * \n * @param value 要限制的数值\n * @param min 最小值\n * @param max 最大值\n * @returns 限制后的数值,确保在 [min, max] 范围内\n */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\n\n/**\n * 检测当前环境是否支持触摸事件\n * \n * @returns 如果环境支持触摸事件返回 true,否则返回 false\n */\nexport function supportsTouchEvents() {\n return typeof window !== 'undefined' && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};","\nexport const ValidPlacement = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n","import React from 'react';\nimport {\n prefixClassname as p,\n classNames as cx,\n} from \"@ohkit/prefix-classname\";\nimport {addEventListener, addClass} from '@ohkit/dom-helper';\nimport {findFixedPositionParent, findAbsolutePositionParent, getScaleRatio, clamp, supportsTouchEvents} from './utils';\nimport {ValidPlacement} from './constants';\nimport {DraggableBoxProps, DraggableBoxState} from './type';\n\nimport './style.scss';\n\nexport const c = p(\"ohkit-draggable-box__\");\nexport class DraggableBox extends React.Component<DraggableBoxProps, DraggableBoxState> {\n static defaultProps: Partial<DraggableBoxProps> = {\n zIndex: 9999,\n offsetX: 20,\n offsetY: 20,\n placement: 'bottom-right',\n disabled: false,\n lockAxis: 'none',\n showDragArea: false,\n showDragAreaOverMoveDistanse: 5,\n positionMode: 'fixed',\n };\n\n constructor(props: DraggableBoxProps) {\n super(props);\n \n const { placement = 'bottom-right', offsetY = 20, offsetX = 20 } = props;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n // 简化状态初始化\n this.state = {\n top: placementY === 'top' ? offsetY : undefined,\n bottom: placementY === 'bottom' ? offsetY : undefined,\n left: placementX === 'left' ? offsetX : undefined,\n right: placementX === 'right' ? offsetX : undefined,\n };\n }\n\n private prePositionMode: DraggableBoxProps['positionMode'];\n private preDraggerRef: HTMLElement | null = null;\n private container: HTMLElement | null = null;\n /**\n * 获取定位容器\n * 根据 positionMode 返回对应的定位父元素\n */\n private getContainer(useCache = true) {\n const { positionMode = 'fixed' } = this.props;\n if (!this.container || !useCache || this.prePositionMode !== positionMode || this.preDraggerRef !== this.draggerRef) {\n this.prePositionMode = positionMode;\n this.preDraggerRef = this.draggerRef;\n this.container = positionMode === 'fixed' \n ? findFixedPositionParent(this.draggerRef) \n : findAbsolutePositionParent(this.draggerRef);\n }\n return this.container;\n }\n\n /**\n * 获取容器的尺寸和位置信息\n */\n private getContainerRect() {\n const container = this.getContainer(false);\n if (!container) {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n left: 0,\n top: 0,\n scrollLeft: 0,\n scrollTop: 0,\n scrollerScrollLeft: 0,\n scrollerScrollTop: 0,\n borderLeftWidth: 0,\n borderTopWidth: 0\n };\n }\n const containerRect = container.getBoundingClientRect();\n \n // 获取容器的border宽度(仅 top, left 对坐标计算有影响)\n const containerStyle = window.getComputedStyle(container);\n const borderLeftWidth = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTopWidth = parseFloat(containerStyle.borderTopWidth) || 0;\n const borderRightWidth = parseFloat(containerStyle.borderRightWidth) || 0;\n const borderBottomWidth = parseFloat(containerStyle.borderBottomWidth) || 0;\n const yScrollerWidth = container.offsetWidth - container.clientWidth - borderLeftWidth - borderRightWidth;\n const xScrollerHeight = container.offsetHeight - container.clientHeight - borderTopWidth - borderBottomWidth;\n // console.log('yScrollerWidth, xScrollerHeight', yScrollerWidth, xScrollerHeight);\n\n return {\n width: containerRect.width / this.cachedScaleX - borderLeftWidth - borderRightWidth - yScrollerWidth,\n height: containerRect.height / this.cachedScaleY - borderTopWidth - borderBottomWidth - xScrollerHeight,\n left: containerRect.left / this.cachedScaleX,\n top: containerRect.top / this.cachedScaleY,\n scrollLeft: container.scrollLeft,\n scrollTop: container.scrollTop,\n borderLeftWidth: borderLeftWidth,\n borderTopWidth: borderTopWidth,\n };\n }\n\n get dragBoxSize() {\n let width = 0;\n let height = 0;\n if (this.draggerRef) {\n width = this.draggerRef.offsetWidth;\n height = this.draggerRef.offsetHeight;\n }\n return {\n height,\n width\n };\n }\n\n get dragPositionBoundaries() {\n const { boundsX, boundsY, placement = 'bottom-right' } = this.props;\n const dragSize = this.dragBoxSize;\n const {width: containerWidth, height: containerHeight} = this.getContainerRect();\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n const defaultBounds = {\n minX: 0,\n maxX: Math.max(containerWidth - dragSize.width, 0),\n minY: 0,\n maxY: Math.max(containerHeight- dragSize.height, 0),\n };\n // 初始化边界\n let {minX, maxX, minY, maxY} = defaultBounds\n\n // 处理X轴边界\n if (boundsX) {\n const [minBound, maxBound] = boundsX;\n if (placementX === 'left') {\n // 左边位置:boundsX=[左边最小距离, 左边最大距离]\n if (minBound !== undefined) minX = Math.max(minX, minBound);\n if (maxBound !== undefined) maxX = Math.min(maxX, maxBound);\n } else {\n // 右边位置:boundsX=[右边最小距离, 右边最大距离]\n // 直接使用边界值作为right的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n }\n }\n }\n\n // 处理Y轴边界\n if (boundsY) {\n const [minBound, maxBound] = boundsY;\n \n if (placementY === 'top') {\n // 顶部位置:boundsY=[顶边最小距离, 顶边最大距离]\n if (minBound !== undefined) minY = Math.max(minY, minBound);\n if (maxBound !== undefined) maxY = Math.min(maxY, maxBound);\n } else {\n // 底部位置:boundsY=[底边最小距离, 底边最大距离]\n // 直接使用边界值作为bottom的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n }\n }\n }\n // 确保各个边界值在默认范围内\n minX = clamp(minX, defaultBounds.minX, defaultBounds.maxX);\n maxX = clamp(maxX, minX, defaultBounds.maxX);\n minY = clamp(minY, defaultBounds.minY, defaultBounds.maxY);\n maxY = clamp(maxY, minY, defaultBounds.maxY);\n\n return { minX, maxX, minY, maxY };\n }\n\n get curPositionKey() {\n let {placement} = this.props;\n if (!placement || !ValidPlacement.includes(placement)) {\n placement = 'bottom-right';\n }\n return placement.split('-') as ['top' | 'bottom', 'left' | 'right']; // [y, x]\n }\n\n get position() {\n const [y, x] = this.curPositionKey;\n const positionStyles: Record<string, string> = {};\n \n // 确保位置值存在且是有效的数字\n if (this.state[y] !== undefined) {\n positionStyles[y] = `${this.state[y]}px`;\n }\n if (this.state[x] !== undefined) {\n positionStyles[x] = `${this.state[x]}px`;\n }\n \n return positionStyles;\n }\n\n draggerRef: HTMLDivElement | null = null;\n\n isDragging = false;\n\n axisX?: number;\n axisY?: number;\n dX = 0;\n dY = 0;\n startTop = 0;\n startLeft = 0;\n\n // 缓存缩放比例,避免在 dragging 中频繁计算\n cachedScaleX = 1;\n cachedScaleY = 1;\n\n __moveDisposer?: () => void;\n __clickDisposer?: () => void;\n __bodyClassDisposer?: () => void;\n __upDisposer?: () => void;\n __resizeDisposer?: () => void;\n __preventScrollDisposer?: () => void;\n\n dragAreaRef: HTMLDivElement | null = null;\n\n reportStartPosition() {\n if (this.draggerRef) {\n // 获取缩放比例\n const { scaleX, scaleY } = getScaleRatio(this.getContainer());\n this.cachedScaleX = scaleX;\n this.cachedScaleY = scaleY;\n const { top, left } = this.draggerRef.getBoundingClientRect();\n const containerRect = this.getContainerRect();\n // console.log(containerRect, 'containerRect');\n \n // 计算相对于容器的位置,并除以缩放比例得到未缩放的坐标\n this.startTop = top / scaleY - containerRect.top + containerRect.scrollTop - containerRect.borderTopWidth;\n this.startLeft = left / scaleY - containerRect.left + containerRect.scrollLeft - containerRect.borderLeftWidth;\n }\n }\n\n enableDrag = (isTouch = false) => {\n this.reportStartPosition();\n this.__moveDisposer?.();\n this.__moveDisposer = addEventListener(isTouch && this.draggerRef ? this.draggerRef : document, isTouch ? 'touchmove' : 'mousemove', (evt) => {\n evt.stopPropagation();\n if (isTouch) {\n evt.preventDefault();\n }\n // INFO: 移动过程中禁止click事件\n if (!this.__clickDisposer) {\n const moveDistanse = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2));\n // INFO: 移动超过px?? 确保用户有真实的移动意愿,而不是手抖~~\n if (moveDistanse > (this.props.showDragAreaOverMoveDistanse || 5)) {\n this.__clickDisposer = addEventListener(\n document,\n 'click',\n (evt) => {\n evt.stopPropagation();\n },\n true\n );\n this.__bodyClassDisposer = addClass([document.body, this.draggerRef], c('moving')) || undefined;\n \n // 显示拖拽区域\n if (this.props.showDragArea && this.dragAreaRef) {\n this.showDragArea();\n }\n }\n }\n this.dragging(evt as TouchEvent | MouseEvent);\n }, {\n passive: !isTouch\n });\n\n this.__upDisposer?.();\n this.__upDisposer = addEventListener(\n document,\n 'mouseup',\n () => {\n this.endDrag();\n },\n true\n );\n };\n\n startDrag = (evt: React.MouseEvent<HTMLDivElement>) => {\n // 判断鼠标非右击才继续执行\n if (evt.nativeEvent.button === 2) {\n return;\n }\n this.axisX = evt.nativeEvent.pageX;\n this.axisY = evt.nativeEvent.pageY;\n if (!this.props.disabled) {\n this.enableDrag();\n }\n };\n\n dragging = (evt: MouseEvent | TouchEvent) => {\n this.isDragging = true;\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n \n // 使用缓存的缩放比例,避免频繁计算\n const scaleX = this.cachedScaleX;\n const scaleY = this.cachedScaleY;\n \n // 获取坐标\n let pageX: number, pageY: number;\n if (evt instanceof TouchEvent) {\n const touch = evt.touches[0];\n if (!touch) return;\n pageX = touch.pageX;\n pageY = touch.pageY;\n } else {\n pageX = evt.pageX;\n pageY = evt.pageY;\n }\n \n // 计算原始偏移量(需要除以缩放比例)\n this.dX = (pageX - (this.axisX || 0)) / scaleX;\n this.dY = (pageY - (this.axisY || 0)) / scaleY;\n \n // 应用方向锁定并计算变换值\n let translateX = this.dX;\n let translateY = this.dY;\n \n if (lockAxis === 'x') {\n translateY = 0; // 锁定Y方向\n } else if (lockAxis === 'y') {\n translateX = 0; // 锁定X方向\n }\n \n // 应用边界条件到允许移动的方向\n const potentialLeft = this.startLeft + translateX;\n const potentialTop = this.startTop + translateY;\n \n // X轴边界条件(在允许X轴移动时应用)\n if (lockAxis !== 'y') {\n if (potentialLeft < minX) {\n translateX = minX - this.startLeft;\n } else if (potentialLeft > maxX) {\n translateX = maxX - this.startLeft;\n }\n }\n \n // Y轴边界条件(在允许Y轴移动时应用)\n if (lockAxis !== 'x') {\n if (potentialTop < minY) {\n translateY = minY - this.startTop;\n } else if (potentialTop > maxY) {\n translateY = maxY - this.startTop;\n }\n }\n \n if (this.draggerRef) {\n this.draggerRef.style.transform = `translate(${translateX}px, ${translateY}px)`;\n }\n };\n\n startTouchDrag = (evt: React.TouchEvent<HTMLDivElement>) => {\n const touch = evt.touches[0];\n if (!touch) return;\n this.axisX = touch.pageX;\n this.axisY = touch.pageY;\n if (!this.props.disabled) {\n this.enableDrag(true);\n }\n };\n\n endDrag = () => {\n if (this.isDragging) {\n this.calcPosition();\n if (this.draggerRef) {\n this.draggerRef.style.transform = '';\n }\n \n // 隐藏拖拽区域\n if (this.props.showDragArea) {\n this.hideDragArea();\n }\n }\n\n if (this.__moveDisposer) {\n this.__moveDisposer();\n this.__moveDisposer = undefined;\n }\n if (this.__clickDisposer) {\n requestAnimationFrame(() => {\n if (this.__clickDisposer) {\n this.__clickDisposer();\n this.__clickDisposer = undefined;\n }\n });\n }\n if (this.__upDisposer) {\n this.__upDisposer();\n this.__upDisposer = undefined;\n }\n if (this.__bodyClassDisposer) {\n this.__bodyClassDisposer();\n this.__bodyClassDisposer = undefined;\n }\n\n this.isDragging = false;\n };\n\n showDragArea = () => {\n if (!this.props.showDragArea || !this.dragAreaRef) return;\n \n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const dragSize = this.dragBoxSize;\n \n // 重置样式\n this.dragAreaRef.style.border = '1px dashed var(--ohkit-color-primary, #1890ff)';\n this.dragAreaRef.style.backgroundColor = 'rgba(173, 216, 230, 0.2)'; // 淡透蓝色\n \n if (lockAxis === 'x') {\n // 锁定Y方向,显示为水平虚线区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = '2px'; // 更细的虚线高度\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${this.startTop + dragSize.height / 2}px`;\n } else if (lockAxis === 'y') {\n // 锁定X方向,显示为垂直虚线区域\n this.dragAreaRef.style.width = '2px'; // 更细的虚线宽度\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${this.startLeft + dragSize.width / 2}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n } else {\n // 自由拖拽,显示完整区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n }\n \n this.dragAreaRef.style.display = 'block';\n };\n\n hideDragArea = () => {\n if (this.dragAreaRef) {\n this.dragAreaRef.style.display = 'none';\n }\n };\n calcPosition = () => {\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const {height, width} = this.getContainerRect();\n \n // 计算新的位置\n let newTop = this.startTop;\n let newLeft = this.startLeft;\n \n if (lockAxis !== 'y') {\n newLeft += this.dX;\n }\n if (lockAxis !== 'x') {\n newTop += this.dY;\n }\n \n // 应用边界限制\n const realTop = clamp(newTop, minY, maxY);\n const realLeft = clamp(newLeft, minX, maxX);\n const realBottom = height - realTop - this.dragBoxSize.height;\n const realRight = width - realLeft - this.dragBoxSize.width;\n if (realTop !== this.state.top || realLeft !== this.state.left || this.state.bottom !== realBottom || this.state.right !== realRight) {\n // console.log(minY, maxY, this.startTop, this.dY, newTop, realTop, 'minY, maxY, this.startTop, this.dY, newTop, realTop --- calcPosition y');\n // console.log(minX, maxX, this.startLeft, this.dX, newLeft, realLeft, 'minX, maxX, this.startLeft, this.dX, newLeft, realLeft ---calcPosition x');\n this.setState({\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight\n });\n }\n this.startTop = realTop;\n this.startLeft = realLeft;\n this.dX = this.dY = 0;\n };\n\n\n componentDidMount() {\n // 检查初始位置是否在边界范围内,如果不在则修正\n this.reportStartPosition();\n this.calcPosition();\n \n this.__resizeDisposer = addEventListener(window, 'resize', () => {\n this.calcPosition();\n });\n\n // 触屏设备时,阻止拖拽时滚动页面\n if (supportsTouchEvents() && this.draggerRef) {\n this.__preventScrollDisposer = addEventListener(this.draggerRef, 'touchmove', (evt) => {\n evt.preventDefault();\n });\n }\n }\n\n componentWillUnmount() {\n this.__resizeDisposer?.();\n this.__bodyClassDisposer?.();\n this.__moveDisposer?.();\n this.__clickDisposer?.();\n this.__upDisposer?.();\n this.__preventScrollDisposer?.();\n }\n\n render() {\n const { className, zIndex, children, showDragArea, positionMode = 'fixed' } = this.props;\n const { startDrag, startTouchDrag, endDrag } = this;\n const stl = {\n zIndex,\n ...this.position,\n position: positionMode\n };\n return (\n <>\n {showDragArea && (\n <div\n className={c('drag-area')}\n ref={(r) => {\n this.dragAreaRef = r;\n }}\n style={{\n display: 'none',\n position: positionMode,\n backgroundColor: 'rgba(173, 216, 230, 0.2)', // 淡透蓝色\n border: '1px dashed var(--ohkit-color-primary, #1890ff)',\n pointerEvents: 'none',\n zIndex: (zIndex || 9999) - 1,\n boxSizing: 'border-box',\n borderRadius: this.props.lockAxis !== 'none' ? '2px' : '0',\n }}\n />\n )}\n <div\n className={cx(c('container'), className)}\n style={stl}\n ref={(r) => {\n this.draggerRef = r;\n }}\n onMouseDownCapture={startDrag}\n onMouseUpCapture={endDrag}\n onTouchStartCapture={startTouchDrag}\n onTouchEndCapture={endDrag}\n >\n {children}\n </div>\n </>\n );\n }\n}\n\nexport default DraggableBox;"],"names":["isPositioningContextCreator","element","includePosition","style","window","getComputedStyle","position","getPropertyValue","transform","filter","perspective","contain","willChange","includes","clamp","value","min","max","Math","ValidPlacement","c","p","DraggableBox","React","Component","constructor","props","super","this","prePositionMode","preDraggerRef","container","draggerRef","isDragging","axisX","axisY","dX","dY","startTop","startLeft","cachedScaleX","cachedScaleY","__moveDisposer","__clickDisposer","__bodyClassDisposer","__upDisposer","__resizeDisposer","__preventScrollDisposer","dragAreaRef","enableDrag","isTouch","_this$__moveDisposer","_this$__upDisposer","reportStartPosition","call","addEventListener","document","evt","stopPropagation","preventDefault","sqrt","pow","showDragAreaOverMoveDistanse","addClass","body","undefined","showDragArea","dragging","passive","endDrag","startDrag","nativeEvent","button","pageX","pageY","disabled","lockAxis","minX","maxX","minY","maxY","dragPositionBoundaries","scaleY","TouchEvent","touch","touches","translateX","translateY","potentialLeft","potentialTop","startTouchDrag","calcPosition","hideDragArea","requestAnimationFrame","dragSize","dragBoxSize","border","backgroundColor","width","height","left","top","display","getContainerRect","newTop","newLeft","realTop","realLeft","realBottom","realRight","state","bottom","right","setState","placement","offsetY","offsetX","placementY","placementX","split","getContainer","useCache","positionMode","dom","findParent","parent","excludeOwn","documentElement","findAbsolutePositionParent","innerWidth","innerHeight","scrollLeft","scrollTop","scrollerScrollLeft","scrollerScrollTop","borderLeftWidth","borderTopWidth","containerRect","getBoundingClientRect","containerStyle","parseFloat","borderRightWidth","borderBottomWidth","offsetWidth","clientWidth","offsetHeight","clientHeight","boundsX","boundsY","containerWidth","containerHeight","defaultBounds","minBound","maxBound","curPositionKey","y","x","positionStyles","scaleX","rect","magnification","round","getScaleRatio","componentDidMount","navigator","maxTouchPoints","componentWillUnmount","_this$__resizeDispose","_this$__bodyClassDisp","_this$__moveDisposer2","_this$__clickDisposer","_this$__upDisposer2","_this$__preventScroll","render","className","zIndex","children","stl","_extends","createElement","Fragment","ref","r","pointerEvents","boxSizing","borderRadius","cx","onMouseDownCapture","onMouseUpCapture","onTouchStartCapture","onTouchEndCapture","defaultProps"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("@ohkit/prefix-classname"),require("@ohkit/dom-helper")):"function"==typeof define&&define.amd?define(["exports","react","@ohkit/prefix-classname","@ohkit/dom-helper"],t):t((e||self).draggableBox={},e.react,e.prefixClassname,e.domHelper)}(this,function(e,t,r,o){function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=/*#__PURE__*/i(t);function n(){return n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var o in r)({}).hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},n.apply(null,arguments)}function s(e,t){return s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},s(e,t)}function d(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}var l=["top-left","top-right","bottom-left","bottom-right"],p=r.prefixClassname("ohkit-draggable-box__"),g=/*#__PURE__*/function(e){function t(t){var r;(r=e.call(this,t)||this).draggerRef=null,r.isDragging=!1,r.axisX=void 0,r.axisY=void 0,r.dX=0,r.dY=0,r.startTop=0,r.startLeft=0,r.cachedScaleX=1,r.cachedScaleY=1,r.__moveDisposer=void 0,r.__clickDisposer=void 0,r.__bodyClassDisposer=void 0,r.__upDisposer=void 0,r.__resizeDisposer=void 0,r.dragAreaRef=null,r.enableDrag=function(){r.reportStartPosition(),null==r.__moveDisposer||r.__moveDisposer(),r.__moveDisposer=o.addEventListener(document,"mousemove",function(e){r.__clickDisposer||Math.sqrt(Math.pow(r.dX,2)+Math.pow(r.dY,2))>5&&(r.__clickDisposer=o.addEventListener(document,"click",function(e){e.stopPropagation()},!0),r.__bodyClassDisposer=o.addClass([document.body,r.draggerRef],p("moving"))||void 0,r.props.showDragArea&&r.dragAreaRef&&r.showDragArea()),r.dragging(e)},!0),null==r.__upDisposer||r.__upDisposer(),r.__upDisposer=o.addEventListener(document,"mouseup",function(e){r.endDrag(),e.stopPropagation(),e.preventDefault()},!0)},r.startDrag=function(e){2!==e.nativeEvent.button&&(r.axisX=e.nativeEvent.pageX,r.axisY=e.nativeEvent.pageY,r.props.disabled||r.enableDrag())},r.dragging=function(e){r.isDragging=!0;var t=r.props.lockAxis,o=r.dragPositionBoundaries,i=o.minX,a=o.maxX,n=o.minY,s=o.maxY,d=r.cachedScaleY;r.dX=(e.pageX-(r.axisX||0))/r.cachedScaleX,r.dY=(e.pageY-(r.axisY||0))/d;var l=r.dX,p=r.dY;"x"===t?p=0:"y"===t&&(l=0);var g=r.startLeft+l,h=r.startTop+p;"y"!==t&&(g<i?l=i-r.startLeft:g>a&&(l=a-r.startLeft)),"x"!==t&&(h<n?p=n-r.startTop:h>s&&(p=s-r.startTop)),r.draggerRef&&(r.draggerRef.style.transform="translate("+l+"px, "+p+"px)"),e.stopPropagation()},r.endDrag=function(){r.isDragging&&(r.calcPosition(),r.draggerRef&&(r.draggerRef.style.transform=""),r.props.showDragArea&&r.hideDragArea()),null==r.__moveDisposer||r.__moveDisposer(),r.__moveDisposer=void 0,r.__clickDisposer&&requestAnimationFrame(function(){r.__clickDisposer&&(r.__clickDisposer(),r.__clickDisposer=void 0)}),null==r.__upDisposer||r.__upDisposer(),r.__upDisposer=void 0,null==r.__bodyClassDisposer||r.__bodyClassDisposer(),r.__bodyClassDisposer=void 0,r.isDragging=!1},r.showDragArea=function(){if(r.props.showDragArea&&r.dragAreaRef){var e=r.props.lockAxis,t=r.dragPositionBoundaries,o=t.minX,i=t.maxX,a=t.minY,n=t.maxY,s=r.dragBoxSize;r.dragAreaRef.style.border="1px dashed var(--ohkit-color-primary, #1890ff)",r.dragAreaRef.style.backgroundColor="rgba(173, 216, 230, 0.2)","x"===e?(r.dragAreaRef.style.width=i-o+s.width+"px",r.dragAreaRef.style.height="2px",r.dragAreaRef.style.left=o+"px",r.dragAreaRef.style.top=r.startTop+s.height/2+"px",r.dragAreaRef.style.border="none",r.dragAreaRef.style.backgroundColor="transparent",r.dragAreaRef.style.backgroundImage="linear-gradient(to right, var(--ohkit-color-primary, #1890ff) 50%, transparent 50%)",r.dragAreaRef.style.backgroundSize="4px 2px"):"y"===e?(r.dragAreaRef.style.width="2px",r.dragAreaRef.style.height=n-a+s.height+"px",r.dragAreaRef.style.left=r.startLeft+s.width/2+"px",r.dragAreaRef.style.top=a+"px",r.dragAreaRef.style.border="none",r.dragAreaRef.style.backgroundColor="transparent",r.dragAreaRef.style.backgroundImage="linear-gradient(to bottom, var(--ohkit-color-primary, #1890ff) 50%, transparent 50%)",r.dragAreaRef.style.backgroundSize="2px 4px"):(r.dragAreaRef.style.width=i-o+s.width+"px",r.dragAreaRef.style.height=n-a+s.height+"px",r.dragAreaRef.style.left=o+"px",r.dragAreaRef.style.top=a+"px"),r.dragAreaRef.style.display="block"}},r.hideDragArea=function(){r.dragAreaRef&&(r.dragAreaRef.style.display="none")},r.calcPosition=function(){var e=r.props.lockAxis,t=r.dragPositionBoundaries,o=t.minX,i=t.maxX,a=t.maxY,n=r.windowSize,s=r.startTop,d=r.startLeft;"y"!==e&&(d+=r.dX),"x"!==e&&(s+=r.dY);var l=Math.min(Math.max(t.minY,s),a),p=Math.min(Math.max(o,d),i),g=n.height-l-r.dragBoxSize.height,h=n.width-p-r.dragBoxSize.width;l===r.state.top&&p===r.state.left&&r.state.bottom===g&&r.state.right===h||r.setState({top:l,left:p,bottom:g,right:h}),r.startTop=l,r.startLeft=p,r.dX=r.dY=0};var i=t.placement,a=t.offsetY,n=void 0===a?20:a,s=t.offsetX,d=void 0===s?20:s,l=(void 0===i?"bottom-right":i).split("-"),g=l[0],h=l[1];return r.state={top:"top"===g?n:void 0,bottom:"bottom"===g?n:void 0,left:"left"===h?d:void 0,right:"right"===h?d:void 0},r}var i,g;g=e,(i=t).prototype=Object.create(g.prototype),i.prototype.constructor=i,s(i,g);var h,f,c=t.prototype;return c.getOtherYKey=function(e){return"top"===e?"bottom":"top"},c.getOtherXKey=function(e){return"left"===e?"right":"left"},c.updatePosition=function(e,t){var r,o=this.getOtherYKey(e),i=this.getOtherXKey(t);this.setState(((r={})[o]=this.dragPositionRang.height-(this.state[e]||0),r[i]=this.dragPositionRang.width-(this.state[t]||0),r))},c.getContainer=function(){var e,t=this.props.positionMode;return"fixed"===(void 0===t?"fixed":t)?(e=this.draggerRef)&&o.findParent(e,function(e){var t=window.getComputedStyle(e),r=t.getPropertyValue("transform"),o=t.getPropertyValue("filter"),i=t.getPropertyValue("perspective");if("none"!==r||"none"!==o||"none"!==i)return!0},{excludeOwn:!0})||document.documentElement:function(e){return e&&o.findParent(e,function(e){if("static"!==window.getComputedStyle(e).getPropertyValue("position"))return!0},{excludeOwn:!0})||document.body}(this.draggerRef)},c.getContainerRect=function(){var e=this.props.positionMode,t="fixed"===(void 0===e?"fixed":e),r=this.getContainer(),o=r.getBoundingClientRect(),i=window.document.scrollingElement||window.document.body,a=r===window.document.body||r===window.document.documentElement;return{width:o.width,height:o.height,left:t&&a?Math.max(o.left,0):o.left+i.scrollLeft,top:t&&a?Math.max(o.top,0):o.top+i.scrollTop,scrollLeft:t&&a?0:r.scrollLeft,scrollTop:t&&a?0:r.scrollTop,scrollerScrollLeft:t&&a?0:i.scrollLeft,scrollerScrollTop:t&&a?0:i.scrollTop}},c.reportStartPosition=function(){if(this.draggerRef){var e=this.draggerRef.getBoundingClientRect(),t=e.top,r=e.left,o=this.getContainerRect(),i=function(e){if(!e)return{scaleX:1,scaleY:1};var t=e.getBoundingClientRect();return{scaleX:e.offsetWidth>0?Math.round(t.width/e.offsetWidth*10)/10:1,scaleY:e.offsetHeight>0?Math.round(t.height/e.offsetHeight*10)/10:1}}(this.draggerRef),a=i.scaleX,n=i.scaleY;this.cachedScaleX=a,this.cachedScaleY=n,this.startTop=(t-o.top+o.scrollerScrollTop)/n+o.scrollTop,this.startLeft=(r-o.left+o.scrollerScrollLeft)/a+o.scrollLeft}},c.componentDidMount=function(){var e=this;this.reportStartPosition(),this.calcPosition(),this.__resizeDisposer=o.addEventListener(window,"resize",function(){e.calcPosition()})},c.componentWillUnmount=function(){var e,t,r,o,i;null==(e=this.__resizeDisposer)||e.call(this),null==(t=this.__bodyClassDisposer)||t.call(this),null==(r=this.__moveDisposer)||r.call(this),null==(o=this.__clickDisposer)||o.call(this),null==(i=this.__upDisposer)||i.call(this)},c.render=function(){var e=this,t=this.props,o=t.className,i=t.zIndex,s=t.children,d=t.showDragArea,l=t.positionMode,g=void 0===l?"fixed":l,h=this.startDrag,f=this.endDrag,c=n({zIndex:i},this.position,{position:g});/*#__PURE__*/return a.default.createElement(Fragment,null,d&&/*#__PURE__*/a.default.createElement("div",{className:p("drag-area"),ref:function(t){e.dragAreaRef=t},style:{display:"none",position:g,backgroundColor:"rgba(173, 216, 230, 0.2)",border:"1px dashed var(--ohkit-color-primary, #1890ff)",pointerEvents:"none",zIndex:(i||9999)-1,boxSizing:"border-box",borderRadius:"none"!==this.props.lockAxis?"2px":"0"}}),/*#__PURE__*/a.default.createElement("div",{className:r.classNames(p("container"),o),style:c,ref:function(t){e.draggerRef=t},onMouseDown:h,onMouseUp:f},s))},h=t,(f=[{key:"windowSize",get:function(){var e=this.getContainer();return{height:e.clientHeight,width:e.clientWidth}}},{key:"dragBoxSize",get:function(){var e=0,t=0;return this.draggerRef&&(e=this.draggerRef.offsetWidth,t=this.draggerRef.offsetHeight),{height:t,width:e}}},{key:"dragPositionBoundaries",get:function(){var e=this.props,t=e.boundsX,r=e.boundsY,o=e.placement,i=this.dragBoxSize,a=this.windowSize,n=(void 0===o?"bottom-right":o).split("-"),s=n[0],d=0,l=a.width-i.width,p=0,g=a.height-i.height;if(t){var h=t[0],f=t[1];if("left"===n[1])void 0!==h&&(d=Math.max(d,h)),void 0!==f&&(l=Math.min(l,f));else if(void 0!==h&&void 0!==f?(d=Math.max(d,a.width-f-i.width),l=Math.min(l,a.width-h-i.width)):void 0!==h?l=Math.min(l,a.width-h-i.width):void 0!==f&&(d=Math.max(d,a.width-f-i.width)),d>l){var c=[l,d];d=c[0],l=c[1]}}if(r){var u=r[0],m=r[1];if("top"===s)void 0!==u&&(p=Math.max(p,u)),void 0!==m&&(g=Math.min(g,m));else if(void 0!==u&&void 0!==m?(p=Math.max(p,a.height-m-i.height),g=Math.min(g,a.height-u-i.height)):void 0!==u?g=Math.min(g,a.height-u-i.height):void 0!==m&&(p=Math.max(p,a.height-m-i.height)),p>g){var v=[g,p];p=v[0],g=v[1]}}return{minX:d,maxX:l,minY:p,maxY:g}}},{key:"dragPositionRang",get:function(){var e=this.dragPositionBoundaries;return{width:e.maxX,height:e.maxY}}},{key:"curPositionKey",get:function(){var e=this.props.placement;return e&&l.includes(e)||(e="bottom-right"),e.split("-")}},{key:"position",get:function(){var e=this.curPositionKey,t=e[0],r=e[1],o={};return void 0!==this.state[t]&&(o[t]=this.state[t]+"px"),void 0!==this.state[r]&&(o[r]=this.state[r]+"px"),o}}])&&function(e,t){for(var r=0;r<t.length;r++){var o=t[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,d(o.key),o)}}(h.prototype,f),Object.defineProperty(h,"prototype",{writable:!1}),h}(a.default.Component);g.defaultProps={zIndex:9999,offsetX:20,offsetY:20,placement:"bottom-right",disabled:!1,lockAxis:"none",showDragArea:!1,positionMode:"fixed"},e.DraggableBox=g,e.c=p,e.default=g});
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("@ohkit/prefix-classname"),require("@ohkit/dom-helper")):"function"==typeof define&&define.amd?define(["exports","react","@ohkit/prefix-classname","@ohkit/dom-helper"],t):t((e||self).draggableBox={},e.react,e.prefixClassname,e.domHelper)}(this,function(e,t,r,i){function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=/*#__PURE__*/o(t);function s(){return s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)({}).hasOwnProperty.call(r,i)&&(e[i]=r[i])}return e},s.apply(null,arguments)}function n(e,t){return n=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},n(e,t)}function d(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var r=t.call(e,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}function l(e,t){var r=window.getComputedStyle(e),i=r.getPropertyValue("position"),o=r.getPropertyValue("transform"),a=r.getPropertyValue("filter"),s=r.getPropertyValue("perspective"),n=r.getPropertyValue("contain"),d=r.getPropertyValue("will-change");return t&&"static"!==i||"none"!==o||"none"!==a||"none"!==s||n.includes("paint")||n.includes("layout")||n.includes("strict")||d.includes("transform")||d.includes("perspective")||d.includes("filter")}function p(e,t,r){return Math.min(Math.max(e,t),r)}var h=["top-left","top-right","bottom-left","bottom-right"],c=r.prefixClassname("ohkit-draggable-box__"),f=/*#__PURE__*/function(e){function t(t){var r;(r=e.call(this,t)||this).prePositionMode=void 0,r.preDraggerRef=null,r.container=null,r.draggerRef=null,r.isDragging=!1,r.axisX=void 0,r.axisY=void 0,r.dX=0,r.dY=0,r.startTop=0,r.startLeft=0,r.cachedScaleX=1,r.cachedScaleY=1,r.__moveDisposer=void 0,r.__clickDisposer=void 0,r.__bodyClassDisposer=void 0,r.__upDisposer=void 0,r.__resizeDisposer=void 0,r.__preventScrollDisposer=void 0,r.dragAreaRef=null,r.enableDrag=function(e){void 0===e&&(e=!1),r.reportStartPosition(),null==r.__moveDisposer||r.__moveDisposer(),r.__moveDisposer=i.addEventListener(e&&r.draggerRef?r.draggerRef:document,e?"touchmove":"mousemove",function(t){t.stopPropagation(),e&&t.preventDefault(),r.__clickDisposer||Math.sqrt(Math.pow(r.dX,2)+Math.pow(r.dY,2))>(r.props.showDragAreaOverMoveDistanse||5)&&(r.__clickDisposer=i.addEventListener(document,"click",function(e){e.stopPropagation()},!0),r.__bodyClassDisposer=i.addClass([document.body,r.draggerRef],c("moving"))||void 0,r.props.showDragArea&&r.dragAreaRef&&r.showDragArea()),r.dragging(t)},{passive:!e}),null==r.__upDisposer||r.__upDisposer(),r.__upDisposer=i.addEventListener(document,"mouseup",function(){r.endDrag()},!0)},r.startDrag=function(e){2!==e.nativeEvent.button&&(r.axisX=e.nativeEvent.pageX,r.axisY=e.nativeEvent.pageY,r.props.disabled||r.enableDrag())},r.dragging=function(e){r.isDragging=!0;var t,i,o=r.props.lockAxis,a=r.dragPositionBoundaries,s=a.minX,n=a.maxX,d=a.minY,l=a.maxY,p=r.cachedScaleY;if(e instanceof TouchEvent){var h=e.touches[0];if(!h)return;t=h.pageX,i=h.pageY}else t=e.pageX,i=e.pageY;r.dX=(t-(r.axisX||0))/r.cachedScaleX,r.dY=(i-(r.axisY||0))/p;var c=r.dX,f=r.dY;"x"===o?f=0:"y"===o&&(c=0);var g=r.startLeft+c,u=r.startTop+f;"y"!==o&&(g<s?c=s-r.startLeft:g>n&&(c=n-r.startLeft)),"x"!==o&&(u<d?f=d-r.startTop:u>l&&(f=l-r.startTop)),r.draggerRef&&(r.draggerRef.style.transform="translate("+c+"px, "+f+"px)")},r.startTouchDrag=function(e){var t=e.touches[0];t&&(r.axisX=t.pageX,r.axisY=t.pageY,r.props.disabled||r.enableDrag(!0))},r.endDrag=function(){r.isDragging&&(r.calcPosition(),r.draggerRef&&(r.draggerRef.style.transform=""),r.props.showDragArea&&r.hideDragArea()),r.__moveDisposer&&(r.__moveDisposer(),r.__moveDisposer=void 0),r.__clickDisposer&&requestAnimationFrame(function(){r.__clickDisposer&&(r.__clickDisposer(),r.__clickDisposer=void 0)}),r.__upDisposer&&(r.__upDisposer(),r.__upDisposer=void 0),r.__bodyClassDisposer&&(r.__bodyClassDisposer(),r.__bodyClassDisposer=void 0),r.isDragging=!1},r.showDragArea=function(){if(r.props.showDragArea&&r.dragAreaRef){var e=r.props.lockAxis,t=r.dragPositionBoundaries,i=t.minX,o=t.maxX,a=t.minY,s=t.maxY,n=r.dragBoxSize;r.dragAreaRef.style.border="1px dashed var(--ohkit-color-primary, #1890ff)",r.dragAreaRef.style.backgroundColor="rgba(173, 216, 230, 0.2)","x"===e?(r.dragAreaRef.style.width=o-i+n.width+"px",r.dragAreaRef.style.height="2px",r.dragAreaRef.style.left=i+"px",r.dragAreaRef.style.top=r.startTop+n.height/2+"px"):"y"===e?(r.dragAreaRef.style.width="2px",r.dragAreaRef.style.height=s-a+n.height+"px",r.dragAreaRef.style.left=r.startLeft+n.width/2+"px",r.dragAreaRef.style.top=a+"px"):(r.dragAreaRef.style.width=o-i+n.width+"px",r.dragAreaRef.style.height=s-a+n.height+"px",r.dragAreaRef.style.left=i+"px",r.dragAreaRef.style.top=a+"px"),r.dragAreaRef.style.display="block"}},r.hideDragArea=function(){r.dragAreaRef&&(r.dragAreaRef.style.display="none")},r.calcPosition=function(){var e=r.props.lockAxis,t=r.dragPositionBoundaries,i=t.minX,o=t.maxX,a=t.minY,s=t.maxY,n=r.getContainerRect(),d=n.height,l=n.width,h=r.startTop,c=r.startLeft;"y"!==e&&(c+=r.dX),"x"!==e&&(h+=r.dY);var f=p(h,a,s),g=p(c,i,o),u=d-f-r.dragBoxSize.height,v=l-g-r.dragBoxSize.width;f===r.state.top&&g===r.state.left&&r.state.bottom===u&&r.state.right===v||r.setState({top:f,left:g,bottom:u,right:v}),r.startTop=f,r.startLeft=g,r.dX=r.dY=0};var o=t.placement,a=t.offsetY,s=void 0===a?20:a,n=t.offsetX,d=void 0===n?20:n,l=(void 0===o?"bottom-right":o).split("-"),h=l[0],f=l[1];return r.state={top:"top"===h?s:void 0,bottom:"bottom"===h?s:void 0,left:"left"===f?d:void 0,right:"right"===f?d:void 0},r}var o,f;f=e,(o=t).prototype=Object.create(f.prototype),o.prototype.constructor=o,n(o,f);var g,u,v=t.prototype;return v.getContainer=function(e){void 0===e&&(e=!0);var t,r=this.props.positionMode,o=void 0===r?"fixed":r;return this.container&&e&&this.prePositionMode===o&&this.preDraggerRef===this.draggerRef||(this.prePositionMode=o,this.preDraggerRef=this.draggerRef,this.container="fixed"===o?(t=this.draggerRef)?i.findParent(t,function(e){return l(e,!1)},{excludeOwn:!0}):document.documentElement:function(e){return e?i.findParent(e,function(e){return l(e,!0)},{excludeOwn:!0}):document.body}(this.draggerRef)),this.container},v.getContainerRect=function(){var e=this.getContainer(!1);if(!e)return{width:window.innerWidth,height:window.innerHeight,left:0,top:0,scrollLeft:0,scrollTop:0,scrollerScrollLeft:0,scrollerScrollTop:0,borderLeftWidth:0,borderTopWidth:0};var t=e.getBoundingClientRect(),r=window.getComputedStyle(e),i=parseFloat(r.borderLeftWidth)||0,o=parseFloat(r.borderTopWidth)||0,a=parseFloat(r.borderRightWidth)||0,s=parseFloat(r.borderBottomWidth)||0;return{width:t.width/this.cachedScaleX-i-a-(e.offsetWidth-e.clientWidth-i-a),height:t.height/this.cachedScaleY-o-s-(e.offsetHeight-e.clientHeight-o-s),left:t.left/this.cachedScaleX,top:t.top/this.cachedScaleY,scrollLeft:e.scrollLeft,scrollTop:e.scrollTop,borderLeftWidth:i,borderTopWidth:o}},v.reportStartPosition=function(){if(this.draggerRef){var e=function(e){if(!e)return{scaleX:1,scaleY:1};var t=e.getBoundingClientRect(),r=1e4;return{scaleX:e.offsetWidth>0?Math.round(t.width/e.offsetWidth*r)/r:1,scaleY:e.offsetHeight>0?Math.round(t.height/e.offsetHeight*r)/r:1}}(this.getContainer()),t=e.scaleY;this.cachedScaleX=e.scaleX,this.cachedScaleY=t;var r=this.draggerRef.getBoundingClientRect(),i=r.top,o=r.left,a=this.getContainerRect();this.startTop=i/t-a.top+a.scrollTop-a.borderTopWidth,this.startLeft=o/t-a.left+a.scrollLeft-a.borderLeftWidth}},v.componentDidMount=function(){var e=this;this.reportStartPosition(),this.calcPosition(),this.__resizeDisposer=i.addEventListener(window,"resize",function(){e.calcPosition()}),"undefined"!=typeof window&&("ontouchstart"in window||navigator.maxTouchPoints>0)&&this.draggerRef&&(this.__preventScrollDisposer=i.addEventListener(this.draggerRef,"touchmove",function(e){e.preventDefault()}))},v.componentWillUnmount=function(){var e,t,r,i,o,a;null==(e=this.__resizeDisposer)||e.call(this),null==(t=this.__bodyClassDisposer)||t.call(this),null==(r=this.__moveDisposer)||r.call(this),null==(i=this.__clickDisposer)||i.call(this),null==(o=this.__upDisposer)||o.call(this),null==(a=this.__preventScrollDisposer)||a.call(this)},v.render=function(){var e=this,t=this.props,i=t.className,o=t.zIndex,n=t.children,d=t.showDragArea,l=t.positionMode,p=void 0===l?"fixed":l,h=this.startDrag,f=this.startTouchDrag,g=this.endDrag,u=s({zIndex:o},this.position,{position:p});/*#__PURE__*/return a.default.createElement(Fragment,null,d&&/*#__PURE__*/a.default.createElement("div",{className:c("drag-area"),ref:function(t){e.dragAreaRef=t},style:{display:"none",position:p,backgroundColor:"rgba(173, 216, 230, 0.2)",border:"1px dashed var(--ohkit-color-primary, #1890ff)",pointerEvents:"none",zIndex:(o||9999)-1,boxSizing:"border-box",borderRadius:"none"!==this.props.lockAxis?"2px":"0"}}),/*#__PURE__*/a.default.createElement("div",{className:r.classNames(c("container"),i),style:u,ref:function(t){e.draggerRef=t},onMouseDownCapture:h,onMouseUpCapture:g,onTouchStartCapture:f,onTouchEndCapture:g},n))},g=t,(u=[{key:"dragBoxSize",get:function(){var e=0,t=0;return this.draggerRef&&(e=this.draggerRef.offsetWidth,t=this.draggerRef.offsetHeight),{height:t,width:e}}},{key:"dragPositionBoundaries",get:function(){var e=this.props,t=e.boundsX,r=e.boundsY,i=e.placement,o=void 0===i?"bottom-right":i,a=this.dragBoxSize,s=this.getContainerRect(),n=s.width,d=s.height,l=o.split("-"),h=l[0],c=l[1],f={minX:0,maxX:Math.max(n-a.width,0),minY:0,maxY:Math.max(d-a.height,0)},g=f.minX,u=f.maxX,v=f.minY,m=f.maxY;if(t){var x=t[0],_=t[1];"left"===c?(void 0!==x&&(g=Math.max(g,x)),void 0!==_&&(u=Math.min(u,_))):void 0!==x&&void 0!==_?(g=Math.max(g,n-_-a.width),u=Math.min(u,n-x-a.width)):void 0!==x?u=Math.min(u,n-x-a.width):void 0!==_&&(g=Math.max(g,n-_-a.width))}if(r){var y=r[0],b=r[1];"top"===h?(void 0!==y&&(v=Math.max(v,y)),void 0!==b&&(m=Math.min(m,b))):void 0!==y&&void 0!==b?(v=Math.max(v,d-b-a.height),m=Math.min(m,d-y-a.height)):void 0!==y?m=Math.min(m,d-y-a.height):void 0!==b&&(v=Math.max(v,d-b-a.height))}return{minX:g=p(g,f.minX,f.maxX),maxX:u=p(u,g,f.maxX),minY:v=p(v,f.minY,f.maxY),maxY:m=p(m,v,f.maxY)}}},{key:"curPositionKey",get:function(){var e=this.props.placement;return e&&h.includes(e)||(e="bottom-right"),e.split("-")}},{key:"position",get:function(){var e=this.curPositionKey,t=e[0],r=e[1],i={};return void 0!==this.state[t]&&(i[t]=this.state[t]+"px"),void 0!==this.state[r]&&(i[r]=this.state[r]+"px"),i}}])&&function(e,t){for(var r=0;r<t.length;r++){var i=t[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,d(i.key),i)}}(g.prototype,u),Object.defineProperty(g,"prototype",{writable:!1}),g}(a.default.Component);f.defaultProps={zIndex:9999,offsetX:20,offsetY:20,placement:"bottom-right",disabled:!1,lockAxis:"none",showDragArea:!1,showDragAreaOverMoveDistanse:5,positionMode:"fixed"},e.DraggableBox=f,e.c=c,e.default=f});
|
|
2
2
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/constants.ts","../src/index.tsx","../src/utils.ts"],"sourcesContent":["\nexport const ValidPlacement = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n","import React from 'react';\nimport {\n prefixClassname as p,\n classNames as cx,\n} from \"@ohkit/prefix-classname\";\nimport {addEventListener, addClass} from '@ohkit/dom-helper';\nimport {findFixedPositionParent, findAbsolutePositionParent, getScaleRatio} from './utils';\nimport {ValidPlacement} from './constants';\nimport {DraggableBoxProps, DraggableBoxState} from './type';\n\nimport './style.scss';\n\nexport const c = p(\"ohkit-draggable-box__\");\nexport class DraggableBox extends React.Component<DraggableBoxProps, DraggableBoxState> {\n static defaultProps: Partial<DraggableBoxProps> = {\n zIndex: 9999,\n offsetX: 20,\n offsetY: 20,\n placement: 'bottom-right',\n disabled: false,\n lockAxis: 'none',\n showDragArea: false,\n positionMode: 'fixed',\n };\n\n constructor(props: DraggableBoxProps) {\n super(props);\n \n const { placement = 'bottom-right', offsetY = 20, offsetX = 20 } = props;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n // 简化状态初始化\n this.state = {\n top: placementY === 'top' ? offsetY : undefined,\n bottom: placementY === 'bottom' ? offsetY : undefined,\n left: placementX === 'left' ? offsetX : undefined,\n right: placementX === 'right' ? offsetX : undefined,\n };\n }\n\n getOtherYKey(yKey: 'top' | 'bottom') {\n return yKey === 'top' ? 'bottom' : 'top';\n }\n\n getOtherXKey(xKey: 'left' | 'right') {\n return xKey === 'left' ? 'right' : 'left';\n }\n\n // TODO:\n updatePosition(yKey: 'top' | 'bottom', xKey: 'left' | 'right') {\n const oYKey = this.getOtherYKey(yKey);\n const oXKey = this.getOtherXKey(xKey);\n this.setState({\n [oYKey]: this.dragPositionRang.height - (this.state[yKey] || 0),\n [oXKey]: this.dragPositionRang.width - (this.state[xKey] || 0),\n });\n }\n /**\n * 获取定位容器\n * 根据 positionMode 返回对应的定位父元素\n */\n private getContainer(): HTMLElement {\n const { positionMode = 'fixed' } = this.props;\n return positionMode === 'fixed' \n ? findFixedPositionParent(this.draggerRef) \n : findAbsolutePositionParent(this.draggerRef);\n }\n\n /**\n * 获取容器的尺寸和位置信息\n */\n private getContainerRect() {\n const { positionMode = 'fixed' } = this.props;\n const isFixed = positionMode === 'fixed';\n const container = this.getContainer();\n const containerRect = container.getBoundingClientRect();\n const rootScrollingElement = window.document.scrollingElement || window.document.body;\n const isRoot = container === window.document.body || container === window.document.documentElement;\n return {\n width: containerRect.width,\n height: containerRect.height,\n left: isFixed && isRoot ? Math.max(containerRect.left, 0) : containerRect.left + rootScrollingElement.scrollLeft,\n top: isFixed && isRoot ? Math.max(containerRect.top, 0) : containerRect.top + rootScrollingElement.scrollTop,\n scrollLeft: isFixed && isRoot ? 0 : container.scrollLeft, // container.scrollLeft,\n scrollTop: isFixed && isRoot ? 0 : container.scrollTop, // container.scrollTop\n scrollerScrollLeft: isFixed && isRoot ? 0 : rootScrollingElement.scrollLeft,\n scrollerScrollTop: isFixed && isRoot ? 0 : rootScrollingElement.scrollTop\n };\n }\n\n get windowSize() {\n const container = this.getContainer();\n const { clientWidth, clientHeight } = container;\n return {\n height: clientHeight,\n width: clientWidth\n };\n }\n\n get dragBoxSize() {\n let width = 0;\n let height = 0;\n if (this.draggerRef) {\n width = this.draggerRef.offsetWidth;\n height = this.draggerRef.offsetHeight;\n }\n return {\n height,\n width\n };\n }\n\n get dragPositionBoundaries() {\n const { boundsX, boundsY, placement = 'bottom-right' } = this.props;\n const dragSize = this.dragBoxSize;\n const windowSize = this.windowSize;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n // 初始化边界\n let minX = 0;\n let maxX = windowSize.width - dragSize.width;\n let minY = 0;\n let maxY = windowSize.height - dragSize.height;\n\n // 处理X轴边界\n if (boundsX) {\n const [minBound, maxBound] = boundsX;\n \n if (placementX === 'left') {\n // 左边位置:boundsX=[左边最小距离, 左边最大距离]\n if (minBound !== undefined) minX = Math.max(minX, minBound);\n if (maxBound !== undefined) maxX = Math.min(maxX, maxBound);\n } else {\n // 右边位置:boundsX=[右边最小距离, 右边最大距离]\n // 直接使用边界值作为right的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minX = Math.max(minX, windowSize.width - maxBound - dragSize.width);\n maxX = Math.min(maxX, windowSize.width - minBound - dragSize.width);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxX = Math.min(maxX, windowSize.width - minBound - dragSize.width);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minX = Math.max(minX, windowSize.width - maxBound - dragSize.width);\n }\n \n // 确保最小边界不大于最大边界\n if (minX > maxX) {\n [minX, maxX] = [maxX, minX];\n }\n }\n }\n\n // 处理Y轴边界\n if (boundsY) {\n const [minBound, maxBound] = boundsY;\n \n if (placementY === 'top') {\n // 顶部位置:boundsY=[顶边最小距离, 顶边最大距离]\n if (minBound !== undefined) minY = Math.max(minY, minBound);\n if (maxBound !== undefined) maxY = Math.min(maxY, maxBound);\n } else {\n // 底部位置:boundsY=[底边最小距离, 底边最大距离]\n // 直接使用边界值作为bottom的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minY = Math.max(minY, windowSize.height - maxBound - dragSize.height);\n maxY = Math.min(maxY, windowSize.height - minBound - dragSize.height);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxY = Math.min(maxY, windowSize.height - minBound - dragSize.height);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minY = Math.max(minY, windowSize.height - maxBound - dragSize.height);\n }\n \n // 确保最小边界不大于最大边界\n if (minY > maxY) {\n [minY, maxY] = [maxY, minY];\n }\n }\n }\n\n return { minX, maxX, minY, maxY };\n }\n \n // 保持向后兼容\n get dragPositionRang() {\n const { maxX, maxY } = this.dragPositionBoundaries;\n return { width: maxX, height: maxY };\n }\n\n get curPositionKey() {\n let {placement} = this.props;\n if (!placement || !ValidPlacement.includes(placement)) {\n placement = 'bottom-right';\n }\n return placement.split('-') as ['top' | 'bottom', 'left' | 'right']; // [y, x]\n }\n\n get position() {\n const [y, x] = this.curPositionKey;\n const positionStyles: Record<string, string> = {};\n \n // 确保位置值存在且是有效的数字\n if (this.state[y] !== undefined) {\n positionStyles[y] = `${this.state[y]}px`;\n }\n if (this.state[x] !== undefined) {\n positionStyles[x] = `${this.state[x]}px`;\n }\n \n return positionStyles;\n }\n\n draggerRef: HTMLDivElement | null = null;\n\n isDragging = false;\n\n axisX?: number;\n axisY?: number;\n dX = 0;\n dY = 0;\n startTop = 0;\n startLeft = 0;\n\n // 缓存缩放比例,避免在 dragging 中频繁计算\n cachedScaleX = 1;\n cachedScaleY = 1;\n\n __moveDisposer?: () => void;\n __clickDisposer?: () => void;\n __bodyClassDisposer?: () => void;\n __upDisposer?: () => void;\n __resizeDisposer?: () => void;\n\n dragAreaRef: HTMLDivElement | null = null;\n\n reportStartPosition() {\n if (this.draggerRef) {\n const { top, left } = this.draggerRef.getBoundingClientRect();\n const containerRect = this.getContainerRect();\n // console.log(containerRect, 'containerRect');\n \n // 获取缩放比例\n const { scaleX, scaleY } = getScaleRatio(this.draggerRef);\n this.cachedScaleX = scaleX;\n this.cachedScaleY = scaleY;\n \n // 计算相对于容器的位置,并除以缩放比例得到未缩放的坐标\n this.startTop = (top - containerRect.top + containerRect.scrollerScrollTop) / scaleY + containerRect.scrollTop;\n this.startLeft = (left - containerRect.left + containerRect.scrollerScrollLeft) / scaleX + containerRect.scrollLeft;\n }\n }\n\n enableDrag = () => {\n this.reportStartPosition();\n this.__moveDisposer?.();\n this.__moveDisposer = addEventListener(document, 'mousemove', (evt) => {\n // INFO: 移动过程中禁止click事件\n if (!this.__clickDisposer) {\n const moveDistanse = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2));\n // INFO: 移动超过5px?? 确保用户有真实的移动意愿,而不是手抖~~\n if (moveDistanse > 5) {\n this.__clickDisposer = addEventListener(\n document,\n 'click',\n (evt) => {\n evt.stopPropagation();\n },\n true\n );\n this.__bodyClassDisposer = addClass([document.body, this.draggerRef], c('moving')) || undefined;\n \n // 显示拖拽区域\n if (this.props.showDragArea && this.dragAreaRef) {\n this.showDragArea();\n }\n }\n }\n this.dragging(evt);\n }, true);\n\n this.__upDisposer?.();\n this.__upDisposer = addEventListener(\n document,\n 'mouseup',\n (evt) => {\n this.endDrag();\n evt.stopPropagation();\n evt.preventDefault();\n },\n true\n );\n };\n\n startDrag = (evt: React.MouseEvent<HTMLDivElement>) => {\n // 判断鼠标非右击才继续执行\n if (evt.nativeEvent.button === 2) {\n return;\n }\n this.axisX = evt.nativeEvent.pageX;\n this.axisY = evt.nativeEvent.pageY;\n if (!this.props.disabled) {\n this.enableDrag();\n }\n };\n\n dragging = (evt: MouseEvent) => {\n this.isDragging = true;\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n \n // 使用缓存的缩放比例,避免频繁计算\n const scaleX = this.cachedScaleX;\n const scaleY = this.cachedScaleY;\n \n // 计算原始偏移量(需要除以缩放比例)\n this.dX = (evt.pageX - (this.axisX || 0)) / scaleX;\n this.dY = (evt.pageY - (this.axisY || 0)) / scaleY;\n \n // 应用方向锁定并计算变换值\n let translateX = this.dX;\n let translateY = this.dY;\n \n if (lockAxis === 'x') {\n translateY = 0; // 锁定Y方向\n } else if (lockAxis === 'y') {\n translateX = 0; // 锁定X方向\n }\n \n // 应用边界条件到允许移动的方向\n const potentialLeft = this.startLeft + translateX;\n const potentialTop = this.startTop + translateY;\n \n // X轴边界条件(在允许X轴移动时应用)\n if (lockAxis !== 'y') {\n if (potentialLeft < minX) {\n translateX = minX - this.startLeft;\n } else if (potentialLeft > maxX) {\n translateX = maxX - this.startLeft;\n }\n }\n \n // Y轴边界条件(在允许Y轴移动时应用)\n if (lockAxis !== 'x') {\n if (potentialTop < minY) {\n translateY = minY - this.startTop;\n } else if (potentialTop > maxY) {\n translateY = maxY - this.startTop;\n }\n }\n \n if (this.draggerRef) {\n this.draggerRef.style.transform = `translate(${translateX}px, ${translateY}px)`;\n }\n evt.stopPropagation();\n };\n\n endDrag = () => {\n if (this.isDragging) {\n this.calcPosition();\n if (this.draggerRef) {\n this.draggerRef.style.transform = '';\n }\n \n // 隐藏拖拽区域\n if (this.props.showDragArea) {\n this.hideDragArea();\n }\n }\n\n this.__moveDisposer?.();\n this.__moveDisposer = undefined;\n if (this.__clickDisposer) {\n requestAnimationFrame(() => {\n if (this.__clickDisposer) {\n this.__clickDisposer();\n this.__clickDisposer = undefined;\n }\n });\n }\n this.__upDisposer?.();\n this.__upDisposer = undefined;\n this.__bodyClassDisposer?.();\n this.__bodyClassDisposer = undefined;\n\n this.isDragging = false;\n };\n\n showDragArea = () => {\n if (!this.props.showDragArea || !this.dragAreaRef) return;\n \n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const dragSize = this.dragBoxSize;\n \n // 重置样式\n this.dragAreaRef.style.border = '1px dashed var(--ohkit-color-primary, #1890ff)';\n this.dragAreaRef.style.backgroundColor = 'rgba(173, 216, 230, 0.2)'; // 淡透蓝色\n \n if (lockAxis === 'x') {\n // 锁定Y方向,显示为水平虚线区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = '2px'; // 更细的虚线高度\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${this.startTop + dragSize.height / 2}px`;\n this.dragAreaRef.style.border = 'none';\n this.dragAreaRef.style.backgroundColor = 'transparent'; // 透明背景\n this.dragAreaRef.style.backgroundImage = 'linear-gradient(to right, var(--ohkit-color-primary, #1890ff) 50%, transparent 50%)';\n this.dragAreaRef.style.backgroundSize = '4px 2px'; // 虚线模式\n } else if (lockAxis === 'y') {\n // 锁定X方向,显示为垂直虚线区域\n this.dragAreaRef.style.width = '2px'; // 更细的虚线宽度\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${this.startLeft + dragSize.width / 2}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n this.dragAreaRef.style.border = 'none';\n this.dragAreaRef.style.backgroundColor = 'transparent'; // 透明背景\n this.dragAreaRef.style.backgroundImage = 'linear-gradient(to bottom, var(--ohkit-color-primary, #1890ff) 50%, transparent 50%)';\n this.dragAreaRef.style.backgroundSize = '2px 4px'; // 虚线模式\n } else {\n // 自由拖拽,显示完整区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n }\n \n this.dragAreaRef.style.display = 'block';\n };\n\n hideDragArea = () => {\n if (this.dragAreaRef) {\n this.dragAreaRef.style.display = 'none';\n }\n };\n calcPosition = () => {\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const containerSize = this.windowSize;\n \n // 计算新的位置\n let newTop = this.startTop;\n let newLeft = this.startLeft;\n \n if (lockAxis !== 'y') {\n newLeft += this.dX;\n }\n if (lockAxis !== 'x') {\n newTop += this.dY;\n }\n \n // 应用边界限制\n const realTop = Math.min(Math.max(minY, newTop), maxY);\n const realLeft = Math.min(Math.max(minX, newLeft), maxX);\n const realBottom = containerSize.height - realTop - this.dragBoxSize.height;\n const realRight = containerSize.width - realLeft - this.dragBoxSize.width;\n if (realTop !== this.state.top || realLeft !== this.state.left || this.state.bottom !== realBottom || this.state.right !== realRight) {\n // console.log(minY, maxY, this.startTop, this.dY, newTop, realTop, 'calcPosition y');\n // console.log(minX, maxX, this.startLeft, this.dX, newLeft, realLeft, 'calcPosition x');\n this.setState({\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight\n });\n }\n this.startTop = realTop;\n this.startLeft = realLeft;\n this.dX = this.dY = 0;\n };\n\n\n componentDidMount() {\n // 检查初始位置是否在边界范围内,如果不在则修正\n this.reportStartPosition();\n this.calcPosition();\n \n this.__resizeDisposer = addEventListener(window, 'resize', () => {\n this.calcPosition();\n });\n }\n\n componentWillUnmount() {\n this.__resizeDisposer?.();\n this.__bodyClassDisposer?.();\n this.__moveDisposer?.();\n this.__clickDisposer?.();\n this.__upDisposer?.();\n }\n\n render() {\n const { className, zIndex, children, showDragArea, positionMode = 'fixed' } = this.props;\n const { startDrag, endDrag } = this;\n const stl = {\n zIndex,\n ...this.position,\n position: positionMode\n };\n return (\n <>\n {showDragArea && (\n <div\n className={c('drag-area')}\n ref={(r) => {\n this.dragAreaRef = r;\n }}\n style={{\n display: 'none',\n position: positionMode,\n backgroundColor: 'rgba(173, 216, 230, 0.2)', // 淡透蓝色\n border: '1px dashed var(--ohkit-color-primary, #1890ff)',\n pointerEvents: 'none',\n zIndex: (zIndex || 9999) - 1,\n boxSizing: 'border-box',\n borderRadius: this.props.lockAxis !== 'none' ? '2px' : '0',\n }}\n />\n )}\n <div\n className={cx(c('container'), className)}\n style={stl}\n ref={(r) => {\n this.draggerRef = r;\n }}\n onMouseDown={startDrag}\n onMouseUp={endDrag}\n >\n {children}\n </div>\n </>\n );\n }\n}\n\nexport default DraggableBox;","import {findParent} from '@ohkit/dom-helper';\n\n/**\n * 查找影响 fixed 定位的父元素\n * 当父元素有 transform/filter/perspective 等属性时,fixed 定位会相对于该父元素\n */\nexport function findFixedPositionParent(dom?: HTMLElement | null): HTMLElement {\n if (!dom) {\n return document.documentElement;\n }\n const fixedPositionParent = findParent(dom, (parent) => {\n const style = window.getComputedStyle(parent);\n const transform = style.getPropertyValue('transform');\n const filter = style.getPropertyValue('filter');\n const perspective = style.getPropertyValue('perspective');\n \n // 检查是否有影响 fixed 定位的属性\n if (transform !== 'none' || filter !== 'none' || perspective !== 'none') {\n return true;\n }\n }, {excludeOwn: true}) || document.documentElement; // 没有找到,返回 window(通过 document.documentElement)\n return fixedPositionParent;\n}\n\n/**\n * 查找 absolute 定位的父元素\n * 查找最近的 position 不为 static 的元素\n */\nexport function findAbsolutePositionParent(dom?: HTMLElement | null): HTMLElement {\n if (!dom) {\n return document.body;\n }\n return findParent(dom, (parent) => {\n const style = window.getComputedStyle(parent);\n const position = style.getPropertyValue('position');\n if (position !== 'static') {\n return true;\n }\n }, {excludeOwn: true}) || document.body;\n}\n\n/**\n * 获取容器的缩放比例\n * 通过比较元素的实际尺寸和 getBoundingClientRect 返回的尺寸来计算缩放比例\n */\nexport function getScaleRatio(dom?: HTMLElement | null): { scaleX: number; scaleY: number } {\n if (!dom) {\n return { scaleX: 1, scaleY: 1 };\n }\n // 通过比较 offsetWidth 和 getBoundingClientRect().width 来获取缩放比例\n const rect = dom.getBoundingClientRect();\n // 扩大10倍进行计算,避免浮点数精度问题\n const scaleX = dom.offsetWidth > 0 ? Math.round(rect.width / dom.offsetWidth * 10) / 10 : 1;\n const scaleY = dom.offsetHeight > 0 ? Math.round(rect.height / dom.offsetHeight * 10) / 10 : 1;\n // console.log('scaleX', scaleX, 'scaleY', scaleY);\n return { scaleX, scaleY };\n}\n"],"names":["ValidPlacement","c","p","prefixClassname","DraggableBox","_React$Component","props","_this","call","this","draggerRef","isDragging","axisX","axisY","dX","dY","startTop","startLeft","cachedScaleX","cachedScaleY","__moveDisposer","__clickDisposer","__bodyClassDisposer","__upDisposer","__resizeDisposer","dragAreaRef","enableDrag","reportStartPosition","addEventListener","document","evt","Math","sqrt","pow","stopPropagation","addClass","body","undefined","showDragArea","dragging","endDrag","preventDefault","startDrag","nativeEvent","button","pageX","pageY","disabled","lockAxis","_this$dragPositionBou","dragPositionBoundaries","minX","maxX","minY","maxY","scaleY","translateX","translateY","potentialLeft","potentialTop","style","transform","calcPosition","hideDragArea","requestAnimationFrame","_this$dragPositionBou2","dragSize","dragBoxSize","border","backgroundColor","width","height","left","top","backgroundImage","backgroundSize","display","_this$dragPositionBou3","containerSize","windowSize","newTop","newLeft","realTop","min","max","realLeft","realBottom","realRight","state","bottom","right","setState","_props$placement","placement","_props$offsetY","offsetY","_props$offsetX","offsetX","_placement$split","split","placementY","placementX","_proto","prototype","getOtherYKey","yKey","getOtherXKey","xKey","updatePosition","_this$setState","oYKey","oXKey","dragPositionRang","getContainer","dom","_this$props$positionM","positionMode","findParent","parent","window","getComputedStyle","getPropertyValue","filter","perspective","excludeOwn","documentElement","findAbsolutePositionParent","getContainerRect","_this$props$positionM2","isFixed","container","containerRect","getBoundingClientRect","rootScrollingElement","scrollingElement","isRoot","scrollLeft","scrollTop","scrollerScrollLeft","scrollerScrollTop","_this$draggerRef$getB","_getScaleRatio","scaleX","rect","offsetWidth","round","offsetHeight","getScaleRatio","componentDidMount","_this2","componentWillUnmount","_this$__resizeDispose","_this$__bodyClassDisp","_this$__moveDisposer","_this$__clickDisposer","_this$__upDisposer","render","_this3","_this$props","className","zIndex","children","_this$props$positionM3","stl","_extends","position","React","createElement","Fragment","ref","r","pointerEvents","boxSizing","borderRadius","cx","onMouseDown","onMouseUp","key","get","clientHeight","clientWidth","_this$props2","boundsX","boundsY","_this$props2$placemen","_placement$split2","minBound","maxBound","_ref","_ref2","_this$dragPositionBou4","includes","_this$curPositionKey","curPositionKey","y","x","positionStyles","Component","defaultProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/utils.ts","../src/constants.ts","../src/index.tsx"],"sourcesContent":["import {findParent} from '@ohkit/dom-helper';\n\n/**\n * 检查元素是否创建了新的定位上下文(包含块)\n * @param element 要检查的元素\n * @param includePosition 是否检查position属性(absolute/relative/fixed)\n */\nexport function isPositioningContextCreator(element: HTMLElement, includePosition: boolean): boolean {\n const style = window.getComputedStyle(element);\n const position = style.getPropertyValue('position');\n const transform = style.getPropertyValue('transform');\n const filter = style.getPropertyValue('filter');\n const perspective = style.getPropertyValue('perspective');\n const contain = style.getPropertyValue('contain');\n const willChange = style.getPropertyValue('will-change');\n \n return (includePosition && position !== 'static') || \n transform !== 'none' || \n filter !== 'none' || \n perspective !== 'none' ||\n contain.includes('paint') ||\n contain.includes('layout') ||\n contain.includes('strict') ||\n willChange.includes('transform') ||\n willChange.includes('perspective') ||\n willChange.includes('filter');\n}\n\n/**\n * 查找影响 fixed 定位的父元素\n * 当父元素有 transform/filter/perspective/contain/will-change 等属性时,fixed 定位会相对于该父元素\n */\nexport function findFixedPositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.documentElement;\n }\n const fixedPositionParent = findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, false);\n }, {excludeOwn: true}); // 没有找到,返回 window(通过 document.documentElement)\n return fixedPositionParent;\n}\n\n/**\n * 查找 absolute 定位的父元素\n * 查找最近的包含块创建者,包含所有可能影响absolute定位的属性\n */\nexport function findAbsolutePositionParent(dom?: HTMLElement | null) {\n if (!dom) {\n return document.body;\n }\n return findParent(dom, (parent) => {\n return isPositioningContextCreator(parent, true);\n }, {excludeOwn: true});\n}\n\n/**\n * 获取容器的缩放比例\n * 通过比较元素的实际尺寸和 getBoundingClientRect 返回的尺寸来计算缩放比例\n */\nexport function getScaleRatio(dom?: HTMLElement | null): { scaleX: number; scaleY: number } {\n if (!dom) {\n return { scaleX: 1, scaleY: 1 };\n }\n // 通过比较 offsetWidth 和 getBoundingClientRect().width 来获取缩放比例\n const rect = dom.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n // 扩大{magnification}倍进行计算, 相当于保留小数点后4位\n const magnification = 10000;\n scaleX = dom.offsetWidth > 0 ? Math.round(rect.width / dom.offsetWidth * magnification) / magnification : 1;\n scaleY = dom.offsetHeight > 0 ? Math.round(rect.height / dom.offsetHeight * magnification) / magnification : 1;\n // console.log('rect.width dom.offsetWidth', rect.width, dom.offsetWidth);\n // console.log('rect.height dom.offsetHeight', rect.height, dom.offsetHeight);\n // console.log('scaleX', scaleX, 'scaleY', scaleY);\n return { scaleX, scaleY };\n}\n\n/**\n * 限制数值在指定范围内\n * \n * @param value 要限制的数值\n * @param min 最小值\n * @param max 最大值\n * @returns 限制后的数值,确保在 [min, max] 范围内\n */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\n\n/**\n * 检测当前环境是否支持触摸事件\n * \n * @returns 如果环境支持触摸事件返回 true,否则返回 false\n */\nexport function supportsTouchEvents() {\n return typeof window !== 'undefined' && ('ontouchstart' in window || navigator.maxTouchPoints > 0);\n};","\nexport const ValidPlacement = ['top-left', 'top-right', 'bottom-left', 'bottom-right'] as const;\n","import React from 'react';\nimport {\n prefixClassname as p,\n classNames as cx,\n} from \"@ohkit/prefix-classname\";\nimport {addEventListener, addClass} from '@ohkit/dom-helper';\nimport {findFixedPositionParent, findAbsolutePositionParent, getScaleRatio, clamp, supportsTouchEvents} from './utils';\nimport {ValidPlacement} from './constants';\nimport {DraggableBoxProps, DraggableBoxState} from './type';\n\nimport './style.scss';\n\nexport const c = p(\"ohkit-draggable-box__\");\nexport class DraggableBox extends React.Component<DraggableBoxProps, DraggableBoxState> {\n static defaultProps: Partial<DraggableBoxProps> = {\n zIndex: 9999,\n offsetX: 20,\n offsetY: 20,\n placement: 'bottom-right',\n disabled: false,\n lockAxis: 'none',\n showDragArea: false,\n showDragAreaOverMoveDistanse: 5,\n positionMode: 'fixed',\n };\n\n constructor(props: DraggableBoxProps) {\n super(props);\n \n const { placement = 'bottom-right', offsetY = 20, offsetX = 20 } = props;\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n // 简化状态初始化\n this.state = {\n top: placementY === 'top' ? offsetY : undefined,\n bottom: placementY === 'bottom' ? offsetY : undefined,\n left: placementX === 'left' ? offsetX : undefined,\n right: placementX === 'right' ? offsetX : undefined,\n };\n }\n\n private prePositionMode: DraggableBoxProps['positionMode'];\n private preDraggerRef: HTMLElement | null = null;\n private container: HTMLElement | null = null;\n /**\n * 获取定位容器\n * 根据 positionMode 返回对应的定位父元素\n */\n private getContainer(useCache = true) {\n const { positionMode = 'fixed' } = this.props;\n if (!this.container || !useCache || this.prePositionMode !== positionMode || this.preDraggerRef !== this.draggerRef) {\n this.prePositionMode = positionMode;\n this.preDraggerRef = this.draggerRef;\n this.container = positionMode === 'fixed' \n ? findFixedPositionParent(this.draggerRef) \n : findAbsolutePositionParent(this.draggerRef);\n }\n return this.container;\n }\n\n /**\n * 获取容器的尺寸和位置信息\n */\n private getContainerRect() {\n const container = this.getContainer(false);\n if (!container) {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n left: 0,\n top: 0,\n scrollLeft: 0,\n scrollTop: 0,\n scrollerScrollLeft: 0,\n scrollerScrollTop: 0,\n borderLeftWidth: 0,\n borderTopWidth: 0\n };\n }\n const containerRect = container.getBoundingClientRect();\n \n // 获取容器的border宽度(仅 top, left 对坐标计算有影响)\n const containerStyle = window.getComputedStyle(container);\n const borderLeftWidth = parseFloat(containerStyle.borderLeftWidth) || 0;\n const borderTopWidth = parseFloat(containerStyle.borderTopWidth) || 0;\n const borderRightWidth = parseFloat(containerStyle.borderRightWidth) || 0;\n const borderBottomWidth = parseFloat(containerStyle.borderBottomWidth) || 0;\n const yScrollerWidth = container.offsetWidth - container.clientWidth - borderLeftWidth - borderRightWidth;\n const xScrollerHeight = container.offsetHeight - container.clientHeight - borderTopWidth - borderBottomWidth;\n // console.log('yScrollerWidth, xScrollerHeight', yScrollerWidth, xScrollerHeight);\n\n return {\n width: containerRect.width / this.cachedScaleX - borderLeftWidth - borderRightWidth - yScrollerWidth,\n height: containerRect.height / this.cachedScaleY - borderTopWidth - borderBottomWidth - xScrollerHeight,\n left: containerRect.left / this.cachedScaleX,\n top: containerRect.top / this.cachedScaleY,\n scrollLeft: container.scrollLeft,\n scrollTop: container.scrollTop,\n borderLeftWidth: borderLeftWidth,\n borderTopWidth: borderTopWidth,\n };\n }\n\n get dragBoxSize() {\n let width = 0;\n let height = 0;\n if (this.draggerRef) {\n width = this.draggerRef.offsetWidth;\n height = this.draggerRef.offsetHeight;\n }\n return {\n height,\n width\n };\n }\n\n get dragPositionBoundaries() {\n const { boundsX, boundsY, placement = 'bottom-right' } = this.props;\n const dragSize = this.dragBoxSize;\n const {width: containerWidth, height: containerHeight} = this.getContainerRect();\n const [placementY, placementX] = placement.split('-') as ['top' | 'bottom', 'left' | 'right'];\n \n const defaultBounds = {\n minX: 0,\n maxX: Math.max(containerWidth - dragSize.width, 0),\n minY: 0,\n maxY: Math.max(containerHeight- dragSize.height, 0),\n };\n // 初始化边界\n let {minX, maxX, minY, maxY} = defaultBounds\n\n // 处理X轴边界\n if (boundsX) {\n const [minBound, maxBound] = boundsX;\n if (placementX === 'left') {\n // 左边位置:boundsX=[左边最小距离, 左边最大距离]\n if (minBound !== undefined) minX = Math.max(minX, minBound);\n if (maxBound !== undefined) maxX = Math.min(maxX, maxBound);\n } else {\n // 右边位置:boundsX=[右边最小距离, 右边最大距离]\n // 直接使用边界值作为right的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxX = Math.min(maxX, containerWidth - minBound - dragSize.width);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minX = Math.max(minX, containerWidth - maxBound - dragSize.width);\n }\n }\n }\n\n // 处理Y轴边界\n if (boundsY) {\n const [minBound, maxBound] = boundsY;\n \n if (placementY === 'top') {\n // 顶部位置:boundsY=[顶边最小距离, 顶边最大距离]\n if (minBound !== undefined) minY = Math.max(minY, minBound);\n if (maxBound !== undefined) maxY = Math.min(maxY, maxBound);\n } else {\n // 底部位置:boundsY=[底边最小距离, 底边最大距离]\n // 直接使用边界值作为bottom的限制\n if (minBound !== undefined && maxBound !== undefined) {\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (minBound !== undefined) {\n // 只有minBound:设置最大边界,最小边界保持默认\n maxY = Math.min(maxY, containerHeight - minBound - dragSize.height);\n } else if (maxBound !== undefined) {\n // 只有maxBound:设置最小边界,最大边界保持默认\n minY = Math.max(minY, containerHeight - maxBound - dragSize.height);\n }\n }\n }\n // 确保各个边界值在默认范围内\n minX = clamp(minX, defaultBounds.minX, defaultBounds.maxX);\n maxX = clamp(maxX, minX, defaultBounds.maxX);\n minY = clamp(minY, defaultBounds.minY, defaultBounds.maxY);\n maxY = clamp(maxY, minY, defaultBounds.maxY);\n\n return { minX, maxX, minY, maxY };\n }\n\n get curPositionKey() {\n let {placement} = this.props;\n if (!placement || !ValidPlacement.includes(placement)) {\n placement = 'bottom-right';\n }\n return placement.split('-') as ['top' | 'bottom', 'left' | 'right']; // [y, x]\n }\n\n get position() {\n const [y, x] = this.curPositionKey;\n const positionStyles: Record<string, string> = {};\n \n // 确保位置值存在且是有效的数字\n if (this.state[y] !== undefined) {\n positionStyles[y] = `${this.state[y]}px`;\n }\n if (this.state[x] !== undefined) {\n positionStyles[x] = `${this.state[x]}px`;\n }\n \n return positionStyles;\n }\n\n draggerRef: HTMLDivElement | null = null;\n\n isDragging = false;\n\n axisX?: number;\n axisY?: number;\n dX = 0;\n dY = 0;\n startTop = 0;\n startLeft = 0;\n\n // 缓存缩放比例,避免在 dragging 中频繁计算\n cachedScaleX = 1;\n cachedScaleY = 1;\n\n __moveDisposer?: () => void;\n __clickDisposer?: () => void;\n __bodyClassDisposer?: () => void;\n __upDisposer?: () => void;\n __resizeDisposer?: () => void;\n __preventScrollDisposer?: () => void;\n\n dragAreaRef: HTMLDivElement | null = null;\n\n reportStartPosition() {\n if (this.draggerRef) {\n // 获取缩放比例\n const { scaleX, scaleY } = getScaleRatio(this.getContainer());\n this.cachedScaleX = scaleX;\n this.cachedScaleY = scaleY;\n const { top, left } = this.draggerRef.getBoundingClientRect();\n const containerRect = this.getContainerRect();\n // console.log(containerRect, 'containerRect');\n \n // 计算相对于容器的位置,并除以缩放比例得到未缩放的坐标\n this.startTop = top / scaleY - containerRect.top + containerRect.scrollTop - containerRect.borderTopWidth;\n this.startLeft = left / scaleY - containerRect.left + containerRect.scrollLeft - containerRect.borderLeftWidth;\n }\n }\n\n enableDrag = (isTouch = false) => {\n this.reportStartPosition();\n this.__moveDisposer?.();\n this.__moveDisposer = addEventListener(isTouch && this.draggerRef ? this.draggerRef : document, isTouch ? 'touchmove' : 'mousemove', (evt) => {\n evt.stopPropagation();\n if (isTouch) {\n evt.preventDefault();\n }\n // INFO: 移动过程中禁止click事件\n if (!this.__clickDisposer) {\n const moveDistanse = Math.sqrt(Math.pow(this.dX, 2) + Math.pow(this.dY, 2));\n // INFO: 移动超过px?? 确保用户有真实的移动意愿,而不是手抖~~\n if (moveDistanse > (this.props.showDragAreaOverMoveDistanse || 5)) {\n this.__clickDisposer = addEventListener(\n document,\n 'click',\n (evt) => {\n evt.stopPropagation();\n },\n true\n );\n this.__bodyClassDisposer = addClass([document.body, this.draggerRef], c('moving')) || undefined;\n \n // 显示拖拽区域\n if (this.props.showDragArea && this.dragAreaRef) {\n this.showDragArea();\n }\n }\n }\n this.dragging(evt as TouchEvent | MouseEvent);\n }, {\n passive: !isTouch\n });\n\n this.__upDisposer?.();\n this.__upDisposer = addEventListener(\n document,\n 'mouseup',\n () => {\n this.endDrag();\n },\n true\n );\n };\n\n startDrag = (evt: React.MouseEvent<HTMLDivElement>) => {\n // 判断鼠标非右击才继续执行\n if (evt.nativeEvent.button === 2) {\n return;\n }\n this.axisX = evt.nativeEvent.pageX;\n this.axisY = evt.nativeEvent.pageY;\n if (!this.props.disabled) {\n this.enableDrag();\n }\n };\n\n dragging = (evt: MouseEvent | TouchEvent) => {\n this.isDragging = true;\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n \n // 使用缓存的缩放比例,避免频繁计算\n const scaleX = this.cachedScaleX;\n const scaleY = this.cachedScaleY;\n \n // 获取坐标\n let pageX: number, pageY: number;\n if (evt instanceof TouchEvent) {\n const touch = evt.touches[0];\n if (!touch) return;\n pageX = touch.pageX;\n pageY = touch.pageY;\n } else {\n pageX = evt.pageX;\n pageY = evt.pageY;\n }\n \n // 计算原始偏移量(需要除以缩放比例)\n this.dX = (pageX - (this.axisX || 0)) / scaleX;\n this.dY = (pageY - (this.axisY || 0)) / scaleY;\n \n // 应用方向锁定并计算变换值\n let translateX = this.dX;\n let translateY = this.dY;\n \n if (lockAxis === 'x') {\n translateY = 0; // 锁定Y方向\n } else if (lockAxis === 'y') {\n translateX = 0; // 锁定X方向\n }\n \n // 应用边界条件到允许移动的方向\n const potentialLeft = this.startLeft + translateX;\n const potentialTop = this.startTop + translateY;\n \n // X轴边界条件(在允许X轴移动时应用)\n if (lockAxis !== 'y') {\n if (potentialLeft < minX) {\n translateX = minX - this.startLeft;\n } else if (potentialLeft > maxX) {\n translateX = maxX - this.startLeft;\n }\n }\n \n // Y轴边界条件(在允许Y轴移动时应用)\n if (lockAxis !== 'x') {\n if (potentialTop < minY) {\n translateY = minY - this.startTop;\n } else if (potentialTop > maxY) {\n translateY = maxY - this.startTop;\n }\n }\n \n if (this.draggerRef) {\n this.draggerRef.style.transform = `translate(${translateX}px, ${translateY}px)`;\n }\n };\n\n startTouchDrag = (evt: React.TouchEvent<HTMLDivElement>) => {\n const touch = evt.touches[0];\n if (!touch) return;\n this.axisX = touch.pageX;\n this.axisY = touch.pageY;\n if (!this.props.disabled) {\n this.enableDrag(true);\n }\n };\n\n endDrag = () => {\n if (this.isDragging) {\n this.calcPosition();\n if (this.draggerRef) {\n this.draggerRef.style.transform = '';\n }\n \n // 隐藏拖拽区域\n if (this.props.showDragArea) {\n this.hideDragArea();\n }\n }\n\n if (this.__moveDisposer) {\n this.__moveDisposer();\n this.__moveDisposer = undefined;\n }\n if (this.__clickDisposer) {\n requestAnimationFrame(() => {\n if (this.__clickDisposer) {\n this.__clickDisposer();\n this.__clickDisposer = undefined;\n }\n });\n }\n if (this.__upDisposer) {\n this.__upDisposer();\n this.__upDisposer = undefined;\n }\n if (this.__bodyClassDisposer) {\n this.__bodyClassDisposer();\n this.__bodyClassDisposer = undefined;\n }\n\n this.isDragging = false;\n };\n\n showDragArea = () => {\n if (!this.props.showDragArea || !this.dragAreaRef) return;\n \n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const dragSize = this.dragBoxSize;\n \n // 重置样式\n this.dragAreaRef.style.border = '1px dashed var(--ohkit-color-primary, #1890ff)';\n this.dragAreaRef.style.backgroundColor = 'rgba(173, 216, 230, 0.2)'; // 淡透蓝色\n \n if (lockAxis === 'x') {\n // 锁定Y方向,显示为水平虚线区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = '2px'; // 更细的虚线高度\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${this.startTop + dragSize.height / 2}px`;\n } else if (lockAxis === 'y') {\n // 锁定X方向,显示为垂直虚线区域\n this.dragAreaRef.style.width = '2px'; // 更细的虚线宽度\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${this.startLeft + dragSize.width / 2}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n } else {\n // 自由拖拽,显示完整区域\n this.dragAreaRef.style.width = `${maxX - minX + dragSize.width}px`;\n this.dragAreaRef.style.height = `${maxY - minY + dragSize.height}px`;\n this.dragAreaRef.style.left = `${minX}px`;\n this.dragAreaRef.style.top = `${minY}px`;\n }\n \n this.dragAreaRef.style.display = 'block';\n };\n\n hideDragArea = () => {\n if (this.dragAreaRef) {\n this.dragAreaRef.style.display = 'none';\n }\n };\n calcPosition = () => {\n const { lockAxis } = this.props;\n const { minX, maxX, minY, maxY } = this.dragPositionBoundaries;\n const {height, width} = this.getContainerRect();\n \n // 计算新的位置\n let newTop = this.startTop;\n let newLeft = this.startLeft;\n \n if (lockAxis !== 'y') {\n newLeft += this.dX;\n }\n if (lockAxis !== 'x') {\n newTop += this.dY;\n }\n \n // 应用边界限制\n const realTop = clamp(newTop, minY, maxY);\n const realLeft = clamp(newLeft, minX, maxX);\n const realBottom = height - realTop - this.dragBoxSize.height;\n const realRight = width - realLeft - this.dragBoxSize.width;\n if (realTop !== this.state.top || realLeft !== this.state.left || this.state.bottom !== realBottom || this.state.right !== realRight) {\n // console.log(minY, maxY, this.startTop, this.dY, newTop, realTop, 'minY, maxY, this.startTop, this.dY, newTop, realTop --- calcPosition y');\n // console.log(minX, maxX, this.startLeft, this.dX, newLeft, realLeft, 'minX, maxX, this.startLeft, this.dX, newLeft, realLeft ---calcPosition x');\n this.setState({\n top: realTop,\n left: realLeft,\n bottom: realBottom,\n right: realRight\n });\n }\n this.startTop = realTop;\n this.startLeft = realLeft;\n this.dX = this.dY = 0;\n };\n\n\n componentDidMount() {\n // 检查初始位置是否在边界范围内,如果不在则修正\n this.reportStartPosition();\n this.calcPosition();\n \n this.__resizeDisposer = addEventListener(window, 'resize', () => {\n this.calcPosition();\n });\n\n // 触屏设备时,阻止拖拽时滚动页面\n if (supportsTouchEvents() && this.draggerRef) {\n this.__preventScrollDisposer = addEventListener(this.draggerRef, 'touchmove', (evt) => {\n evt.preventDefault();\n });\n }\n }\n\n componentWillUnmount() {\n this.__resizeDisposer?.();\n this.__bodyClassDisposer?.();\n this.__moveDisposer?.();\n this.__clickDisposer?.();\n this.__upDisposer?.();\n this.__preventScrollDisposer?.();\n }\n\n render() {\n const { className, zIndex, children, showDragArea, positionMode = 'fixed' } = this.props;\n const { startDrag, startTouchDrag, endDrag } = this;\n const stl = {\n zIndex,\n ...this.position,\n position: positionMode\n };\n return (\n <>\n {showDragArea && (\n <div\n className={c('drag-area')}\n ref={(r) => {\n this.dragAreaRef = r;\n }}\n style={{\n display: 'none',\n position: positionMode,\n backgroundColor: 'rgba(173, 216, 230, 0.2)', // 淡透蓝色\n border: '1px dashed var(--ohkit-color-primary, #1890ff)',\n pointerEvents: 'none',\n zIndex: (zIndex || 9999) - 1,\n boxSizing: 'border-box',\n borderRadius: this.props.lockAxis !== 'none' ? '2px' : '0',\n }}\n />\n )}\n <div\n className={cx(c('container'), className)}\n style={stl}\n ref={(r) => {\n this.draggerRef = r;\n }}\n onMouseDownCapture={startDrag}\n onMouseUpCapture={endDrag}\n onTouchStartCapture={startTouchDrag}\n onTouchEndCapture={endDrag}\n >\n {children}\n </div>\n </>\n );\n }\n}\n\nexport default DraggableBox;"],"names":["isPositioningContextCreator","element","includePosition","style","window","getComputedStyle","position","getPropertyValue","transform","filter","perspective","contain","willChange","includes","clamp","value","min","max","Math","ValidPlacement","c","p","prefixClassname","DraggableBox","_React$Component","props","_this","call","this","prePositionMode","preDraggerRef","container","draggerRef","isDragging","axisX","axisY","dX","dY","startTop","startLeft","cachedScaleX","cachedScaleY","__moveDisposer","__clickDisposer","__bodyClassDisposer","__upDisposer","__resizeDisposer","__preventScrollDisposer","dragAreaRef","enableDrag","isTouch","reportStartPosition","addEventListener","document","evt","stopPropagation","preventDefault","sqrt","pow","showDragAreaOverMoveDistanse","addClass","body","undefined","showDragArea","dragging","passive","endDrag","startDrag","nativeEvent","button","pageX","pageY","disabled","lockAxis","_this$dragPositionBou","dragPositionBoundaries","minX","maxX","minY","maxY","scaleY","TouchEvent","touch","touches","translateX","translateY","potentialLeft","potentialTop","startTouchDrag","calcPosition","hideDragArea","requestAnimationFrame","_this$dragPositionBou2","dragSize","dragBoxSize","border","backgroundColor","width","height","left","top","display","_this$dragPositionBou3","_this$getContainerRec","getContainerRect","newTop","newLeft","realTop","realLeft","realBottom","realRight","state","bottom","right","setState","_props$placement","placement","_props$offsetY","offsetY","_props$offsetX","offsetX","_placement$split","split","placementY","placementX","_proto","prototype","getContainer","useCache","dom","_this$props$positionM","positionMode","findParent","parent","excludeOwn","documentElement","findAbsolutePositionParent","innerWidth","innerHeight","scrollLeft","scrollTop","scrollerScrollLeft","scrollerScrollTop","borderLeftWidth","borderTopWidth","containerRect","getBoundingClientRect","containerStyle","parseFloat","borderRightWidth","borderBottomWidth","offsetWidth","clientWidth","offsetHeight","clientHeight","_getScaleRatio","scaleX","rect","magnification","round","getScaleRatio","_this$draggerRef$getB","componentDidMount","_this2","navigator","maxTouchPoints","componentWillUnmount","_this$__resizeDispose","_this$__bodyClassDisp","_this$__moveDisposer","_this$__clickDisposer","_this$__upDisposer","_this$__preventScroll","render","_this3","_this$props","className","zIndex","children","_this$props$positionM2","stl","_extends","React","createElement","Fragment","ref","r","pointerEvents","boxSizing","borderRadius","cx","onMouseDownCapture","onMouseUpCapture","onTouchStartCapture","onTouchEndCapture","key","get","_this$props2","boundsX","boundsY","_this$props2$placemen","_this$getContainerRec2","containerWidth","containerHeight","_placement$split2","defaultBounds","minBound","maxBound","_this$curPositionKey","curPositionKey","y","x","positionStyles","Component","defaultProps"],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -6,9 +6,9 @@ export declare const c: (...arg: cx.ArgumentArray) => string;
|
|
|
6
6
|
export declare class DraggableBox extends React.Component<DraggableBoxProps, DraggableBoxState> {
|
|
7
7
|
static defaultProps: Partial<DraggableBoxProps>;
|
|
8
8
|
constructor(props: DraggableBoxProps);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
private prePositionMode;
|
|
10
|
+
private preDraggerRef;
|
|
11
|
+
private container;
|
|
12
12
|
/**
|
|
13
13
|
* 获取定位容器
|
|
14
14
|
* 根据 positionMode 返回对应的定位父元素
|
|
@@ -18,10 +18,6 @@ export declare class DraggableBox extends React.Component<DraggableBoxProps, Dra
|
|
|
18
18
|
* 获取容器的尺寸和位置信息
|
|
19
19
|
*/
|
|
20
20
|
private getContainerRect;
|
|
21
|
-
get windowSize(): {
|
|
22
|
-
height: number;
|
|
23
|
-
width: number;
|
|
24
|
-
};
|
|
25
21
|
get dragBoxSize(): {
|
|
26
22
|
height: number;
|
|
27
23
|
width: number;
|
|
@@ -32,10 +28,6 @@ export declare class DraggableBox extends React.Component<DraggableBoxProps, Dra
|
|
|
32
28
|
minY: number;
|
|
33
29
|
maxY: number;
|
|
34
30
|
};
|
|
35
|
-
get dragPositionRang(): {
|
|
36
|
-
width: number;
|
|
37
|
-
height: number;
|
|
38
|
-
};
|
|
39
31
|
get curPositionKey(): ["top" | "bottom", "left" | "right"];
|
|
40
32
|
get position(): Record<string, string>;
|
|
41
33
|
draggerRef: HTMLDivElement | null;
|
|
@@ -53,11 +45,13 @@ export declare class DraggableBox extends React.Component<DraggableBoxProps, Dra
|
|
|
53
45
|
__bodyClassDisposer?: () => void;
|
|
54
46
|
__upDisposer?: () => void;
|
|
55
47
|
__resizeDisposer?: () => void;
|
|
48
|
+
__preventScrollDisposer?: () => void;
|
|
56
49
|
dragAreaRef: HTMLDivElement | null;
|
|
57
50
|
reportStartPosition(): void;
|
|
58
|
-
enableDrag: () => void;
|
|
51
|
+
enableDrag: (isTouch?: boolean) => void;
|
|
59
52
|
startDrag: (evt: React.MouseEvent<HTMLDivElement>) => void;
|
|
60
|
-
dragging: (evt: MouseEvent) => void;
|
|
53
|
+
dragging: (evt: MouseEvent | TouchEvent) => void;
|
|
54
|
+
startTouchDrag: (evt: React.TouchEvent<HTMLDivElement>) => void;
|
|
61
55
|
endDrag: () => void;
|
|
62
56
|
showDragArea: () => void;
|
|
63
57
|
hideDragArea: () => void;
|
package/dist/types/type.d.ts
CHANGED
|
@@ -51,6 +51,11 @@ export interface DraggableBoxProps {
|
|
|
51
51
|
* @default false
|
|
52
52
|
*/
|
|
53
53
|
showDragArea?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* 拖拽过程中,超出多少px时才显示拖拽区域可视化
|
|
56
|
+
* @default 5
|
|
57
|
+
*/
|
|
58
|
+
showDragAreaOverMoveDistanse?: number;
|
|
54
59
|
/**
|
|
55
60
|
* 定位模式
|
|
56
61
|
* 'fixed' - 使用 fixed 定位(默认),动态查找影响 fixed 定位的父元素
|