Commit 1c7289e9dd4d2d8b23aad3abfada2206d2dbe963
1 parent
d42d4def
Modal add mask & dragable prop
Showing
3 changed files
with
40 additions
and
63 deletions
Show diff stats
examples/routers/modal.vue
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | <Button type="primary" @click="modal1 = true">Display dialog box</Button> | 3 | <Button type="primary" @click="modal1 = true">Display dialog box</Button> |
| 4 | + <Button @click="hc">Click Me</Button> | ||
| 4 | <Modal | 5 | <Modal |
| 5 | v-model="modal1" | 6 | v-model="modal1" |
| 6 | - :fullscreen="true" | ||
| 7 | - footerHide | 7 | + title="Common Modal dialog box title" |
| 8 | + :mask="false" | ||
| 8 | @on-ok="ok" | 9 | @on-ok="ok" |
| 9 | @on-cancel="cancel"> | 10 | @on-cancel="cancel"> |
| 10 | - <p>Content of dialog1111</p> | ||
| 11 | <p>Content of dialog</p> | 11 | <p>Content of dialog</p> |
| 12 | <p>Content of dialog</p> | 12 | <p>Content of dialog</p> |
| 13 | <p>Content of dialog</p> | 13 | <p>Content of dialog</p> |
| 14 | - <p>Content of dialog</p> | ||
| 15 | - <p>Content of dialog</p> | ||
| 16 | - <p>Content of dialog</p> | ||
| 17 | - <p>Content of dialog</p> | ||
| 18 | - <p>Content of dialog</p> | ||
| 19 | - <p>Content of dialog</p> | ||
| 20 | - <p>Content of dialog</p> | ||
| 21 | - <p>Content of dialog</p> | ||
| 22 | - <p>Content of dialog</p> | ||
| 23 | - <p>Content of dialog</p> | ||
| 24 | - <p>Content of dialog</p> | ||
| 25 | - <p>Content of dialog</p> | ||
| 26 | - | ||
| 27 | - <!--<p>Content of dialog</p>--> | ||
| 28 | - <!--<p>Content of dialog</p>--> | ||
| 29 | - <!--<p>Content of dialog</p>--> | ||
| 30 | - <!--<p>Content of dialog</p>--> | ||
| 31 | - <!--<p>Content of dialog</p>--> | ||
| 32 | - <!--<p>Content of dialog</p>--> | ||
| 33 | - <!--<p>Content of dialog</p>--> | ||
| 34 | - <!--<p>Content of dialog</p>--> | ||
| 35 | - <!--<p>Content of dialog</p>--> | ||
| 36 | - <!--<p>Content of dialog</p>--> | ||
| 37 | - <!--<p>Content of dialog</p>--> | ||
| 38 | - <!--<p>Content of dialog</p>--> | ||
| 39 | - <!--<p>Content of dialog</p>--> | ||
| 40 | - <!--<p>Content of dialog</p>--> | ||
| 41 | - <!--<p>Content of dialog</p>--> | ||
| 42 | - <!--<p>Content of dialog</p>--> | ||
| 43 | - <!--<p>Content of dialog</p>--> | ||
| 44 | - <!--<p>Content of dialog</p>--> | ||
| 45 | - <!--<p>Content of dialog</p>--> | ||
| 46 | - <!--<p>Content of dialog</p>--> | ||
| 47 | - <!--<p>Content of dialog</p>--> | ||
| 48 | - <!--<p>Content of dialog</p>--> | ||
| 49 | - <!--<p>Content of dialog</p>--> | ||
| 50 | - <!--<p>Content of dialog</p>--> | ||
| 51 | - <!--<p>Content of dialog</p>--> | ||
| 52 | - <!--<p>Content of dialog</p>--> | ||
| 53 | - <!--<p>Content of dialog</p>--> | ||
| 54 | - <!--<p>Content of dialog</p>--> | ||
| 55 | - <!--<p>Content of dialog</p>--> | ||
| 56 | - <!--<p>Content of dialog</p>--> | ||
| 57 | - <!--<p>Content of dialog</p>--> | ||
| 58 | - <!--<p>Content of dialog</p>--> | ||
| 59 | - <!--<p>Content of dialog</p>--> | ||
| 60 | - <!--<p>Content of dialog</p>--> | ||
| 61 | - <!--<p>Content of dialog</p>--> | ||
| 62 | - <!--<p>Content of dialog</p>--> | ||
| 63 | - <!--<p>Content of dialog</p>--> | ||
| 64 | - <!--<p>Content of dialog</p>--> | ||
| 65 | - <!--<p>Content of dialog</p>--> | ||
| 66 | - <!--<p>Content of dialog2222</p>--> | ||
| 67 | </Modal> | 14 | </Modal> |
| 68 | </div> | 15 | </div> |
| 69 | </template> | 16 | </template> |
| @@ -80,6 +27,9 @@ | @@ -80,6 +27,9 @@ | ||
| 80 | }, | 27 | }, |
| 81 | cancel () { | 28 | cancel () { |
| 82 | this.$Message.info('Clicked cancel'); | 29 | this.$Message.info('Clicked cancel'); |
| 30 | + }, | ||
| 31 | + hc () { | ||
| 32 | + this.$Message.info('Hello'); | ||
| 83 | } | 33 | } |
| 84 | } | 34 | } |
| 85 | } | 35 | } |
src/components/modal/modal.vue
| 1 | <template> | 1 | <template> |
| 2 | <div v-transfer-dom :data-transfer="transfer"> | 2 | <div v-transfer-dom :data-transfer="transfer"> |
| 3 | <transition :name="transitionNames[1]"> | 3 | <transition :name="transitionNames[1]"> |
| 4 | - <div :class="maskClasses" v-show="visible" @click="mask"></div> | 4 | + <div :class="maskClasses" v-show="visible" v-if="showMask" @click="handleMask"></div> |
| 5 | </transition> | 5 | </transition> |
| 6 | <div :class="wrapClasses" @click="handleWrapClick"> | 6 | <div :class="wrapClasses" @click="handleWrapClick"> |
| 7 | <transition :name="transitionNames[0]" @after-leave="animationFinish"> | 7 | <transition :name="transitionNames[0]" @after-leave="animationFinish"> |
| 8 | <div :class="classes" :style="mainStyles" v-show="visible"> | 8 | <div :class="classes" :style="mainStyles" v-show="visible"> |
| 9 | - <div :class="[prefixCls + '-content']"> | 9 | + <div :class="contentClasses"> |
| 10 | <a :class="[prefixCls + '-close']" v-if="closable" @click="close"> | 10 | <a :class="[prefixCls + '-close']" v-if="closable" @click="close"> |
| 11 | <slot name="close"> | 11 | <slot name="close"> |
| 12 | <Icon type="ios-close"></Icon> | 12 | <Icon type="ios-close"></Icon> |
| @@ -99,6 +99,14 @@ | @@ -99,6 +99,14 @@ | ||
| 99 | fullscreen: { | 99 | fullscreen: { |
| 100 | type: Boolean, | 100 | type: Boolean, |
| 101 | default: false | 101 | default: false |
| 102 | + }, | ||
| 103 | + mask: { | ||
| 104 | + type: Boolean, | ||
| 105 | + default: true | ||
| 106 | + }, | ||
| 107 | + dragable: { | ||
| 108 | + type: Boolean, | ||
| 109 | + default: false | ||
| 102 | } | 110 | } |
| 103 | }, | 111 | }, |
| 104 | data () { | 112 | data () { |
| @@ -116,7 +124,8 @@ | @@ -116,7 +124,8 @@ | ||
| 116 | `${prefixCls}-wrap`, | 124 | `${prefixCls}-wrap`, |
| 117 | { | 125 | { |
| 118 | [`${prefixCls}-hidden`]: !this.wrapShow, | 126 | [`${prefixCls}-hidden`]: !this.wrapShow, |
| 119 | - [`${this.className}`]: !!this.className | 127 | + [`${this.className}`]: !!this.className, |
| 128 | + [`${prefixCls}-no-mask`]: !this.showMask | ||
| 120 | } | 129 | } |
| 121 | ]; | 130 | ]; |
| 122 | }, | 131 | }, |
| @@ -130,7 +139,14 @@ | @@ -130,7 +139,14 @@ | ||
| 130 | [`${prefixCls}-fullscreen`]: this.fullscreen, | 139 | [`${prefixCls}-fullscreen`]: this.fullscreen, |
| 131 | [`${prefixCls}-fullscreen-no-header`]: this.fullscreen && !this.showHead, | 140 | [`${prefixCls}-fullscreen-no-header`]: this.fullscreen && !this.showHead, |
| 132 | [`${prefixCls}-fullscreen-no-footer`]: this.fullscreen && this.footerHide | 141 | [`${prefixCls}-fullscreen-no-footer`]: this.fullscreen && this.footerHide |
| 133 | - | 142 | + } |
| 143 | + ]; | ||
| 144 | + }, | ||
| 145 | + contentClasses () { | ||
| 146 | + return [ | ||
| 147 | + `${prefixCls}-content`, | ||
| 148 | + { | ||
| 149 | + [`${prefixCls}-content-no-mask`]: !this.showMask | ||
| 134 | } | 150 | } |
| 135 | ]; | 151 | ]; |
| 136 | }, | 152 | }, |
| @@ -161,6 +177,9 @@ | @@ -161,6 +177,9 @@ | ||
| 161 | } else { | 177 | } else { |
| 162 | return this.cancelText; | 178 | return this.cancelText; |
| 163 | } | 179 | } |
| 180 | + }, | ||
| 181 | + showMask () { | ||
| 182 | + return this.dragable ? false : this.mask; | ||
| 164 | } | 183 | } |
| 165 | }, | 184 | }, |
| 166 | methods: { | 185 | methods: { |
| @@ -169,15 +188,15 @@ | @@ -169,15 +188,15 @@ | ||
| 169 | this.$emit('input', false); | 188 | this.$emit('input', false); |
| 170 | this.$emit('on-cancel'); | 189 | this.$emit('on-cancel'); |
| 171 | }, | 190 | }, |
| 172 | - mask () { | ||
| 173 | - if (this.maskClosable) { | 191 | + handleMask () { |
| 192 | + if (this.maskClosable && this.showMask) { | ||
| 174 | this.close(); | 193 | this.close(); |
| 175 | } | 194 | } |
| 176 | }, | 195 | }, |
| 177 | handleWrapClick (event) { | 196 | handleWrapClick (event) { |
| 178 | // use indexOf,do not use === ,because ivu-modal-wrap can have other custom className | 197 | // use indexOf,do not use === ,because ivu-modal-wrap can have other custom className |
| 179 | const className = event.target.getAttribute('class'); | 198 | const className = event.target.getAttribute('class'); |
| 180 | - if (className && className.indexOf(`${prefixCls}-wrap`) > -1) this.mask(); | 199 | + if (className && className.indexOf(`${prefixCls}-wrap`) > -1) this.handleMask(); |
| 181 | }, | 200 | }, |
| 182 | cancel () { | 201 | cancel () { |
| 183 | this.close(); | 202 | this.close(); |
src/styles/components/modal.less
| @@ -39,6 +39,11 @@ | @@ -39,6 +39,11 @@ | ||
| 39 | border: 0; | 39 | border: 0; |
| 40 | border-radius: @border-radius-base; | 40 | border-radius: @border-radius-base; |
| 41 | background-clip: padding-box; | 41 | background-clip: padding-box; |
| 42 | + box-shadow: 0 4px 12px rgba(0,0,0,.15); | ||
| 43 | + | ||
| 44 | + &-no-mask{ | ||
| 45 | + pointer-events: auto; | ||
| 46 | + } | ||
| 42 | } | 47 | } |
| 43 | 48 | ||
| 44 | &-header { | 49 | &-header { |
| @@ -102,6 +107,9 @@ | @@ -102,6 +107,9 @@ | ||
| 102 | bottom: 0; | 107 | bottom: 0; |
| 103 | } | 108 | } |
| 104 | } | 109 | } |
| 110 | + &-no-mask{ | ||
| 111 | + pointer-events: none; | ||
| 112 | + } | ||
| 105 | } | 113 | } |
| 106 | 114 | ||
| 107 | @media (max-width: 768px) { | 115 | @media (max-width: 768px) { |