wip reset animate
This commit is contained in:
		| @@ -129,6 +129,12 @@ function Blocks(props: PropsWithChildren<BlockProps>) { | ||||
| 		return select; | ||||
| 	}, [props.data.animate]); | ||||
|  | ||||
| 	const animationPlayState: CSSProperties = useMemo(() => { | ||||
| 		return { | ||||
| 			animationPlayState: props.data.animatePlayState || '', | ||||
| 		}; | ||||
| 	}, [props.data.animatePlayState]); | ||||
|  | ||||
| 	const render = useMemo(() => { | ||||
| 		// 如果是编辑模式下,则需要包裹不能选中层,位移层,缩放控制层,平面移动层。 | ||||
| 		if (state && props.context === 'edit') { | ||||
| @@ -164,7 +170,7 @@ function Blocks(props: PropsWithChildren<BlockProps>) { | ||||
| 				> | ||||
| 					{/* 绝对定位元素 */} | ||||
| 					{props.data.position !== 'static' && ( | ||||
| 						<div style={{ ...style, ...animateProps }}>{state}</div> | ||||
| 						<div style={{ ...style, ...animateProps, ...animationPlayState }}>{state}</div> | ||||
| 					)} | ||||
| 					{/* 静态定位 非行内 这里暂不考虑布局影响 */} | ||||
| 					{props.data.position === 'static' && props.data.display !== 'inline' && ( | ||||
| @@ -174,6 +180,7 @@ function Blocks(props: PropsWithChildren<BlockProps>) { | ||||
| 								width: '100%', | ||||
| 								height: '100%', | ||||
| 								...animateProps, | ||||
| 								...animationPlayState, | ||||
| 							}} | ||||
| 						> | ||||
| 							{state} | ||||
| @@ -181,7 +188,9 @@ function Blocks(props: PropsWithChildren<BlockProps>) { | ||||
| 					)} | ||||
| 					{/* 静态定位 行内 这里暂不考虑布局影响 */} | ||||
| 					{props.data.position === 'static' && props.data.display === 'inline' && ( | ||||
| 						<span style={{ pointerEvents: 'none', ...animateProps }}>{state}</span> | ||||
| 						<span style={{ pointerEvents: 'none', ...animateProps, ...animationPlayState }}> | ||||
| 							{state} | ||||
| 						</span> | ||||
| 					)} | ||||
| 					<BlockResizer data={props.data} config={props.config} rect={ref}></BlockResizer> | ||||
| 					<RotateResizer data={props.data} config={props.config} rect={ref}></RotateResizer> | ||||
| @@ -201,6 +210,7 @@ function Blocks(props: PropsWithChildren<BlockProps>) { | ||||
| 						display: props.data.display, | ||||
| 						transform: `rotate(${props.data.rotate.value}deg)`, | ||||
| 						...animateProps, | ||||
| 						...animationPlayState, | ||||
| 					}} | ||||
| 				> | ||||
| 					{state} | ||||
| @@ -215,6 +225,7 @@ function Blocks(props: PropsWithChildren<BlockProps>) { | ||||
| 		props.config, | ||||
| 		innerDragData, | ||||
| 		animateProps, | ||||
| 		animationPlayState, | ||||
| 		previewState.top, | ||||
| 		previewState.left, | ||||
| 		previewState.width, | ||||
|   | ||||
| @@ -33,13 +33,13 @@ export interface PreviewProps { | ||||
| 	 * @memberof PreviewProps | ||||
| 	 */ | ||||
| 	completeFn?: Function; | ||||
|   /** | ||||
| 	/** | ||||
| 	 * | ||||
| 	 * 预览样式 | ||||
| 	 * @type {CSSProperties} | ||||
| 	 * @memberof PreviewProps | ||||
| 	 */ | ||||
|    previewContainerStyle?: CSSProperties; | ||||
| 	previewContainerStyle?: CSSProperties; | ||||
| } | ||||
|  | ||||
| function Preview(props: PreviewProps): ReactElement { | ||||
| @@ -128,7 +128,7 @@ function Preview(props: PreviewProps): ReactElement { | ||||
| 					config={props.config} | ||||
| 					context="preview" | ||||
| 					state={props.config.getStore().getData()} | ||||
|           previewContainerStyle={props.previewContainerStyle} | ||||
| 					previewContainerStyle={props.previewContainerStyle} | ||||
| 				></Container> | ||||
| 			</> | ||||
| 		); | ||||
|   | ||||
| @@ -115,7 +115,7 @@ function RightConfig(props: PropsWithChildren<RightConfigProps>) { | ||||
| 	const originData = props.config.getStoreChanger().getOrigin()?.now; | ||||
| 	return ( | ||||
| 		<div | ||||
| 			className="ant-menu" | ||||
| 			className="ant-menu right-pannel-wrap" | ||||
| 			style={{ | ||||
| 				height: '100%', | ||||
| 				width: '400px', | ||||
| @@ -136,10 +136,12 @@ function RightConfig(props: PropsWithChildren<RightConfigProps>) { | ||||
| 						return ( | ||||
| 							<Tabs.TabPane tab={v.icon} key={i + ''}> | ||||
| 								<div | ||||
| 									className="scrollbar" | ||||
| 									className="scrollbar right-pannel-tabdiv" | ||||
| 									style={{ | ||||
| 										height: 'calc(100vh - 110px)', | ||||
| 										overflow: 'auto', | ||||
| 										position: 'fixed', | ||||
| 										width: 380, | ||||
| 									}} | ||||
| 								> | ||||
| 									{v.custom && v.customRender && v.customRender(v.type, current)} | ||||
| @@ -151,7 +153,7 @@ function RightConfig(props: PropsWithChildren<RightConfigProps>) { | ||||
| 				</Tabs> | ||||
| 			)} | ||||
| 			{!current && !isEdit && !customGlobal && ( | ||||
| 				<div style={{ padding: '20px' }}> | ||||
| 				<div style={{ padding: '10px' }}> | ||||
| 					<Row style={{ padding: '10px 0 20px 0', fontWeight: 'bold', userSelect: 'none' }}> | ||||
| 						{replaceLocale('right.global', '全局设置', props.config)} | ||||
| 					</Row> | ||||
| @@ -259,8 +261,8 @@ function RightConfig(props: PropsWithChildren<RightConfigProps>) { | ||||
| 			)} | ||||
| 			{!current && !isEdit && customGlobal && customGlobal(props.config)} | ||||
| 			{!current && isEdit && ( | ||||
| 				<div style={{ padding: '20px' }} className="yh-tcsz"> | ||||
| 					<Row style={{ padding: '10 0 20px 0', fontWeight: 'bold' }}> | ||||
| 				<div style={{ padding: '10px' }} className="yh-tcsz"> | ||||
| 					<Row style={{ padding: '10px 0 20px 0', fontWeight: 'bold' }}> | ||||
| 						{replaceLocale('modal.control', '弹窗配置', props.config)} | ||||
| 					</Row> | ||||
| 					<Row style={{ padding: '10px 0' }}> | ||||
|   | ||||
| @@ -39,6 +39,11 @@ export interface TimeLineConfigType { | ||||
| 	autoFocus: boolean; | ||||
| 	scrollDom: null | HTMLDivElement; | ||||
| } | ||||
| export interface TimeLineNeedleConfigType { | ||||
| 	status: 'stop' | 'start'; | ||||
| 	runFunc: Function; | ||||
| 	resetFunc: Function; | ||||
| } | ||||
|  | ||||
| const animateTicker = new Array(iter).fill(1).map((_, y) => y); | ||||
|  | ||||
| @@ -159,6 +164,9 @@ const SortableList = SortableContainer( | ||||
|  | ||||
| let cacheBlock: IBlockType[] = []; | ||||
|  | ||||
| const needleWidth = 2; | ||||
| const initialLeft = 20 - needleWidth / 2; | ||||
| let timer: number | null = null; | ||||
| export function TimeLine(props: TimeLineProps) { | ||||
| 	const store = props.config.getStore(); | ||||
| 	const data = store.getData().block; | ||||
| @@ -214,6 +222,33 @@ export function TimeLine(props: TimeLineProps) { | ||||
| 		} | ||||
| 	}, [props.config]); | ||||
|  | ||||
| 	const [needle, setNeedle] = useState(initialLeft); | ||||
|  | ||||
| 	const needleStart = () => { | ||||
| 		setNeedle(initialLeft); | ||||
| 		//每过0.1秒移动2 | ||||
| 		if (timer) { | ||||
| 			window.clearInterval(timer); | ||||
| 		} | ||||
| 		props.config.timelineNeedleConfig.status = 'start'; | ||||
| 		timer = window.setInterval(() => { | ||||
| 			if (needle < ruleWidth) { | ||||
| 				setNeedle((pre) => pre + 2); | ||||
| 			} | ||||
| 		}, 100); | ||||
| 	}; | ||||
|  | ||||
| 	const needleReset = () => { | ||||
| 		if (timer) { | ||||
| 			window.clearInterval(timer); | ||||
| 		} | ||||
| 		setNeedle(initialLeft); | ||||
| 		props.config.timelineNeedleConfig.status = 'stop'; | ||||
| 	}; | ||||
|  | ||||
| 	props.config.timelineNeedleConfig.resetFunc = needleReset; | ||||
| 	props.config.timelineNeedleConfig.runFunc = needleStart; | ||||
|  | ||||
| 	return ( | ||||
| 		<div | ||||
| 			className={`${props.classes} ant-menu yh-timeline-wrap`} | ||||
| @@ -276,6 +311,7 @@ export function TimeLine(props: TimeLineProps) { | ||||
| 											WAIT = false; | ||||
| 											props.config.waitAnimate = false; | ||||
| 											store.setData(cloneData); | ||||
| 											needleStart(); | ||||
| 										}); | ||||
| 									} | ||||
| 								}} | ||||
| @@ -291,8 +327,22 @@ export function TimeLine(props: TimeLineProps) { | ||||
| 							width: `calc(100% -  ${leftWidth}px)`, | ||||
| 							borderBottom: '1px solid #dadada', | ||||
| 							overflow: 'hidden', | ||||
| 							position: 'relative', | ||||
| 						}} | ||||
| 					> | ||||
| 						<div | ||||
| 							style={{ | ||||
| 								position: 'absolute', | ||||
| 								transform: `translate(-${scrollx}px, 0px)`, | ||||
| 								width: needleWidth, | ||||
| 								height: '100%', | ||||
| 								backgroundColor: 'red', | ||||
| 								zIndex: 2, | ||||
| 								left: needle, | ||||
| 								transition: 'left linear', | ||||
| 								willChange: 'left', | ||||
| 							}} | ||||
| 						></div> | ||||
| 						<div | ||||
| 							style={{ | ||||
| 								display: 'flex', | ||||
|   | ||||
| @@ -124,7 +124,7 @@ const commonCss: CSSProperties = { | ||||
| 	height: square * 2, | ||||
| 	width: square * 2, | ||||
| 	position: 'absolute', | ||||
| 	background: '#000000', | ||||
| 	background: 'rgba(0, 0, 0, 0.85)', | ||||
| 	top: (itemHeight - diff) / 2 - square, | ||||
| 	cursor: 'e-resize', | ||||
| }; | ||||
|   | ||||
| @@ -33,7 +33,7 @@ import Store from '../core/store'; | ||||
| import { VerticalAlignMiddleOutlined } from '@ant-design/icons'; | ||||
| import { wrapperMoveState } from '../components/wrapperMove/event'; | ||||
| import { wrapperMoveState as iframeWrapperMoveState } from '../components/IframeWrapperMove/event'; | ||||
| import { TimeLineConfigType } from '../components/timeLine/timeline'; | ||||
| import { TimeLineConfigType, TimeLineNeedleConfigType } from '../components/timeLine/timeline'; | ||||
| // 组件部分 | ||||
|  | ||||
| /** | ||||
| @@ -353,6 +353,11 @@ export class UserConfig { | ||||
| 		autoFocus: true, | ||||
| 		scrollDom: null, | ||||
| 	}; | ||||
| 	public timelineNeedleConfig: TimeLineNeedleConfigType = { | ||||
| 		status: 'stop', | ||||
| 		runFunc: () => {}, | ||||
| 		resetFunc: () => {}, | ||||
| 	}; | ||||
| 	public waitAnimate = false; | ||||
| 	public wrapperMoveState = wrapperMoveState; | ||||
| 	public iframeWrapperMoveState = iframeWrapperMoveState; | ||||
|   | ||||
| @@ -43,5 +43,6 @@ export function createBlock( | ||||
| 			value: 0, | ||||
| 			canRotate: true, | ||||
| 		}, | ||||
| 		animatePlayState: ComponentItem.initData.animatePlayState || '', | ||||
| 	}; | ||||
| } | ||||
|   | ||||
| @@ -51,5 +51,6 @@ export interface IBlockType { | ||||
| 		canRotate: boolean; | ||||
| 	}; | ||||
| 	animate: AnimateItem[]; | ||||
| 	animatePlayState: string; | ||||
| 	fixed: boolean; // 用于制作fixed组件 | ||||
| } | ||||
|   | ||||
| @@ -46,6 +46,7 @@ function createDefaultModalBlock(): IStoreData['block'] { | ||||
| 				value: 0, | ||||
| 				canRotate: false, | ||||
| 			}, | ||||
| 			animatePlayState: '', | ||||
| 		}, | ||||
| 	]; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 hufeixiong
					hufeixiong