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 | 1 | <template> |
| 2 | 2 | <div> |
| 3 | 3 | <Button type="primary" @click="modal1 = true">Display dialog box</Button> |
| 4 | + <Button @click="hc">Click Me</Button> | |
| 4 | 5 | <Modal |
| 5 | 6 | v-model="modal1" |
| 6 | - :fullscreen="true" | |
| 7 | - footerHide | |
| 7 | + title="Common Modal dialog box title" | |
| 8 | + :mask="false" | |
| 8 | 9 | @on-ok="ok" |
| 9 | 10 | @on-cancel="cancel"> |
| 10 | - <p>Content of dialog1111</p> | |
| 11 | 11 | <p>Content of dialog</p> |
| 12 | 12 | <p>Content of dialog</p> |
| 13 | 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 | 14 | </Modal> |
| 68 | 15 | </div> |
| 69 | 16 | </template> |
| ... | ... | @@ -80,6 +27,9 @@ |
| 80 | 27 | }, |
| 81 | 28 | cancel () { |
| 82 | 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 | 1 | <template> |
| 2 | 2 | <div v-transfer-dom :data-transfer="transfer"> |
| 3 | 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 | 5 | </transition> |
| 6 | 6 | <div :class="wrapClasses" @click="handleWrapClick"> |
| 7 | 7 | <transition :name="transitionNames[0]" @after-leave="animationFinish"> |
| 8 | 8 | <div :class="classes" :style="mainStyles" v-show="visible"> |
| 9 | - <div :class="[prefixCls + '-content']"> | |
| 9 | + <div :class="contentClasses"> | |
| 10 | 10 | <a :class="[prefixCls + '-close']" v-if="closable" @click="close"> |
| 11 | 11 | <slot name="close"> |
| 12 | 12 | <Icon type="ios-close"></Icon> |
| ... | ... | @@ -99,6 +99,14 @@ |
| 99 | 99 | fullscreen: { |
| 100 | 100 | type: Boolean, |
| 101 | 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 | 112 | data () { |
| ... | ... | @@ -116,7 +124,8 @@ |
| 116 | 124 | `${prefixCls}-wrap`, |
| 117 | 125 | { |
| 118 | 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 | 139 | [`${prefixCls}-fullscreen`]: this.fullscreen, |
| 131 | 140 | [`${prefixCls}-fullscreen-no-header`]: this.fullscreen && !this.showHead, |
| 132 | 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 | 177 | } else { |
| 162 | 178 | return this.cancelText; |
| 163 | 179 | } |
| 180 | + }, | |
| 181 | + showMask () { | |
| 182 | + return this.dragable ? false : this.mask; | |
| 164 | 183 | } |
| 165 | 184 | }, |
| 166 | 185 | methods: { |
| ... | ... | @@ -169,15 +188,15 @@ |
| 169 | 188 | this.$emit('input', false); |
| 170 | 189 | this.$emit('on-cancel'); |
| 171 | 190 | }, |
| 172 | - mask () { | |
| 173 | - if (this.maskClosable) { | |
| 191 | + handleMask () { | |
| 192 | + if (this.maskClosable && this.showMask) { | |
| 174 | 193 | this.close(); |
| 175 | 194 | } |
| 176 | 195 | }, |
| 177 | 196 | handleWrapClick (event) { |
| 178 | 197 | // use indexOf,do not use === ,because ivu-modal-wrap can have other custom className |
| 179 | 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 | 201 | cancel () { |
| 183 | 202 | this.close(); | ... | ... |
src/styles/components/modal.less
| ... | ... | @@ -39,6 +39,11 @@ |
| 39 | 39 | border: 0; |
| 40 | 40 | border-radius: @border-radius-base; |
| 41 | 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 | 49 | &-header { |
| ... | ... | @@ -102,6 +107,9 @@ |
| 102 | 107 | bottom: 0; |
| 103 | 108 | } |
| 104 | 109 | } |
| 110 | + &-no-mask{ | |
| 111 | + pointer-events: none; | |
| 112 | + } | |
| 105 | 113 | } |
| 106 | 114 | |
| 107 | 115 | @media (max-width: 768px) { | ... | ... |