Custom context in Vue Sidebar component
21 Dec 202411 minutes to read
Sidebar has a flexible option to initialize and target any HTML element alongside the main content of a web page.
By default, Sidebar initializes target to the body element. Using the target property, you can set a target element to initialize the Sidebar inside any HTML element apart from the body element.
If required ,
zIndex
can be set when the sidebar acts as an overlay type.
<template>
<div id="app">
<ejs-sidebar id="default-sidebar" ref="sidebar" :type="type" :target="target">
<div class="title"> Sidebar content</div>
<div class="sub-title">
Click the button to close the Sidebar.
</div>
<div class="center-align">
<button ejs-button id="close" v-on:click="closeClick" class="e-btn close-btn">Close Sidebar</button>
</div>
</ejs-sidebar>
<div id="head">
<ejs-button id="toggle" ref="togglebtn" cssClass="e-flat" iconCss="e-icons e-menu" isToggle="true" v-on:click="btnClick">Open</ejs-button>
</div>
<div>
<div id="maincontent" class="content">
<div>
<div class="title">Main content</div>
<div class="center-align">
content goes here.
</div>
</div>
</div>
</div>
</div>
<!--end of main content declaration -->
</template>
<script setup>
import { SidebarComponent as EjsSidebar } from '@syncfusion/ej2-vue-navigations';
import { ButtonComponent as EjsButton } from '@syncfusion/ej2-vue-buttons';
import { enableRipple } from '@syncfusion/ej2-base';
import { ref } from 'vue';
enableRipple(true);
const sidebar = ref(null);
const togglebtn = ref(null);
const type = 'Push';
const target = '.content';
const btnClick = () => {
if (togglebtn.value.$el.classList.contains('e-active')) {
togglebtn.value.Content = 'Open';
sidebar.value.hide();
}
else {
togglebtn.value.Content = 'Close';
sidebar.value.show();
}
};
const closeClick = () => {
sidebar.value.hide();
togglebtn.value.$el.classList.remove('e-active');
togglebtn.value.Content = 'Open';
};
</script>
<style>
@import "../node_modules/@syncfusion/ej2-base/styles/material.css";
@import "../node_modules/@syncfusion/ej2-buttons/styles/material.css";
@import "../node_modules/@syncfusion/ej2-vue-navigations/styles/material.css";
.center-align {
text-align: center;
padding: 20px;
}
.title {
text-align: center;
font-size: 20px;
padding: 15px;
}
#head {
border: 1px solid #424242;
border-bottom-color: transparent;
background: #00897b;
}
#toggle {
/*csslintallow:adjoining-classes*/
background: #00695c;
box-shadow: none;
border-radius: 0;
height: 39px;
width: 100px;
}
#close {
/* csslint allow: adjoining-classes*/
background: #fafafa;
color: black;
}
.sub-title {
text-align: center;
font-size: 16px;
padding: 10px;
}
#default-sidebar {
background-color: #26a69a;
color: #ffffff;
}
.content {
height: 305px;
border: 1px solid grey;
}
#toggle {
color: white;
}
</style>
<template>
<div id="app">
<ejs-sidebar id="default-sidebar" ref="sidebar" :type="type" :target="target">
<div class="title"> Sidebar content</div>
<div class="sub-title">
Click the button to close the Sidebar.
</div>
<div class="center-align">
<button ejs-button id="close" v-on:click="closeClick" class="e-btn close-btn">Close Sidebar</button>
</div>
</ejs-sidebar>
<div id="head">
<ejs-button id="toggle" ref="togglebtn" cssClass="e-flat" iconCss="e-icons e-menu" isToggle="true" v-on:click.native="btnClick">Open</ejs-button>
</div>
<div>
<div id="maincontent" class="content">
<div>
<div class="title">Main content</div>
<div class="center-align">
content goes here.
</div>
</div>
</div>
</div>
</div>
<!--end of main content declaration -->
</template>
<script>
import { SidebarComponent } from '@syncfusion/ej2-vue-navigations';
import { ButtonComponent } from '@syncfusion/ej2-vue-buttons';
import { enableRipple } from '@syncfusion/ej2-base';
enableRipple(true);
export default {
name: "App",
components: {
"ejs-sidebar": SidebarComponent,
"ejs-button": ButtonComponent
},
data() {
return {
type: 'Push',
target: '.content'
}
},
methods: {
btnClick: function () {
if (this.$refs.togglebtn.$el.classList.contains('e-active')) {
this.$refs.togglebtn.Content = 'Open';
this.$refs.sidebar.hide();
}
else {
this.$refs.togglebtn.Content = 'Close';
this.$refs.sidebar.show();
}
},
closeClick: function () {
this.$refs.sidebar.hide();
this.$refs.togglebtn.$el.classList.remove('e-active');
this.$refs.togglebtn.Content = 'Open';
}
}
}
</script>
<style>
@import "../node_modules/@syncfusion/ej2-base/styles/material.css";
@import "../node_modules/@syncfusion/ej2-buttons/styles/material.css";
@import "../node_modules/@syncfusion/ej2-vue-navigations/styles/material.css";
.center-align {
text-align: center;
padding: 20px;
}
.title {
text-align: center;
font-size: 20px;
padding: 15px;
}
#head {
border: 1px solid #424242;
border-bottom-color: transparent;
background: #00897b;
}
#toggle {
/*csslintallow:adjoining-classes*/
background: #00695c;
box-shadow: none;
border-radius: 0;
height: 39px;
width: 100px;
}
#close {
/* csslint allow: adjoining-classes*/
background: #fafafa;
color: black;
}
.sub-title {
text-align: center;
font-size: 16px;
padding: 10px;
}
#default-sidebar {
background-color: #26a69a;
color: #ffffff;
}
.content {
height: 305px;
border: 1px solid grey;
}
#toggle {
color: white;
}
</style>