77 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | ||
|  |   <div | ||
|  |     class="md-switch" | ||
|  |     :class="[ | ||
|  |       disabled ? 'disabled' : '', | ||
|  |       value ? 'active' : '']" | ||
|  |     @click="$_onChange($event)"> | ||
|  |   </div> | ||
|  | </template> | ||
|  | 
 | ||
|  | <script>
export default { | ||
|  |   name: 'md-switch', | ||
|  | 
 | ||
|  |   props: { | ||
|  |     value: { | ||
|  |       type: Boolean, | ||
|  |       default: false, | ||
|  |     }, | ||
|  |     disabled: { | ||
|  |       type: Boolean, | ||
|  |       default: false, | ||
|  |     }, | ||
|  |   }, | ||
|  | 
 | ||
|  |   data() { | ||
|  |     return {} | ||
|  |   }, | ||
|  | 
 | ||
|  |   methods: { | ||
|  |     // MARK: events handler, 如 $_onButtonClick
 | ||
|  |     $_onChange(event) { | ||
|  |       if (this.disabled) { | ||
|  |         return | ||
|  |       } | ||
|  |       this.$emit('input', !this.value) | ||
|  |       this.$emit('change', event) | ||
|  |     }, | ||
|  |   }, | ||
|  | } | ||
|  | 
</script> | ||
|  | 
 | ||
|  | <style lang="stylus"> | ||
|  | .md-switch | ||
|  |   box-sizing border-box | ||
|  |   position relative | ||
|  |   width 80px | ||
|  |   height 48px | ||
|  |   border-radius 48px | ||
|  |   background-color switch-fill-inverse | ||
|  |   &.disabled | ||
|  |     opacity switch-item-color-disabled | ||
|  |   &::before, &::after | ||
|  |     content "" | ||
|  |     position absolute | ||
|  |     transition transform .3s | ||
|  |   &::before | ||
|  |     top 0 | ||
|  |     left 0 | ||
|  |     width 80px | ||
|  |     height 48px | ||
|  |     border-radius 24px | ||
|  |     background-color switch-fill-inverse | ||
|  |   &::after | ||
|  |     top 4px | ||
|  |     left 4px | ||
|  |     width 40px | ||
|  |     height 40px | ||
|  |     background-color switch-handle-color | ||
|  |     border-radius 50% | ||
|  |   &.active | ||
|  |     background-color switch-fill | ||
|  |   &.active::before | ||
|  |       transform scale(0) | ||
|  |   &.active::after | ||
|  |       transform translateX(32px) | ||
|  | </style> |