English
Drawer
A floating panel that slides out of the edge of the screen.
Basic usage
Control drawer display and hidden state through v-model
two-way binding. Set the direction
property to control the drawer expansion direction. Default slots inside components accept user-defined content.
<>
<template>
<div>
<kl-button @click="rtl = true">right to left</kl-button>
<kl-button @click="ltr = true">left to right</kl-button>
<kl-button @click="ttb = true">top to bottom</kl-button>
<kl-button @click="btt = true">bottom to top</kl-button>
<kl-drawer v-model="rtl" direction="rtl">
<div class="header">
<button @click="rtl = false"><KlOtherError /></button>
<h3>Basic Drawer</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
<kl-drawer v-model="ltr" direction="ltr">
<div class="header">
<button @click="ltr = false"><KlOtherError /></button>
<h3>Basic Drawer</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
<kl-drawer v-model="ttb" direction="ttb">
<div class="header">
<button @click="ttb = false"><KlOtherError /></button>
<h3>Basic Drawer</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
<kl-drawer v-model="btt" direction="btt">
<div class="header">
<button @click="btt = false"><KlOtherError /></button>
<h3>Basic Drawer</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const rtl = ref(false)
const ltr = ref(false)
const ttb = ref(false)
const btt = ref(false)
</script>
<style lang="scss" scoped>
.header {
display: flex;
padding: 16px 24px;
border-bottom: 1px solid #ddd;
h3 {
white-space: nowrap;
margin: 0 0 0 10px;
padding: 0;
}
}
.content {
padding: 16px 24px;
p {
white-space: nowrap;
}
}
</style>
Drawer size
Set the size
property to customize the drawer size. If size
is passed as a numeric type, the unit is px, and a percentage string is supported. The default is 30%
.
<>
<template>
<div>
<kl-button @click="pt20 = true">20%</kl-button>
<kl-button @click="pt30 = true">30%</kl-button>
<kl-button @click="px200 = true">200px</kl-button>
<kl-button @click="px300 = true">300px</kl-button>
<kl-drawer v-model="pt20" size="20%">
<div class="header">
<button @click="pt20 = false"><KlOtherError /></button>
<h3>Drawer Size</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
<kl-drawer v-model="pt30" size="30%">
<div class="header">
<button @click="pt30 = false"><KlOtherError /></button>
<h3>Drawer Size</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
<kl-drawer v-model="px200" :size="200">
<div class="header">
<button @click="px200 = false"><KlOtherError /></button>
<h3>Drawer Size</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
<kl-drawer v-model="px300" :size="300">
<div class="header">
<button @click="px300 = false"><KlOtherError /></button>
<h3>Drawer Size</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const pt20 = ref(false)
const pt30 = ref(false)
const px200 = ref(false)
const px300 = ref(false)
</script>
<style lang="scss" scoped>
.header {
display: flex;
padding: 16px 24px;
border-bottom: 1px solid #ddd;
h3 {
white-space: nowrap;
margin: 0 0 0 10px;
padding: 0;
}
}
.content {
padding: 16px 24px;
p {
white-space: nowrap;
}
}
</style>
Set mask layer z-index
With the z-index
property, you can change the level of the mask layer. Note: Drawer level = Mask level + 1
. For example: If z-index = 299, then mask level = 299, drawer level = 300
. The default value is 1000
.
z-index: 300
<>
<template>
<div>
<div class="box">z-index: 300</div>
<kl-button @click="drawer299 = true">z-index: 299</kl-button>
<kl-button @click="drawer301 = true">z-index: 301</kl-button>
<kl-drawer v-model="drawer299" :z-index="299">
<div class="header">
<button @click="drawer299 = false"><KlOtherError /></button>
<h3>Drawer Tier</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
<kl-drawer v-model="drawer301" :z-index="301">
<div class="header">
<button @click="drawer301 = false"><KlOtherError /></button>
<h3>Drawer Tier</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const drawer299 = ref(false)
const drawer301 = ref(false)
</script>
<style lang="scss" scoped>
.box {
position: relative;
box-sizing: border-box;
width: 120px;
height: 120px;
margin: 10px;
padding: 10px;
background-color: #67c23a;
color: #fff;
z-index: 300;
}
.header {
display: flex;
padding: 16px 24px;
border-bottom: 1px solid #ddd;
h3 {
white-space: nowrap;
margin: 0 0 0 10px;
padding: 0;
}
}
.content {
padding: 16px 24px;
p {
white-space: nowrap;
}
}
</style>
Whether to lock the scroll bar
By setting the lock-scroll
property, you can decide whether to lock the scroll bar according to your own requirements. If you lock the scroll bar, you need to handle the page jitter problem caused by the scroll bar switching between display and hide. The default is true
.
<>
<template>
<div>
<kl-button @click="lock = true">锁定滚动条</kl-button>
<kl-button @click="unlock = true">不锁定滚动条</kl-button>
<kl-drawer v-model="lock" :lock-scroll="true">
<div class="header">
<button @click="lock = false"><KlOtherError /></button>
<h3>Lock Scroll</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
<kl-drawer v-model="unlock" :lock-scroll="false">
<div class="header">
<button @click="unlock = false"><KlOtherError /></button>
<h3>Unlock Scroll</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const lock = ref(false)
const unlock = ref(false)
</script>
<style lang="scss" scoped>
.header {
display: flex;
padding: 16px 24px;
border-bottom: 1px solid #ddd;
h3 {
white-space: nowrap;
margin: 0 0 0 10px;
padding: 0;
}
}
.content {
padding: 16px 24px;
p {
white-space: nowrap;
}
}
</style>
Custom mask layer with drawer styles
By setting the modal-class
and drawer-class
properties, you can customize the styles of masks and drawers.
Note: To make a custom class name work, you need to use the :deep
depth selector
<>
<template>
<div>
<kl-button @click="drawer = true">自定义样式</kl-button>
<kl-drawer v-model="drawer" modal-class="modalClass" drawer-class="drawerClass">
<div class="header">
<button @click="drawer = false"><KlOtherError /></button>
<h3>Custom Class</h3>
</div>
<div class="content">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</div>
</kl-drawer>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const drawer = ref(false)
</script>
<style lang="scss" scoped>
:deep(.modalClass) {
background-color: rgba(255, 0, 0, 0.4);
}
:deep(.drawerClass) {
background-color: #000;
color: #fff;
}
.header {
display: flex;
padding: 16px 24px;
border-bottom: 1px solid #ddd;
h3 {
white-space: nowrap;
margin: 0 0 0 10px;
padding: 0;
}
}
.content {
padding: 16px 24px;
p {
white-space: nowrap;
}
}
</style>
API
Attribute
name | description | type | default value | required |
---|---|---|---|---|
model-value / v-model | Show drawer or not | boolean | yes | |
size | The size of the drawer form, in pixels when using type number and x% when using type string | number/string | '30%' | no |
direction | The direction the drawer opens | rtl / ltr / ttb / btt | rtl | no |
modal | Whether a mask is required | boolean | true | no |
lock-scroll | Whether to scroll lock the body when the drawer appears | boolean | true | no |
modal-class | The custom class name of the mask layer | string | no | |
drawer-class | The custom class name of the drawer | string | no | |
close-esc | Can you close the drawer by pressing ESC | boolean | true | no |
z-index | Set the z-index of the mask layer, z-index of the drawer = z-index of the mask layer + 1 | number | 1000 | no |
Slot
name | description |
---|---|
default | Contents of drawer |