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