feat: add right side support
| | |
| | | <div > |
| | | <div :class="['mask', openDrawer ? 'open' : 'close']" @click="close"></div> |
| | | <div :class="['drawer', placement, openDrawer ? 'open' : 'close']"> |
| | | <div style="position: relative; height: 100%"> |
| | | <div ref="drawer" style="position: relative; height: 100%;"> |
| | | <slot></slot> |
| | | </div> |
| | | <div class="button" @click="handle"> |
| | | <a-icon type="bars" /> |
| | | <div v-if="showHandler" :class="['handler-container', placement]" ref="handler" @click="handle"> |
| | | <slot v-if="$slots.handler" name="handler"></slot> |
| | | <div v-else class="handler"> |
| | | <a-icon :type="openDrawer ? 'close' : 'bars'" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | export default { |
| | | name: 'Drawer', |
| | | components: {AIcon}, |
| | | data () { |
| | | return { |
| | | drawerWidth: 0 |
| | | } |
| | | }, |
| | | props: { |
| | | openDrawer: { |
| | | type: Boolean, |
| | |
| | | type: String, |
| | | required: false, |
| | | default: 'left' |
| | | }, |
| | | showHandler: { |
| | | type: Boolean, |
| | | required: false, |
| | | default: true |
| | | } |
| | | }, |
| | | mounted () { |
| | | this.drawerWidth = this.getDrawerWidth() |
| | | }, |
| | | watch: { |
| | | 'drawerWidth': function (val) { |
| | | if (this.placement === 'left') { |
| | | this.$refs.handler.style.left = val + 'px' |
| | | } else { |
| | | this.$refs.handler.style.right = val + 'px' |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | |
| | | }, |
| | | handle () { |
| | | this.$emit('change', !this.openDrawer) |
| | | }, |
| | | getDrawerWidth () { |
| | | return this.$refs.drawer.clientWidth |
| | | } |
| | | } |
| | | } |
| | |
| | | transition: all 0.5s; |
| | | z-index: 100; |
| | | &.left{ |
| | | left: 0px; |
| | | &.open{ |
| | | box-shadow: 2px 0 8px rgba(0,0,0,.15); |
| | | } |
| | | &.close{ |
| | | transform: translateX(-100%); |
| | | } |
| | | } |
| | | &.right{ |
| | | right: 0px; |
| | | &.open{ |
| | | right: 0; |
| | | box-shadow: -2px 0 8px rgba(0,0,0,.15); |
| | | } |
| | | &.close{ |
| | | right: -100%; |
| | | transform: translateX(100%); |
| | | } |
| | | } |
| | | .sider{ |
| | | height: 100%; |
| | | } |
| | | } |
| | | .button{ |
| | | height: 40px; |
| | | width: 40px; |
| | | background-color: #fff; |
| | | border-radius: 0 5px 5px 0; |
| | | .handler-container{ |
| | | position: fixed; |
| | | left: 256px; |
| | | top: 200px; |
| | | z-index: 100; |
| | | font-size: 26px; |
| | | box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15); |
| | | text-align: center; |
| | | line-height: 40px; |
| | | transition: all 0.5s; |
| | | .handler{ |
| | | height: 40px; |
| | | width: 40px; |
| | | background-color: #fff; |
| | | z-index: 100; |
| | | font-size: 26px; |
| | | box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15); |
| | | line-height: 40px; |
| | | } |
| | | &.left{ |
| | | .handler{ |
| | | border-radius: 0 5px 5px 0; |
| | | } |
| | | } |
| | | &.right{ |
| | | .handler{ |
| | | border-radius: 5px 0 0 5px; |
| | | } |
| | | } |
| | | } |
| | | </style> |