/// import * as React from 'react'; import classNames from 'classnames'; import Hammer from 'react-hammerjs'; import { getTranslateText } from '../util/animation'; const element = {}; const prefix = 'tsp-component-Popup'; class Popup extends React.Component { constructor(props: TspComponentPopupProps, state: any) { super(props, state); this.onClose = this.onClose.bind(this); } public static defaultProps: TspComponentPopupProps = { id: '', direction: 'top' }; private elem: HTMLElement; public componentDidMount(): void { this.elem = this.refs['popup'] as HTMLElement; element[this.props.id] = this.elem; this.elem.dataset.direction = this.props.direction; this.elem.style.cssText = getTranslateZWithDirection(this.elem, 'close'); } public componentWillUnmount(): void { document.body.style.cssText = `height:auto;overflow: visible;`; } public onClose(e: any): void { popupClose(this.props.id); if (this.props.onClose) { this.props.onClose(e); } } public render(): JSX.Element { return (
{this.props.children}
); } } /** * 打开 */ function popupOpen(id: string): void { const elem = element[id]; const translate = getTranslateZWithDirection(elem, 'open'); const scrollElem = document.querySelector('.tsp-component-Scroll'); if (scrollElem) { scrollElem['style'].webkitTransform = 'none'; } elem.classList.add(`${prefix}-transition`); elem.style.cssText = `top: 0;left: 0;visibility: visible;${translate}`; document.body.style.cssText = `height: ${document.documentElement.clientHeight}px;overflow: hidden;`; } function popupClose(id: string): void { const elem = element[id]; if (!elem) { return; } const translate = getTranslateZWithDirection(elem, 'close'); const scrollElem = document.querySelector('.tsp-component-Scroll'); if (scrollElem) { scrollElem['style'].webkitTransform = 'translateZ(0)'; } elem.style.cssText = `top: 0;left: 0;visibility: visible;${translate}`; setTimeout(() => { elem.classList.remove(`${prefix}-transition`); elem.style.cssText = `top: -9999px;left: -9999px;visibility: hidden;${translate}`; document.body.style.cssText = `height:auto;overflow: visible;`; }, 280); } /** * 根据elemnt的dataset.direction设置translateZ */ function getTranslateZWithDirection(elem: HTMLElement, status: 'open' | 'close'): string { let translate = getTranslateText('-100%', '-100%'); if (elem) { const direction = elem.dataset.direction; switch (direction) { case 'top': translate = getTranslateText(0, status === 'open' ? 0 : '100%'); break; case 'right': translate = getTranslateText(status === 'open' ? 0 : '100%', 0); break; case 'bottom': translate = getTranslateText(0, status === 'open' ? 0 : '-100%'); break; case 'left': translate = getTranslateText(status === 'open' ? 0 : '-100%', 0); break; default: break; } } return translate; } export { Popup, popupOpen, popupClose } ;