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>
 |