You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							142 lines
						
					
					
						
							2.6 KiB
						
					
					
				
			
		
		
	
	
							142 lines
						
					
					
						
							2.6 KiB
						
					
					
				| <template> | |
|   <div > | |
|     <div :class="['mask', visible ? 'open' : 'close']" @click="close"></div> | |
|     <div :class="['drawer', placement, visible ? 'open' : 'close']"> | |
|       <div ref="drawer" class="content beauty-scroll"> | |
|         <slot></slot> | |
|       </div> | |
|       <div v-if="showHandler" :class="['handler-container', placement, visible ? 'open' : 'close']" ref="handler" @click="toggle"> | |
|         <slot v-if="$slots.handler" name="handler"></slot> | |
|         <div v-else class="handler"> | |
|           <a-icon :type="visible ? 'close'  : 'bars'" /> | |
|         </div> | |
|       </div> | |
|     </div> | |
|   </div> | |
| </template> | |
| 
 | |
| <script> | |
| export default { | |
|   name: 'Drawer', | |
|   data () { | |
|     return { | |
|     } | |
|   }, | |
|   model: { | |
|     prop: 'visible', | |
|     event: 'change' | |
|   }, | |
|   props: { | |
|     visible: { | |
|       type: Boolean, | |
|       required: false, | |
|       default: false | |
|     }, | |
|     placement: { | |
|       type: String, | |
|       required: false, | |
|       default: 'left' | |
|     }, | |
|     showHandler: { | |
|       type: Boolean, | |
|       required: false, | |
|       default: true | |
|     } | |
|   }, | |
|   methods: { | |
|     open () { | |
|       this.$emit('change', true) | |
|     }, | |
|     close () { | |
|       this.$emit('change', false) | |
|     }, | |
|     toggle () { | |
|       this.$emit('change', !this.visible) | |
|     } | |
|   } | |
| } | |
| </script> | |
| 
 | |
| <style lang="less" scoped> | |
|   .mask{ | |
|     position: fixed; | |
|     left: 0; | |
|     right: 0; | |
|     bottom: 0; | |
|     top: 0; | |
|     background-color: @shadow-color; | |
|     transition: all 0.5s; | |
|     z-index: 100; | |
|     &.open{ | |
|       display: inline-block; | |
|     } | |
|     &.close{ | |
|       display: none; | |
|     } | |
|   } | |
|   .drawer{ | |
|     position: fixed; | |
|     transition: all 0.5s; | |
|     height: 100vh; | |
|     z-index: 100; | |
|     &.left{ | |
|       left: 0px; | |
|       &.open{ | |
|         .content{ | |
|           box-shadow: 2px 0 8px @shadow-color; | |
|         } | |
|       } | |
|       &.close{ | |
|         transform: translateX(-100%); | |
|       } | |
|     } | |
|     &.right{ | |
|       right: 0px; | |
|       .content{ | |
|         float: right; | |
|       } | |
|       &.open{ | |
|         .content{ | |
|           box-shadow: -2px 0 8px @shadow-color; | |
|         } | |
|       } | |
|       &.close{ | |
|         transform: translateX(100%); | |
|       } | |
|     } | |
|   } | |
|   .content{ | |
|     display: inline-block; | |
|     height: 100vh; | |
|     overflow-y: auto; | |
|   } | |
|   .handler-container{ | |
|     position: absolute; | |
|     display: inline-block; | |
|     text-align: center; | |
|     transition: all 0.5s; | |
|     cursor: pointer; | |
|     top: 200px; | |
|     z-index: 100; | |
|     .handler { | |
|       height: 40px; | |
|       width: 40px; | |
|       background-color: @base-bg-color; | |
|       font-size: 26px; | |
|       box-shadow: 0 2px 8px @shadow-color; | |
|       line-height: 40px; | |
|     } | |
|     &.left{ | |
|       right: -40px; | |
|       .handler{ | |
|         border-radius: 0 5px 5px 0; | |
|       } | |
|     } | |
|     &.right{ | |
|       left: -40px; | |
|       .handler{ | |
|         border-radius: 5px 0 0 5px; | |
|       } | |
|     } | |
|   } | |
| </style>
 | |
| 
 |