diff --git a/assets/bootstrap.less b/assets/bootstrap.less index 5a3f66e4..a11f4875 100644 --- a/assets/bootstrap.less +++ b/assets/bootstrap.less @@ -1,2 +1,3 @@ +@import "./bootstrap/body.less"; @import "./bootstrap/Dialog.less"; -@import "./bootstrap/Mask.less"; \ No newline at end of file +@import "./bootstrap/Mask.less"; diff --git a/assets/bootstrap/Mask.less b/assets/bootstrap/Mask.less index 42575623..43623805 100644 --- a/assets/bootstrap/Mask.less +++ b/assets/bootstrap/Mask.less @@ -9,4 +9,5 @@ opacity: .5; z-index: 1000; filter: alpha(opacity=50); -} \ No newline at end of file + overflow: auto; +} diff --git a/assets/bootstrap/body.less b/assets/bootstrap/body.less new file mode 100644 index 00000000..68d03515 --- /dev/null +++ b/assets/bootstrap/body.less @@ -0,0 +1,3 @@ +.rc-dialog-scrolling { + overflow: hidden; +} diff --git a/assets/index.less b/assets/index.less index b4df613d..3209c973 100644 --- a/assets/index.less +++ b/assets/index.less @@ -1,4 +1,5 @@ @prefixCls: rc-dialog; +@import "./index/body.less"; @import "./index/Dialog.less"; -@import "./index/Mask.less"; \ No newline at end of file +@import "./index/Mask.less"; diff --git a/assets/index/Mask.less b/assets/index/Mask.less index 1ca6e065..9e7b5956 100644 --- a/assets/index/Mask.less +++ b/assets/index/Mask.less @@ -10,6 +10,7 @@ height: 100%; z-index: 1000; filter: alpha(opacity=50); + overflow: auto; &-hidden { display: none; diff --git a/assets/index/body.less b/assets/index/body.less new file mode 100644 index 00000000..1f43ca43 --- /dev/null +++ b/assets/index/body.less @@ -0,0 +1,5 @@ +.@{prefixCls} { + &-scrolling { + overflow: hidden; + } +} diff --git a/src/DOMWrap.jsx b/src/DOMWrap.jsx index b1f2b3ad..c71cfb05 100644 --- a/src/DOMWrap.jsx +++ b/src/DOMWrap.jsx @@ -18,7 +18,7 @@ const DOMWrap = React.createClass({ props.className += ' ' + props.hiddenClassName; } const Tag = props.tag; - return ; + return {props.children}; }, }); diff --git a/src/Dialog.jsx b/src/Dialog.jsx index 83cf46be..a18762c2 100644 --- a/src/Dialog.jsx +++ b/src/Dialog.jsx @@ -70,6 +70,7 @@ const Dialog = React.createClass({ // first show if (!prevProps.visible) { this.lastOutSideFocusNode = document.activeElement; + this.addScrollingClass(); ReactDOM.findDOMNode(this.refs.dialog).focus(); } } else if (prevProps.visible) { @@ -80,6 +81,7 @@ const Dialog = React.createClass({ this.lastOutSideFocusNode = null; } this.lastOutSideFocusNode = null; + this.removeScrollingClass(); } } }, @@ -89,10 +91,12 @@ const Dialog = React.createClass({ }, onMaskClick(e) { - if (this.props.closable && this.props.maskClosable) { - this.close(e); + if (e.target === e.currentTarget) { + if (this.props.closable && this.props.maskClosable) { + this.close(e); + } + ReactDOM.findDOMNode(this.refs.dialog).focus(); } - ReactDOM.findDOMNode(this.refs.dialog).focus(); }, onKeyDown(e) { @@ -207,7 +211,7 @@ const Dialog = React.createClass({ ); }, - getMaskElement() { + getMaskElement(dialog) { const props = this.props; const maskProps = { onClick: this.onMaskClick, @@ -221,8 +225,10 @@ const Dialog = React.createClass({ const maskTransition = this.getMaskTransitionName(); maskElement = (); + visible={props.visible} + hiddenClassName={`${props.prefixCls}-mask-hidden`}> + {dialog} + ); if (maskTransition) { maskElement = ( - {[this.getMaskElement(), this.getDialogElement()]} + {this.getMaskElement(this.getDialogElement())} ); }, });